可以objdump C ++模板函数的非破坏名称吗?

时间:2012-02-23 18:47:06

标签: c++ gcc name-mangling objdump

我有一个C ++对象文件,其中包含一些C ++模板函数的实例。有问题的目标文件为模板参数的几种不同组合实例化相同的功能。我正在尝试调试一个问题,并希望查看模板函数的特定实例化的反汇编(也就是说,我知道我想要检查的函数的模板参数)。我通常会使用objdump来反汇编目标文件,但它(至少在默认情况下)不能解析C ++函数名称。有没有办法做到这一点?目标文件是使用gcc 4.6.1创建的。

2 个答案:

答案 0 :(得分:15)

通过c++filt管道?可能需要给它-n,具体取决于符号是否带有前导下划线。

答案 1 :(得分:13)

<强> objdump -C

-C标志启用了解码:

printf '
template<typename T>
T add(T x, T y) {
    return x + y;
}

void h() {
    add(1, 2);
    add(1.0, 2.0);
}
' > a.cpp
g++ -g -std=c++11 a.cpp
objdump -CS a.out

输出包含demangled names:

int main() {
    add(1, 2);
 60c:   e8 28 00 00 00          callq  639 <int add<int>(int, int)>
    add(1.0, 2.0);
 62d:   e8 1b 00 00 00          callq  64d <double add<double>(double, double)>

0000000000000639 <int add<int>(int, int)>:

000000000000064d <double add<double>(double, double)>:

如果没有-C,则会包含错误的名称:

0000000000000639 <_Z3addIiET_S0_S0_>:
000000000000064d <_Z3addIdET_S0_S0_>:

man objdump说:

  

将低级别符号名解码(解码)为用户级名称。除了删除系统前面的任何初始下划线外,这使得C ++函数名称可读。不同的编译器具有不同的修改样式。可选的demangling样式参数可用于为编译器选择合适的demangling样式。

nm也有-C选项。

在Ubuntu 18.04中测试,g++ 7.3.0,objdump 2.30。