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

Jas*_*n R 16 c++ gcc name-mangling objdump

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

Cir*_*四事件 16

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
Run Code Online (Sandbox Code Playgroud)

输出包含demangled名称:

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)>:
Run Code Online (Sandbox Code Playgroud)

没有-C,它包含错误的名称:

0000000000000639 <_Z3addIiET_S0_S0_>:
000000000000064d <_Z3addIdET_S0_S0_>:
Run Code Online (Sandbox Code Playgroud)

man objdump 说:

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

nm也有-C选择权.

经测试在Ubuntu 18.04,g++7.3.0,objdump2.30.


smp*_*kes 15

管它通过c++filt?可能需要-n根据符号是否带有前导下划线来给出它.

  • 看起来这样可行.我也刚刚找到`objdump`的`-C`选项,它至少对我的应用程序起作用了. (4认同)