C++ 如何编译C++;在gcc(g+;+;)中编写代码以查看重载函数上的名称是否损坏?
我有重载函数,如:C++ 如何编译C++;在gcc(g+;+;)中编写代码以查看重载函数上的名称是否损坏?,c++,linux,gcc,C++,Linux,Gcc,我有重载函数,如: void f(int) void f(int, int) void f(int, float) 如何编译它,以便我可以看到损坏的输出? 比如: void f(int) should show: ?f@@YAXH@Z(int) 例如,为了查看预处理器输出,我们使用了-E,汇编程序输出-s,名称被破坏的输出是什么 附言:平台是Linux 编辑: 根据这里的答案: void func(int); void func(int, int); void func(void); voi
void f(int)
void f(int, int)
void f(int, float)
如何编译它,以便我可以看到损坏的输出?
比如:
void f(int) should show: ?f@@YAXH@Z(int)
例如,为了查看预处理器输出,我们使用了-E
,汇编程序输出-s
,名称被破坏的输出是什么
附言:平台是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
在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
运行它,以便将损坏的名称与未混合的名称关联起来。对于GCC,请尝试使用:
-Xlinker -Map=output.map
这将生成一个映射文件,其中包含所有损坏的符号名称
对于MSVC:
这将生成以下内容:
0002:00094190 ??0SerializationException@EM@@QAE@ABV01@@Z 10148190 f i y:foo.obj
在不实现函数的情况下调用函数,链接器会在错误消息中告诉您损坏的名称。:)一旦你有了汇编程序,
c++filt myProg.s | diff-myProg.s
应该会提供你需要的信息。你的答案也能达到目的,谢谢你让我们知道实现相同目标的另一种方法,但我一次只能接受一个答案(不幸的是),因为我是从gcc的角度问这个问题的,所以另一个更接近,答案很好。你的和chrisaycock都是为了这个目的,但是因为我是从gcc的角度来问的,所以我应该选择你的。谢谢:-)@kingsmasher1我很好奇为什么我的没有“达到目的”。这是特定于编译器的。我可能说过应该这样做,但我的意思是真的有这样的开关。保罗的回答最终表明了这一点。是的,我的意思是,询问者已经说过哪一个是它的编译器(gcc)。你的答案本身并没有错,但对这个问题,它并不是一个真正的答案。希望你明白我的意思;你的帖子应该是评论:)