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

Object Linux/C++;共享库:我是否可以编辑sybol表,即导出哪些符号?,object,shared,Object,Shared,我的问题是指一个封闭的来源。所以,我从另一家公司收到的。不幸的是,Boost1.33静态链接到它,它导出boost:。。。我的应用程序要使用的符号。这会在使用boost::start_thread()时立即导致SEG故障 我的想法是,如果有工具可以读取符号表,那么也可以编辑符号表(关于可见性/导出) 一般来说,验尸编辑是可能的吗?甚至有这样的工具吗?如果没有,我将如何开发这样一个工具?运行info-binutils获取列表 注意,我认为您的问题在于封闭源代码库(这里又称alienlib)有boo

我的问题是指一个封闭的来源。所以,我从另一家公司收到的。不幸的是,Boost1.33静态链接到它,它导出boost:。。。我的应用程序要使用的符号。这会在使用boost::start_thread()时立即导致SEG故障

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


一般来说,验尸编辑是可能的吗?甚至有这样的工具吗?如果没有,我将如何开发这样一个工具?

运行
info-binutils
获取列表

注意,我认为您的问题在于封闭源代码库(这里又称alienlib)有boost例程的半缺陷副本,只有其中的一些(而不是您需要的一些),因此会出现各种冲突

而且。。。你想对boost符号的alienlib副本进行中性化,这样你就可以链接到你自己的boost副本。那么

有时,您可以使用
链接器脚本
重命名符号,该脚本可以重命名符号或列出要公开的符号。您“链接”到链接器脚本文件[文本文件],它指的是alienlib)

有一个BFD库(官方名称为“big that deal”),可以读/写任何二进制/库格式,这就是objdump的基础。而且,他们对“任何”这个词都非常认真

请注意,符号表位于.so文件的特定范围内。获取一个十六进制转储程序,该程序也会在右侧输出ascii。你可以得到十六进制范围

另外,
字符串
程序将使用
-tx-a
显示符号的十六进制偏移量

请注意,如果只有少数,可以使用十六进制编辑器程序手动执行此操作。注意,这里有一些漂亮的文件,但是
xxd
程序可以生成一个十六进制转储文件,它可以将十六进制文件“压碎”回二进制文件,所以这是一个退步


现在您已经有了范围,您可以编写一个C程序来映射alienlib文件。您可以在符号表范围内翻找所有的“boost”字符串,只需将“boost”更改为zoost、boots或zcrab或任何您喜欢的字符数相同的字符。注意,当我在这里说string时,我的意思是
charstr[5]={'b','o','o','s','t'}而不是
char*str=“boost”

objcopy-w-L\u ZN5boost*libvtutil.so

通过本地化许多增强符号进行了更改。然而,我仍然在和一个(另一个?)问题

readelf-Ws lib64/libvlutil.so | grep boost | grep start | grep thread交付:1638:0000000000 1EE2A0 353 FUNC全局默认值12 _ZN5boost6thread12start_threadEv 5637:0000000000 1EE2A0 353 FUNC全局默认值12 _zn5boost612;threadEv#################nm-gC lib64/libvlutil.so | grep boost | grep thread | grep start交付:0000000000 1EE2A0 T boost::thread::start_thread()