我的程序取决于它希望在目录结构内部找到的共享库。我想将共享图书馆移出一个更好的地方。在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,这不是我想要的,我不需要在全球改变搜索路径。

有帮助吗?

解决方案

H T - 这可能会有所帮助。

HT是可执行文件的文件编辑/查看器/分析仪。目的是结合调试器的低级功能和IDE的可用性。我们计划实施最重要的文件格式的所有(HEX)编辑功能和支持。

我找不到与Zorbathut的解决方案有很大不同的东西,但是也许可以放置一个不同长度的名称并仍然保持二进制有效。

盖尔 - 这也可能有用。

GELF是用于操纵精灵对象文件的通用,独立于类的API。 GELF提供了一个单一的,常见的间距,用于处理32位和64位精灵格式对象文件。

其他提示

我们可以用 补丁:

patchelf --replace-needed liboriginal.so.1 libreplacement.so.1 my-program

我们还可以删除依赖性:

patchelf --remove-needed libfoo.so.1 my-program

添加一个依赖性:

patchelf --add-needed libfoo.so.1 my-program

或更改搜索库的路径(rpath):

patchelf --set-rpath /path/to/lib:/other/path my-program

发布暂定,可怕的,骇人听闻的解决方案。

库依赖关系存储在称为.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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top