在将共享_ptr用于抽象类中时,如何在nm或objdump中找到函数符号?
-
25-10-2019 - |
题
我将shared_ptr用于抽象类ABC。 ABCIMPL类是ABC的实施。 abc_ptr是共享_ptr <abc>指向ABCIMPL对象。在呼叫者函数中,ABC_PTR将在ABC类中调用成员函数之一(func_in_abc)。编译成功。但是,当我使用nm或objdump时,我只能看到abc_ptr的符号。呼叫者函数中的func_in_abc()没有显示符号。
任何人都知道为什么,或者我如何获得呼叫者函数中func_in_abc()符号的输出?
代码如下:在ABC.H中:
#include <boost/shared_ptr.hpp>
class ABC
{
public:
virtual void func_in_ABC(const int param) = 0;
};
typedef boost::shared_ptr<ABC> ABCPtr;
ABCPtr get_ABC_ptr();
在abcimpl.h中:
#include "ABC.h"
class ABCImpl : public
{
public:
ABCImpl() {}
void func_in_ABC(const int param);
private:
int data;
};
在abcimpl.cpp中:
#include "ABCImpl.h"
ABCPtr get_ABC_ptr()
{
return ABCPtr(new ABCImpl());
}
void ABCImpl::func_in_ABC(const int param)
{
data = param;
}
在呼叫者功能d.cpp中:
#include "D.h"
#include "ABC.h"
void D::call_ABC()
{
ABCPtr abc_ptr = get_ABC_ptr();
abc_ptr->func_in_ABC(100);
}
NM的输出:
U _Unwind_Resume
U get_ABC_ptr()
0000000000000000 T D::call_ABC()
0000000000000000 W boost::shared_ptr<ABC>::operator->() const
0000000000000000 r boost::shared_ptr<ABC>::operator->() const::__PRETTY_FUNCTION__
U __assert_fail
U __gxx_personality_v0
如果我更改abc.h中func_in_abc的定义,则D.CPP的汇编将失败。我认为它会在编译时检查ABC类的定义,但是为什么我找不到呼叫者的符号来映射到ABC中的定义?
解决方案
自从 func_in_ABC
是一个虚拟函数,实际上您不需要符号名称来调用它。您只需要在该特定虚拟函数的虚拟表中偏移即可。
如果你做 func_in_ABC
非虚拟的,您应该看到该符号显示在 nm
输出。
不隶属于 StackOverflow