Linux / C ++共享库:我可以编辑sybol表,即导出哪些符号?

时间:2015-10-28 07:01:31

标签: object shared

我的问题是指我从另一家公司收到的封闭源代码.so。不幸的是,这个.so将Boost1.33静态链接到它,它导出了我的应用程序想要使用的boost :: ...符号。一旦使用boost :: start_thread(),就会导致SEG FAULT。

我的想法是,如果有工具来读取符号表,也可以编辑符号表(关于可见性/导出)。

一般来说,尸检编辑是否可行?有没有这样的工具?如果没有,我将如何开发这样的工具?

2 个答案:

答案 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
通过本地化大量增强符号进行了更改。但是,我还在打一个(其他?)问题