我试图制作一个尽可能便携的可执行文件。在删除了一些依赖项后,当在另一个系统上运行二进制文件时,我遇到了以下情况:
/lib/x86_64-linux-gnu/libm.so.6: version `GLIBC_2.15' not found (required by foob)
/lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.15' not found (required by foob)
/lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.14' not found (required by foob)
我希望我的二进制文件不需要用户升级他们的libc版本,因此我想要移除这个依赖关系。
产生上述二进制文件的链接器标志已经包括了-static-libgcc -static-libstdc++
。为什么该二进制文件仍然依赖共享库libc.so.6?
我尝试添加-static
标志,但是当我尝试运行那个二进制文件时,结果非常奇怪:
$ ls -l foob
-rwxr-xr-x 1 claudiu claudiu 13278191 Oct 10 13:03 foob
$ ./foob
bash: ./foob: No such file or directory
该怎么办?
编辑:
$ file foob
foob: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=5adee9a598b9261a29f1c7b0ffdadcfc72197cd7, not stripped
$ strace -f ./foob
execve("./foob", ["./foob"], [/* 64 vars */]) = -1 ENOENT (No such file or directory)
write(2, "strace: exec: No such file or di"..., 40strace: exec: No such file or directory
) = 40
exit_group(1) = ?
+++ exited with 1 +++
有趣的是,如果我运行ldd
命令在没有使用-static
参数的版本上,则条目比使用-static
参数的版本要少两个,具体如下:
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f4f420c1000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f4f41636000)
strace -f ./foob
命令,这样我们就可以看到 "No such file or directory" 的具体信息了。 - nos