我的问题是指我从另一家公司收到的封闭源代码.so。不幸的是,这个.so将Boost1.33静态链接到它,它导出了我的应用程序想要使用的boost :: ...符号。一旦使用boost :: start_thread(),就会导致SEG FAULT。
我的想法是,如果有工具来读取符号表,也可以编辑符号表(关于可见性/导出)。
一般来说,尸检编辑是否可行?有没有这样的工具?如果没有,我将如何开发这样的工具?
答案 0 :(得分:0)
运行info binutils
以获取列表。
注意,我假设你的麻烦在于,闭源lib(也就是此处的alienlib)有一些半缺陷的升级程序副本,只有一些(而不是你需要的一些),所以你会遇到各种各样的冲突。
并且...你想中性升级符号的alienlib副本,所以你可以链接你自己的升级副本.so ???
您有时可以使用linker script
重命名符号,这些符号可以重命名符号或列出您要保持公开的符号。您“链接”到链接器脚本文件[文本文件],它引用了alienlib)
有一个BFD库(官方名称“大他妈的交易”)可以读/写任何二进制/库格式,这就是objdump的基础。并且,他们非常重视任何这个词。
请注意,符号表属于.so文件的特定范围。获取一个十六进制转储程序,该程序也会在右侧吐出ascii。您将能够获得十六进制范围。
此外,strings
程序带有-t x -a
,它会显示符号的十六进制偏移量。
请注意,如果只有少数,您可以使用十六进制编辑器程序手动执行此操作。请注意,有一些漂亮的,但xxd
程序可以生成一个十六进制转储,它可以将十六进制文件“压缩”回二进制文件,这是对此的回退。
现在您已拥有该范围,您可以编写一个可以映射alienlib文件的C程序。您可以翻阅符号表范围,查找所有“提升”字符串,只需将“提升”更改为缩放或靴子或zcrab或任何您喜欢的相同数量的字符。请注意,当我在此处说出字符串时,我的意思是char str[5] = { 'b', 'o', 'o', 's', 't' };
而不是 char *str = "boost";
答案 1 :(得分:0)
objcopy -w -L _ZN5boost * libvtutil.so
通过本地化大量增强符号进行了更改。但是,我还在打一个(其他?)问题