构建取决于它的程序后,如何更改共享库的文件名?
-
02-10-2019 - |
题
我的程序取决于它希望在目录结构内部找到的共享库。我想将共享图书馆移出一个更好的地方。在OS X上,可以使用install_name_tool完成。我找不到Linux等效的。
以供参考, readelf -d myprogram
吐出以下释义的输出:
Dynamic section at offset 0x1e9ed4 contains 30 entries:
Tag Type Name/Value
0x00000001 (NEEDED) Shared library: [this/is/terrible/library.so]
0x00000001 (NEEDED) Shared library: [libGL.so.1]
0x00000001 (NEEDED) Shared library: [libGLU.so.1]
0x00000001 (NEEDED) Shared library: [libstdc++.so.6]
(continues in an uninteresting fashion)
(并根据要求 ldd myprogram
:)
linux-gate.so.1 => (0x0056a000)
this/is/terrible/library.so => not found
libGL.so.1 => /usr/lib/mesa/libGL.so.1 (0x0017d000)
libGLU.so.1 => /usr/lib/libGLU.so.1 (0x00a9c000)
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00710000)
(etc, etc)
我想将“ this/is/islible/library.so”为“共享/library.so”。请注意,如果该程序留在其“构建”位置,则该程序的相对路径是/is/islible/Library。因此实际上存在,那么LDD可以找到它,如您所期望的。
我知道RPATH,这不是我想要的,我不需要在全球改变搜索路径。
其他提示
发布暂定,可怕的,骇人听闻的解决方案。
库依赖关系存储在称为.Elips块的ELF块中。该块的格式是大量的标识符/字符串POINTER对,StringPointer指向位于二进制中某个地方的标准C null终止字符串。
你看到这要去哪里,对吗?
是的,只要您需要的新路径不超过旧路径,就可以直接进入二进制,然后进行简单的字符串替换。确保不添加或删除字节,否则您将破坏整个二进制字节。如果您想更安全,实际上可以穿越精灵结构以确保您拥有正确的位置 - 现在,我只是检查以确保源字符串完全显示一次。
小精灵确实包括一个校验和,但显然没有加载程序可以实际验证它,因此它是“安全的” - 尽管是凌乱 - 忽略了。
“真正的解决方案”将是一种允许对小精灵结构的低级广义操作的效用。如我所知,除了几个专业案例(主要是)外,没有任何效用。
我绝对希望为此提供更好的解决方案,但是到目前为止,这似乎有效。
您可以使用ld_library_path更改共享库的搜索路径。如果您的程序取决于示例显示的特定相对路径,则您仍然需要具有该目录结构。换句话说,您可以从 /home/user/dev/project/this/is/terrible/library.so
到 /usr/local/lib/this/is/terrible/library.so
但不要 /usr/local/lib/library.so
如果您可以重建程序,则可以更改其使用LIB的相对路径。
在Linux中有更多有关共享linux的信息 http://tldp.org/howto/program-library-howto/shared-libraries.html