我有重载的function,如:
void f(int) void f(int, int) void f(int, float)
如何编译它,让我可以看到mangled的输出? 就像是:
void f(int) should show: ?f@@YAXH@Z(int)
例如,要看到预处理器的输出,我们使用-E
,汇编器输出,这是什么名称mangled输出?
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
对于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 fiy:foo.obj
在Linux中,我可以通过nm
看到所有符号的名字。 例如:
$ nm a.out | grep pthread w pthread_cancel@@GLIBC_2.2.5 U pthread_key_create@@GLIBC_2.2.5 U pthread_key_delete@@GLIBC_2.2.5
-S
选项告诉GCC只编译但不能组装一个函数。 即,它将输出人类可读的汇编文本,在其中您将能够看到函数名称。 通过c++filt
运行它,这样你就可以把这些重名的名字和未被占用的名字关联起来。
编译器/链接器应该有一些选项来创建映射文件。 在该文件中,您可以看到所有函数和方法的重名。