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

新手上路,请多包涵

我有 c++filt 命令来破坏符号,相反的工具是什么来破坏符号名称?

如果我想在一个损坏的 C++ 函数名上调用 dlsym() 这将很有用。我宁愿不对代码中的名称进行硬编码,因为由于使用了新的编译器版本或新的编译器品牌,或者目前由于为多个平台编译,它可能会随着时间的推移而改变。

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

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

原文由 WilliamKF 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 292
2 个回答

您可以通过查看 .so 您正在查看的符号表来获得所需的内容:其他人已经回答了此问题 Returning a shared library symbol table

但是,如果符号太多……那可能行不通。

所以这是一个疯狂的想法。买者自负!

一个潜在的解决方案是:

  1. 创建一个包含一个名称的存根文件:您想要的名称:void myfunction() { }

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

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

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

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

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

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

这很疯狂。

原文由 rts1 发布,翻译遵循 CC BY-SA 3.0 许可协议

这就是 g++ 破坏名称的方式。您可能会在您的程序中实施这些修改规则。

另一个(疯狂的)解决方案是列出您要使用的库中的所有符号(如果您了解格式,这并不难),将它们全部解开,然后在该列表中搜索您的函数名称。这种方法的优点是拆解更容易,因为有一个函数调用来做到这一点: abi::__cxa_demangle ,来自 cxxabi.h 头文件。

原文由 Dani 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题