对于共享对象加载的库,如何允许可执行文件解析版本符号?
系统中有许多可执行文件使用的专有库,该库的一个例程中存在错误,我们需要在整个系统中进行修补。这使得像 LD_PRELOAD 这样的功能变得繁琐,并且不切实际,无法尝试强制进入这些可执行文件可能启动的每个环境。因此,给我的计划是将 say 复制到libspecial.so
并libspecial.so.org
创建一个名为的新库libspecial.so
,该库将覆盖该函数并与之链接,libspecial.so.org
以允许自动加载所有剩余符号。
在对一个小示例库进行的小测试中,这工作得很好。
一个函数被覆盖,原始库中的所有其他符号都透明地提供给主可执行文件。
但是,有问题的库有一些版本符号。由于某种原因,这些信息没有传递出去,可执行文件(运行时链接器)抱怨它无法查找所需的版本信息。
我如何允许可执行文件解析版本符号?
如果我使用 dlopen 明确加载库,是否有一些特殊标志可以允许这样做?
或者有更简单的方法吗?
一位同事建议我们可以从可执行 ELF 结构中删除所有版本所需的信息,我们试过了,而且成功了。但是我需要更改所有可执行文件,而且担心这可能会破坏某些东西,所以感觉风险太大。由于运行时链接器可以处理符号解析,只是在传递版本信息时卡住了,所以我希望我只是缺少一种在库中轻松处理这个问题的方法。