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