【发布时间】:2014-12-05 22:11:56
【问题描述】:
我正在尝试制作一个尽可能便携的可执行文件。删除一些依赖项后,我在另一个系统上运行二进制文件时遇到了以下问题:
/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 标志,但是当我尝试运行 that 二进制时,结果非常奇怪:
$ 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 -v 吗?那么“文件foob”呢?您可能希望包含您正在使用的特定源和目标(Linux?)发行版+架构。
-
按照建议,运行
file foob。确保它是 64 位可执行文件。 -
我刚刚编译了一个带有only -static 标志的简单程序:“gcc -o ts --std=c99 --static test.c”。工作正常。
-
运行
strace -f ./foob,这样我们就可以看到“没有这样的文件或目录”是什么意思。 -
@ChrisStratton,我在多个 linux 系统上从来没有遇到过
-static的问题。我可能不得不安装一些静态库,但就是这样。
标签: c++ c gcc glibc static-linking