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