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 回答
5

在 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
于 2013-06-25T16:22:26.507 回答
3

-S选项告诉 GCC 只编译而不是汇编一个函数。即,它将输出人类可读的汇编文本,您将能够在其中看到函数名称。运行它,c++filt以便您可以将损坏的名称与未损坏的名称相关联。

于 2013-06-25T16:24:31.477 回答
0

您的编译器/链接器中应该有一些选项来创建映射文件。在该文件中,您可以看到所有函数和方法的错位名称。

于 2013-06-25T16:22:27.383 回答