什么是Linux实用程序来破坏C++符号名称?

Wil*_*mKF 47 c++ compiler-construction dlsym demangler

我已经c++filt命令解码一个符号,相反的工具是什么,并修改一个符号名称?

如果我想调用dlsym()一个受损的C++函数名,这将非常有用.我宁愿不对代码中的名称进行硬编码,因为由于新的编译器版本或新编译器品牌的使用或目前由于编译多个平台而导致其随着时间的推移而发生变化.

是否有一种编程方式来获取在运行时表示C++函数的字符串,以便代码独立于编译器?可能这样做的一种方法是在编译时调用实用程序,为正在使用的编译器执行名称修改,并将适当的受损的C++符号名称插入到字符串中dlsym()以供使用.

这是我在这个站点找到的最接近解决方案的方法,它通过使用固定的C样式名称来间接到您希望在库中定义的C++符号来实现dlsym(),但是如果您无法控制该库的内容提供,这不是一个选择.

rts*_*ts1 5

您可以通过查看 .so 的符号表来获得您想要的内容: 其他人已经回答了这个问题 正在 返回共享库符号表

但是,如果符号太多……那可能不起作用。
所以这是一个疯狂的想法。买者自负!

一个潜在的解决方案是:

  1. 创建一个文件,其存根只有一个名称:您想要的名称: void myfunction() { }

  2. 编译该文件(使用 -fPIC 和 -shared 所以它是一个动态库)

  3. 在该特定文件上调用 dlopen/dlsym

  4. 遍历符号(应该只有想要的符号加上您可以过滤的其他常规垃圾)。遍历符号很笨拙,但您可以做到: 返回共享库符号表

  5. dlclose() 释放它(从你的符号中删除存根)

  6. 用 dlopen 打开你想要的文件

基本上,你会从你的代码中调用编译器,它会创建一个 .so 你可以查看,获取唯一的值,然后卸载那个 .so 以便你可以加载你想要的那个。

这很疯狂。


小智 5

这就是g ++破坏名字的方式.您可以在程序上实现这些修改规则.

另一个(疯狂的)解决方案是列出你想要使用的库中的所有符号(如果你理解格式就不那么困难了),对它们进行解码,并在该列表中搜索你的函数名.这种方法的优点是demangling更容易,因为有一个函数调用:abi::__cxa_demangle来自cxxabi.h头文件.