私は抽象クラスABCのためにshared_ptrを使用します。 ABCImplクラスはABCの実装です。 abc_ptrはshared_ptrである< ABC>はABCImplオブジェクトを指しています。呼び出し元関数では、abc_ptrはABCクラスのメンバ関数(func_in_ABC)の1つを呼び出します。コンパイルは成功です。しかし、nmやobjdumpを使うと、abc_ptrのシンボルしか見ることができませんでした。呼び出し元関数にfunc_in_ABC()のシンボルは表示されません。shared_ptrを抽象クラスに使用しているときにnmまたはobjdumpで関数シンボルを見つける方法は?
発信者機能でfunc_in_ABC()のシンボルが表示される理由、またはその出力を知る方法は誰でも知っていますか?次のように
コードは次のとおりABC.hで :ABCImpl.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.cppで
#include "ABC.h"
class ABCImpl : public
{
public:
ABCImpl() {}
void func_in_ABC(const int param);
private:
int data;
};
:
#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);
}
1nmからD.o用出力:
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のためのコンパイルが失敗します。 D.oをコンパイルするときにクラスABCの定義をチェックすると思います。しかし、なぜ私はABCの定義にマップするために発信者のシンボルを見つけることができないのですか?
どのようにしてその機能の仮想テーブルのオフセットを取得できますか?そして、オフセットをABCまたはABCImplのfunc_in_ABCにどのようにマップできますか? – Jimmy
@ジミー:あなたはする必要はありません。コンパイラがそれを処理します。 [仮想メンバー関数と非仮想メンバー関数がどのように呼び出されるかの違いは何ですか?](http://www.parashift.com/c++-faq-lite/virtual-functions.html#faq -20.3)。 –
ありがとうございます。私はコンパイラがそれを処理することを知っています。しかし、コンパイラのように、func_in_ABCをv-tableマップのポインタとして知らせるためにオフセットを取得する方法を知りたい。または私はポインタ/オフセット情報を得ることができる任意のコマンド?私はコンパイラを作る必要はありませんが、コンパイルされたオブジェクトからの依存関係/リンク情報を知りたいのです。 – Jimmy