2012-02-23 1 views
14

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

答えて

13

c++filtまでパイプ?先頭にアンダースコアが付いているかどうかに応じて、-nにする必要があります。

+4

そのように見えます。私も 'objdump'の' -C'オプションを見つけました。少なくとも私のアプリケーションではうまくいくようです。 –

+0

@JasonRさらに良い。歴史的に、 'nm ++'のようなオプションと変種名がありましたが、ヒットしてしまいました。そして、私はすべてを配管するという習慣に慣れました。 – smparkes

+0

@JasonR、これを投稿していただきありがとうございます。私の 'objdump'(' --help'では表示されていません)では、 '-C'は文書化されていませんでしたが、それでも機能しました。 –

8

objdump -CJason Rのようにコメントしています。

man objdumpは言う:

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

operator new[]上とobjdump -CSr呼び出しの出力例:-Cなし

char *sn = new char[4]; 
10: bf 04 00 00 00   mov $0x4,%edi 
15: e8 00 00 00 00   callq 1a <main+0x1a> 
         16: R_X86_64_PC32  operator new[](unsigned long)-0x4 

それはマングルされた名前_Znamを示すだろう。

nmにもそのオプションがあります。

関連する問題