抽象クラスにshared_ptrを使用する場合、nmまたはobjdumpで関数シンボルを見つける方法は?

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

質問

抽象クラスABCには、shared_ptrを使用します。 ABCIMPLクラスはABCの実装です。 ABC_PTRは、ABCIMPLオブジェクトにポイントを担当するShared_Ptr <ABC>です。発信者関数では、ABC_PTRはABCクラスのメンバー関数(FUNC_IN_ABC)の1つを呼び出します。コンパイルは成功しました。しかし、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);
}

NMからのDOの出力:

         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

abc.hのfunc_in_abcの定義を変更すると、d.cppのコンピレーションが失敗します。コンパイル時にクラスABCの定義を確認すると思いますが、なぜ発信者にシンボルを見つけることができないのはなぜABCの定義にマッピングされますか?

役に立ちましたか?

解決

以来 func_in_ABC 仮想関数ですが、実際にそれを呼び出すためにシンボル名は必要ありません。その特定の仮想関数のために、仮想テーブルへのオフセットが必要です。

あなたが作ったら func_in_ABC 非仮想的な、あなたはシンボルがに表示されるのを見るはずです nm 出力。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top