Come trovare il simbolo della funzione in objdump nm o quando si utilizza shared_ptr per la classe astratta?
-
25-10-2019 - |
Domanda
Io uso shared_ptr per una classe astratta di ABC. Classe ABCImpl è l'implementazione di ABC. abc_ptr è un shared_ptr
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?
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
.