修改ELF二进制文件动态段的工具

8

是否有一种工具可以修改ELF二进制文件的动态部分中的共享库条目?我想要明确地修改我的二进制文件中的共享库依赖项(即使用自定义路径替换现有库的路径)。

4个回答

3

patchelf 是你想要的工具。

$ patchelf --replace-needed LIB_ORIGIN  LIB_NEW  ELF_FILE

为了查看效果

$ readelf -d ELF_FILE

安装工具很简单:
$ sudo apt-get install patchelf readelf

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之外,首先检查是否可以使用符号链接替换库。这是通常的技巧:很难修改可执行文件,但很容易更改符号链接指向的位置。

1

如果你通过readelf查看Linux中的.dynsym部分,你会看到类似这样的内容:

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`前导出您的自定义路径,然后从那里开始。

1

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接