我有这些文件:
└─$ ls
ld-2.31.so libc.so.6 libpthread-2.31.so professor professor.zip
(我从 zip 文件中提取了它们)
运行
professor
时,我收到以下错误:
└─$ ./professor
./professor: ./libc.so.6: version `GLIBC_ABI_DT_RELR' not found (required by /lib/x86_64-linux-gnu/libpthread.so.0)
我认为这是因为二进制文件没有正确依赖当前目录中的
libpthread-2.31.so
造成的:
└─$ ldd professor
./professor: ./libc.so.6: version `GLIBC_ABI_DT_RELR' not found (required by /lib/x86_64-linux-gnu/libpthread.so.0)
linux-vdso.so.1 (0x00007ffefb53f000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f7d5ce0a000)
libc.so.6 => ./libc.so.6 (0x00007f7d5cc18000)
./ld-2.31.so => /lib64/ld-linux-x86-64.so.2 (0x00007f7d5ce24000)
使用
patchelf --set-rpath . professor
没有帮助,因为 rpath
已经是 .
。看来loader也设置正确了,只是libpthread
有问题。
如何使二进制文件依赖于正确的
libpthread
?
参见底部的 TLDR。
您想使用本地
libpthread-2.31.so
,但您的可执行文件链接到 libpthread.so.0
而不是 libpthread-2.31.so
。您可以创建符号链接来设置此关系。
我无权访问您的
professor
可执行文件,但我将使用另一个常见的 Linux 命令 gvim
来说明。此命令未与 libpthread
链接,但我将使用 libgtk
来说明。
$ ldd /usr/bin/gvim | grep libgtk
libgtk-3.so.0 => /lib/x86_64-linux-gnu/libgtk-3.so.0 (0x00007f9c98000000)
gvim
可执行文件链接到libgtk-3.so.0
,解析为/lib/x86_64-linux-gnu/libgtk-3.so.0
。但是如果您查看该路径,您会发现它是另一个文件的符号链接。
$ ls -l /lib/x86_64-linux-gnu/libgtk-3.so.0
/lib/x86_64-linux-gnu/libgtk-3.so.0 -> libgtk-3.so.0.2405.32
制作目标文件的本地副本。
$ cp /lib/x86_64-linux-gnu/libgtk-3.so.0.2405.32 .
现在再次检查依赖关系。
$ ldd /usr/bin/gvim | grep libgtk
libgtk-3.so.0 => /lib/x86_64-linux-gnu/libgtk-3.so.0 (0x00007f924b000000)
一切都没有改变。但那是因为我们没有修改链接器路径。我们来试试吧。
$ LD_LIBRARY_PATH=. ldd /usr/bin/gvim | grep libgtk
libgtk-3.so.0 => /lib/x86_64-linux-gnu/libgtk-3.so.0 (0x00007f891cc00000)
还是没有变化。好的,现在创建一个符号链接。
$ ln -s libgtk-3.so.0.2405.32 libgtk-3.so.0
$ ls -l
libgtk-3.so.0 -> libgtk-3.so.0.2405.32
libgtk-3.so.0.2405.32
再次检查链接器。
$ LD_LIBRARY_PATH=. ldd /usr/bin/gvim | grep libgtk
libgtk-3.so.0 => ./libgtk-3.so.0 (0x00007f3620800000)
啊哈!现在它链接到本地副本。
TLDR
所以我怀疑你需要做这样的事情:
$ ln -s libpthread-2.31.so libpthread.so.0
检查再次链接。
$ LD_LIBRARY_PATH=. ldd professor
链接器然后应该找到指向(本地)
libpthread.so.0
文件的本地链接libpthread-2.31.so
。