如何修改 C++ 名称(对于 Linux 上的 GCC 编译对象)?

ein*_*ica 5 c++ gcc abi name-mangling object-files

我想以编程方式修改 C++ 函数或变量的名称 - 以获取将出现在编译的目标文件中的符号名称。我正在使用 Linux 和 GCC。

现在,为什么这不是一件小事呢?例如typeid(foo).name()?因为这不符合您的要求:考虑以下程序:

#include <iostream>

extern int foo(int x) { return 0; }
extern double bar(int x) { return 1.0; }

int main()
{
    std::cout << typeid(foo).name() << std::endl;
    std::cout << typeid(bar).name() << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

让我们看看这给了我们什么:

$ g++ -o a.o -O0 -c a.cpp
$ objdump  -t a.o | egrep "(bar|foo)"
00000000000000dd l     F .text  0000000000000015 _GLOBAL__sub_I__Z3fooi
0000000000000000 g     F .text  000000000000000e _Z3fooi
000000000000000e g     F .text  000000000000001b _Z3bari
$ ./a
FiiE
FiiE
Run Code Online (Sandbox Code Playgroud)

根本不是同一件事。

笔记:

  • 你有没有想过namespace abi?我也是。源代码似乎没有进行破坏,只是进行了破坏。
  • 其他平台+编译器组合上相同问题的解决方案也很有趣,如果您有它们,我将扩大问题范围。
  • 动机:我想要dlsym()一个非外部 C 函数或变量。