Как найти символ функции в NM или objdump при использовании shared_ptr для абстрактного класса?

StackOverflow https://stackoverflow.com/questions/6805923

Вопрос

Я использую 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 выход.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top