【问题标题】:How to compile a C++ code in gcc (g++) to see the name mangling on overloaded functions?如何在 gcc (g++) 中编译 C++ 代码以查看重载函数上的名称修饰?
【发布时间】:2013-06-22 13:17:51
【问题描述】:

我有像这样的重载函数:

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

如何编译它,以便我可以看到损坏的输出? 类似的东西:

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

例如,要查看预处理器输出,我们使用-E,汇编器输出-s,名称错位输出是什么?

P.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

【问题讨论】:

  • 调用函数而不实现它们,链接器会很友好地告诉您错误消息中的错误名称。 :)

标签: c++ linux gcc


【解决方案1】:

在 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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 它是特定于编译器的。我可能说过应该,但我的意思是确实有这样的开关。就像最终由 paulm 的回答所表明的那样。地图文件确实是要走的路。
    • 是的,我的意思是提问者已经说过哪个是它的编译器(gcc)。您的答案本身并不正确,但对于这个问题,这不是一个真正的答案。希望你明白我的意思;你的帖子应该是评论:)
    【解决方案3】:

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

    【讨论】:

    • 获得汇编程序后,c++filt myProg.s | diff - myProg.s 应该会提供您需要的信息。
    • 您的回答也可以达到目的,感谢您让我们知道实现相同目标的另一种方法,但我一次只能接受 1 个答案(不幸的是),因为我问了这个问题从 gcc 的角度来看,所以另一个更接近。
    【解决方案4】:

    对于 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
    

    【讨论】:

    • 很好的答案。你的和 chrisaycock 都达到了目的,但因为我是从 gcc 的角度问的,所以我应该选择你的。谢谢:-)
    • @kingsmasher1 我很好奇为什么我的不能“达到目的”。
    猜你喜欢
    • 2015-05-08
    • 2011-05-27
    • 1970-01-01
    • 1970-01-01
    • 2017-11-28
    • 2020-07-15
    • 2015-12-01
    • 1970-01-01
    • 2010-10-19
    相关资源
    最近更新 更多