Wie finde ich das Funktionsymbol in NM oder Objdump bei Verwendung von Shared_ptr für die abstrakte Klasse?

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

Frage

Ich verwende Shared_ptr für eine abstrakte Klasse ABC. ABCIMPL -Klasse ist die Implementierung von ABC. ABC_PTR ist ein Shared_Ptr <ABC> zeigt auf ABCIMPL -Objekte. In der Anruferfunktion wird ABC_PTR eine der Mitgliedsfunktion (func_in_abc) in der ABC -Klasse aufrufen. Das Kompilieren ist erfolgreich. Aber wenn ich NM oder Objdump verwende, konnte ich nur das Symbol für ABC_PTR sehen. In der Anruferfunktion wird kein Symbol für func_in_abc () angezeigt.

Weiß jemand warum oder wie ein ich die Ausgabe für das Symbol für func_in_abc () in der Anruferfunktion bekomme?

Der Code ist wie folgt: 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 der Anruferfunktion D.CPP:

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

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

Die Ausgabe für DO von 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

Wenn ich die Definition von func_in_abc in ABC.H ändere, fehlschlägt die Zusammenstellung für D.CPP. Ich denke, es wird die Definition der Klasse ABC beim Kompilieren überprüfen, aber warum kann ich das Symbol bei Caller nicht finden, um der Definition in ABC zuzuordnen?

War es hilfreich?

Lösung

Seit func_in_ABC Ist eine virtuelle Funktion, benötigen Sie den Symbolnamen nicht, um ihn aufzurufen. Sie benötigen nur den Offset in die virtuelle Tabelle für diese bestimmte virtuelle Funktion.

Wenn du machst func_in_ABC Nicht virtuell, Sie sollten sehen, dass das Symbol in der angezeigt wird nm Ausgang.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top