Как найти символ функции в nm или objdump при использовании shared_ptr для абстрактного класса? - PullRequest
2 голосов
/ 24 июля 2011

Я использую shared_ptr для абстрактного класса ABC.Класс ABCImpl является реализацией ABC.abc_ptr - это shared_ptr , указывающий на объекты ABCImpl.В вызывающей функции abc_ptr вызовет одну из функций-членов (func_in_ABC) в классе 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);
}

Вывод для Do из 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 Но почему я не могу найти символ в вызывающей программе для сопоставления с определением в ABC?

1 Ответ

2 голосов
/ 24 июля 2011

Поскольку func_in_ABC - это виртуальная функция, вам не нужно имя символа для ее вызова.Вам просто нужно смещение в виртуальной таблице для этой конкретной виртуальной функции.

Если вы сделаете func_in_ABC не виртуальным, вы должны увидеть символ, показанный в выводе nm.

...