抽象クラスにshared_ptrを使用する場合、nmまたはobjdumpで関数シンボルを見つける方法は?
-
25-10-2019 - |
質問
抽象クラス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
出力。
所属していません StackOverflow