26

いくつかの C++ テンプレート関数のインスタンス化を含む C++ オブジェクト ファイルがあります。問題のオブジェクト ファイルは、テンプレート パラメーターのいくつかの異なる組み合わせに対して同じ関数をインスタンス化します。問題をデバッグしようとしていて、テンプレート関数の特定のインスタンス化の逆アセンブリを調べたい (つまり、調べたい関数のテンプレート パラメーターを知っている)。私は通常objdump、オブジェクト ファイルを逆アセンブルするためにこれを行いますが、(少なくとも既定では) C++ 関数名をデマングルすることはできません。これを行う方法はありますか?オブジェクト ファイルは、gcc 4.6.1 を使用して作成されました。

4

2 に答える 2

29

objdump -C

-Cフラグはデマングリングを有効にします。

printf '
template<typename T>
T add(T x, T y) {
    return x + y;
}

void h() {
    add(1, 2);
    add(1.0, 2.0);
}
' > a.cpp
g++ -g -std=c++11 a.cpp
objdump -CS a.out

出力には、デマングルされた名前が含まれています。

int main() {
    add(1, 2);
 60c:   e8 28 00 00 00          callq  639 <int add<int>(int, int)>
    add(1.0, 2.0);
 62d:   e8 1b 00 00 00          callq  64d <double add<double>(double, double)>

0000000000000639 <int add<int>(int, int)>:

000000000000064d <double add<double>(double, double)>:

がない-C場合、代わりにマングルされた名前が含まれます。

0000000000000639 <_Z3addIiET_S0_S0_>:
000000000000064d <_Z3addIdET_S0_S0_>:

man objdump言います:

低レベルのシンボル名をユーザーレベルの名前にデコード (デマングル) します。システムによって付加された最初のアンダースコアを削除するだけでなく、これにより C++ 関数名が読みやすくなります。コンパイラが異なれば、マングリング スタイルも異なります。オプションの demangling style 引数を使用して、コンパイラに適切な demangling スタイルを選択できます。

nmにも-Cオプションがあります。

Ubuntu g++18.04、7.3.0、2.30 でテスト済みobjdump

于 2015-06-05T12:05:44.430 に答える
21

パイプを通しc++filtますか?-n記号が先頭の下線付きかなしかによって、指定する必要がある場合があります。

于 2012-02-23T18:49:10.160 に答える