Come trovare il simbolo della funzione in objdump nm o quando si utilizza shared_ptr per la classe astratta?

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

Domanda

Io uso shared_ptr per una classe astratta di ABC. Classe ABCImpl è l'implementazione di ABC. abc_ptr è un shared_ptr punta a un oggetti ABCImpl. In funzione chiamante, abc_ptr chiamerà uno dei funzione membro (func_in_ABC) in classe ABC. La compilazione è successo. Ma quando uso nm o objdump, ho potuto vedere solo il simbolo per abc_ptr. Non v'è nessun simbolo visualizzato per func_in_ABC () nella funzione chiamante.

Chiunque sa perché, né come un io ottenere l'output per il simbolo per func_in_ABC () nella funzione chiamante?

Il codice è il seguente: In 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();

In ABCImpl.h:

#include "ABC.h"

class ABCImpl : public 
{
    public:
        ABCImpl() {}
        void func_in_ABC(const int param);
    private:
        int data;
};

In ABCImpl.cpp:

#include "ABCImpl.h"

ABCPtr get_ABC_ptr()
{
        return ABCPtr(new ABCImpl());
}

void ABCImpl::func_in_ABC(const int param)
{
    data = param;
}

In funzione chiamante D.cpp:

#include "D.h"
#include "ABC.h"

void D::call_ABC()
{
    ABCPtr abc_ptr = get_ABC_ptr();
    abc_ptr->func_in_ABC(100);
}

L'uscita D.o da 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

Se cambio la definizione di func_in_ABC nel ABC.h, la compilation per D.cpp fallirà. Penso che controllerà la definizione di classe ABC durante la compilazione D.O. Ma perché non riesco a trovare il simbolo al chiamante di mappare la definizione di cui ABC?

È stato utile?

Soluzione

Dato func_in_ABC è una funzione virtuale, in realtà non è necessario il nome del simbolo di chiamarlo. Hai solo bisogno l'offset nella tabella virtuale per quella specifica funzione virtuale.

Se si effettua func_in_ABC non virtuale, si dovrebbe vedere il simbolo compare nell'output nm.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top