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