你能 relink/modify 相关共享库查找路径吗?

Can you relink/modify relative shared library look up paths?

我运行遇到以下情况。项目 A 具有库 A1、A2、A3...,它们遵循自己的目录结构。例如:

Libaries/
|
|--Dir1/
|  |
|  |--A1.so
|  |--A2.so
|
|--Dir2/
|  |--A3.so
|  |--A4.so

在这种情况下,项目 A 编译得很好。项目 A 的库是项目 B 的依赖项,脚本(我无法控制)将它们复制到平面层次结构中的 B 目录,即 this

BLibraries/
|--A1.so
|--A2.so
|--A3.so
|--A4.so

所以相对路径不再相同。

B 通过 dlopen 从这些库中动态加载符号。在这种情况下,如果 A1 需要来自 A2 的符号,B 它们将显示为未定义,因此 B 无法加载 A1。

有没有办法我可以戳文件 Ai.so 并告诉他们“嘿,你需要的符号库现在实际上就在这里”?

Is there a way I can poke the files Ai.so and tell them "Hey that other library whose symbols you need is actually over here now"?

您可以使用 patchelf 来做到这一点,但您 不应该

由于 控制 A*.so 的构建方式,因此您应该设置它们的 RPATH 以使其“开箱即用”。添加 -rpath=/path/to/BLibrariesA*.so link 命令可能就足够了。