8

次のようなオーバーロードされた関数があります。

void f(int)
void f(int, int)
void f(int, float)

壊れた出力を見ることができるように、それをコンパイルする方法は? 何かのようなもの:

void f(int) should show: ?f@@YAXH@Z(int)

たとえば、プリプロセッサの出力を表示するには-E、アセンブラーの出力を使用します-sが、名前がマングルされた出力とは何ですか?

PS: プラットフォームは Linux です

編集:

そして、ここでの答えは次のとおりです。

void func(int);
void func(int, int);
void func(void);
void func(char);

[root@localhost ~]# cat a.map | grep func
                0x0804881a                _Z4funcc
                0x08048790                _Z4funcv
                0x080487be                _Z4funcii
                0x080487ec                _Z4funci
4

4 に答える 4

10

GCCの場合、次を使用してみてください:

-Xlinker -Map=output.map

http://gcc.gnu.org/onlinedocs/gcc/Link-Options.html

これにより、マングルされたすべてのシンボル名を持つマップ ファイルが生成されます。

MSVC の場合:

http://msdn.microsoft.com/en-us/library/k7xkk3e2(v=vs.80).aspx

これにより、次のようなものが生成されます。

0002:00094190       ??0SerializationException@EM@@QAE@ABV01@@Z 10148190 f i y:foo.obj
于 2013-06-25T16:27:49.320 に答える
3

この-Sオプションは、関数をコンパイルするだけでアセンブルしないように GCC に指示します。つまり、関数名を確認できる人間が読めるアセンブリ テキストを出力します。c++filtマングルされた名前をマングルされていない名前に関連付けることができるように、それを実行します。

于 2013-06-25T16:24:31.477 に答える