制作二进制依赖于正确的`libpthread`

问题描述 投票:0回答:1

我有这些文件:

└─$ 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

linux dynamic-linking
1个回答
0
投票

参见底部的 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

© www.soinside.com 2019 - 2024. All rights reserved.