26

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

4

2 回答 2

29

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

输出包含解构后的名称:

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、7.3.0、2.30 中g++测试objdump

于 2015-06-05T12:05:44.430 回答
21

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

于 2012-02-23T18:49:10.160 回答