2016-06-28 1 views
0

私はobjdumpを使って2つの異なるバージョンのバイナリファイルを比較しようとしていて、objdump出力の次の行からシンボル名を解釈する方法を知っている人がいるのだろうかと疑問に思っていた:objdump出力のシンボル名のコンポーネント

102b33bc l  O .rodata 00000058 ThisIsMyStruct::ThisIsMyStruct()::C.24 

この出力は、次のコマンドを使用して生成された:

objdump -t -C -r -w --special-syms my.bin > my.bin.txt 

は私の問題はmy.binの2つの異なるバージョンが同じラインを持っていることですが、一つは終わりC.24を持っており、他が持っています最後にC.12。

C.#は何を表していますか?

ありがとうございます!

答えて

0

コンパイラが表現したいものを表します。 Symbol name manglingは完全にコンパイラ固有のものであり、コンパイラのバージョンによっても変わります。先日、特定のgccコンパイラオプションによって異なるシンボルマングリングが発生したときに私は驚いていました。それは楽しかった。

http://gcc.gnu.orgの検索では、gccの名前のmanglingに関するドキュメントは見つかりませんでした。一般的なGoogleの検索もあまり啓発されていませんでした。

+1

GCCの外部シンボルのマングリングは、Itanium C++ ABI(https://mentorembedded.github.io/cxx-abi/abi.html#mangling)に従います。しかし、ここでシンボルはローカルなので、すべての賭けはオフです。 –

0

私の問題は、my.binの2つの異なるバージョンが同じ行を持っていますが、一方はC.24、最後はC.12です。

このは問題にならないことができます。このシンボルは、ローカルリンケージ(l部)を有しており、それが定義されているオブジェクトファイルの外側に表示されていません。

シンボルはおそらく文字列リテラルを表します。 "foo\n"printf("foo\n")に設定します。リテラルは、あるケースでは12行目に定義され、別のケースでは24行目で定義される可能性があります(これは保証されていません)。

関連する問題