¿Cómo encontrar el símbolo de función en NM u Objdump cuando se usa Shared_PTR para la clase abstracta?

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

Pregunta

Utilizo shared_ptr para una clase abstracta ABC. La clase ABCIMPL es la implementación de ABC. ABC_PTR es un compartir_ptr <BC> apunta a un objeto ABCIMPL. En la función de llamadas, ABC_PTR llamará a una de la función miembro (func_in_abc) en la clase ABC. La compilación es exitosa. Pero cuando uso nm u objdump, solo pude ver el símbolo de ABC_PTR. No se muestra un símbolo para func_in_abc () en la función de llamadas.

¿Alguien sabe por qué o cómo obtengo la salida del símbolo para func_in_abc () en la función de llamadas?

El código es el siguiente: en 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();

En abcimpl.h:

#include "ABC.h"

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

En abcimpl.cpp:

#include "ABCImpl.h"

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

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

En la función de llamadas D.CPP:

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

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

La salida para do de 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

Si cambio la definición de func_in_abc en ABC.H, la compilación para D.CPP fallará. Creo que verificará la definición de clase ABC al compilar, pero ¿por qué no puedo encontrar el símbolo en la persona que llama para asignar a la definición en ABC?

¿Fue útil?

Solución

Ya que func_in_ABC es una función virtual, en realidad no necesita el nombre del símbolo para llamarlo. Solo necesita el desplazamiento en la tabla virtual para esa función virtual específica.

Si tu haces func_in_ABC No virtual, deberías ver el símbolo aparecer en el nm producción.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top