c++ - objdump 可以取消 C++ 模板函数的名称吗?

标签 c++ gcc name-mangling objdump

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

最佳答案

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 说:

Decode (demangle) low-level symbol names into user-level names. Besides removing any initial underscore prepended by the system, this makes C++ function names readable. Different compilers have different mangling styles. The optional demangling style argument can be used to choose an appropriate demangling style for your compiler.

nm 也有 -C 选项。

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

关于c++ - objdump 可以取消 C++ 模板函数的名称吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9419228/

相关文章:

python:在动态创建的类中进行名称修改

c++ - Coderush 不分析 C++ 解决方案

c++ - 错误 : missing type specifier - int assumed. C++ 不支持默认 int

c++ - 用指针数组递增和递减

c++ - 需要 GLIBC 2.7 版本。使用更高版本的 GLIBC 编译 C++ 代码,同时支持更早的 glibc

无法防止名称修改

c++ - 意外的 undefined reference

c - 用 gcc 扩展 c 编程语言

c - 为什么 GCC 在为未声明的函数发出警告方面不一致?

python - 手工 C++ 名称修改