8

是否有用于修改 ELF 二进制文件动态部分中的共享库条目的工具?我想显式修改我的二进制文件中的共享库依赖项(即用自定义路径替换现有库的路径)

4

4 回答 4

3

用自定义路径替换现有库的路径

如果这是您自己的库,那么您可能会这样链接它:

$ cc -o prog1 -l/full/path/to/libABC.so prog1.o

而不是正确的:

$ cc -o prog1 -L/full/path/to/ -lABC prog1.o

第一种方法告诉 Linux 链接器应用程序恰好需要那个库,只有那个库并且不能覆盖。第二种方法告诉应用程序需要安装在系统某处的库,无论是在默认库路径中还是在 $LD_LIBRARY_PATH 指向的路径中(将在运行时查找)。-L 仅在链接时使用。

否则,不要修补 ELF,而是首先检查是否可以使用符号链接替换库。这是通常的技巧:之后很难修改可执行文件,但很容易更改符号链接点的位置。

于 2010-07-08T21:14:13.367 回答
2

patchelf 是你想要的

$ patchelf --replace-needed LIB_ORIGIN  LIB_NEW  ELF_FILE

看看效果

$ readelf -d ELF_FILE

安装工具很简单:

$ sudo apt-get install patchelf readelf
于 2019-06-19T10:38:08.237 回答
1

您可能需要检查LD_LIBRARY_PATH环境变量。

于 2010-07-08T17:32:03.803 回答
1

如果您通过查看 Linux 中的 .dynsym 部分readelf,您将看到类似以下内容:

1: 0000000000000000   163 FUNC    GLOBAL DEFAULT  UND fseek@GLIBC_2.2.5 (2)

它只包含库的符号名称。但是,如果您包含动态加载程序信息,您将获得:

libc.so.6 => /lib/libc.so.6 (0x00002ba11da4a000)
    /lib64/ld-linux-x86-64.so.2 (0x00002ba11d82a000)

如前所述,最简单的事情(假设您这样做是为了调试,而不是永远)只是创建一个新会话,将您的自定义路径导出到现有的前面LD_LIBRARY_PATH,然后从那里开始。

于 2010-07-08T17:54:58.053 回答