用于修改ELF二进制文件的动态部分的工具

时间:2010-07-08 17:16:56

标签: c linux elf

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

4 个答案:

答案 0 :(得分: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 :(得分:1)

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

答案 2 :(得分: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前导出自定义路径,从那里开始。

答案 3 :(得分:1)

patchelf是您想要的

$ patchelf --replace-needed LIB_ORIGIN  LIB_NEW  ELF_FILE

看效果

$ readelf -d ELF_FILE

安装工具很容易:

$ sudo apt-get install patchelf readelf