Как найти символ функции в NM или objdump при использовании shared_ptr для абстрактного класса?
-
25-10-2019 - |
Вопрос
Я использую shared_ptr для абстрактного класса ABC. Класс ABCIMPL - это реализация ABC. ABC_PTR - это SHARED_PTR <Abc> указывает на объекты ABCIMPL. В функции Caller ABC_PTR позвонит одной из функции члена (func_in_abc) в классе ABC. Компиляция успешна. Но когда я использую NM или objdump, я мог видеть только символ только для ABC_PTR. В функции вызывающего абонента не отображается символ.
Кто -нибудь знает, почему, или как я получаю выход для символа для 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
Если я изменю определение func_in_abc в ABC.H, компиляция для D.CPP потерпит неудачу. Я думаю, что он проверит определение класса ABC при компиляции DO, но почему я не могу найти символ в Caller, чтобы отобразить определение в ABC?
Решение
С func_in_ABC
это виртуальная функция, вам на самом деле не нужно имя символа, чтобы назвать его. Вам просто нужно смещение в виртуальную таблицу для этой конкретной виртуальной функции.
Если вы сделаете func_in_ABC
не виртуально, вы должны увидеть символ, появляющийся в nm
выход.