我有 c++filt
命令来破坏符号,相反的工具是什么来破坏符号名称?
如果我想在一个损坏的 C++ 函数名上调用 dlsym()
这将很有用。我宁愿不对代码中的名称进行硬编码,因为由于使用了新的编译器版本或新的编译器品牌,或者目前由于为多个平台编译,它可能会随着时间的推移而改变。
是否有一种编程方式可以在运行时获取表示 C++ 函数的字符串,以便代码独立于编译器?一种可能的方法是在编译时调用一个实用程序,该实用程序为正在使用的编译器执行名称修改并将适当的修改后的 C++ 符号名称插入到字符串中以供 dlsym()
使用。
这是我在此站点上找到的最接近解决方案的解决方案,该解决方案 通过使用固定的 C 样式名称间接指向您希望 dlsym()
的库中定义的 C++ 符号来完成,但如果您这样做无法控制该库提供的内容,这不是一个选项。
原文由 WilliamKF 发布,翻译遵循 CC BY-SA 4.0 许可协议
您可以通过查看 .so 您正在查看的符号表来获得所需的内容:其他人已经回答了此问题 Returning a shared library symbol table 。
但是,如果符号太多……那可能行不通。
所以这是一个疯狂的想法。买者自负!
一个潜在的解决方案是:
创建一个包含一个名称的存根文件:您想要的名称:void myfunction() { }
编译该文件(使用 -fPIC 和 -shared 所以它是一个动态库)
在该特定文件上调用 dlopen/dlsym
遍历符号(应该只有一个想要的符号加上您可以过滤的其他常规垃圾)。遍历符号很笨拙,但您可以做到: 返回共享库符号表
dlclose() 释放它(从你的符号中丢失存根)
用 dlopen 打开你想要的文件
基本上,你会从你的代码中调用编译器,它会创建一个 .so 你可以查看,取出唯一的值,然后卸载那个 .so 以便你可以加载你想要的那个。
这很疯狂。