gcc - 使用较旧的 libc 进行编译(未找到版本 `GLIBC_2.14')

标签 gcc linker shared-libraries

我必须在当前的 ubuntu (12.04) 上编译一个程序。然后,该程序应该在使用带有较旧内核 (2.6.18) 的 CentOS 的集群上运行。不幸的是,我无法直接在集群上进行编译。如果我只是编译并复制程序而不进行任何更改,我会收到错误消息“内核太旧”。

据我了解,造成这种情况的原因并不是内核版本,而是用于编译的libc版本。因此,我尝试编译我的程序,动态链接集群中的 libc 并静态链接其他所有内容。

研究

SO 上已经有很多关于此的问题,但没有一个答案真正对我有用。这是我对该主题的研究:

  • This question解释了内核太旧消息的原因
  • This question类似但更专业并且没有答案
  • 按照建议进行静态链接 here不起作用,因为集群上的 libc 太旧了。一个答案还提到使用旧的 libc 进行构建,但没有解释如何执行此操作。
  • One way是在运行旧操作系统的虚拟机中进行编译。这有效但很复杂。我还读到you should not link libc statically
  • Apparentlyis possible使用选项 -rpath 编译不同的 libc 版本,但这对我不起作用(见下文)

当前状态

我将以下文件从集群复制到目录 /path/to/copied/libs

  • libc-2.5.so
  • libgcc_s.so.1
  • libstdc++.so.6

并使用选项进行编译-nodefaultlibs -Xlinker -rpath=/path/to/copied/libs -Wl,-Bstatic,-lrt,-lboost_system,-lboost_filesystem -Wl,-Bdynamic,-lc, -lstdc++,-lgcc_s

编译后的二进制文件上 ldd 的输出是

mybin: /path/to/copied/libs/libc.so.6: version `GLIBC_2.14' not found (required by mybin)
mybin: /path/to/copied/libs/libstdc++.so.6: version `GLIBCXX_3.4.15' not found (required by mybin)
linux-vdso.so.1 =>  (0x00007ffff36bb000)
libc.so.6 => /path/to/copied/libs/libc.so.6 (0x00007fbe3789a000)
libstdc++.so.6 => /path/to/copied/libs/libstdc++.so.6 (0x00007fbe37599000)
libgcc_s.so.1 => /path/to/copied/libs/libgcc_s.so.1 (0x00007fbe3738b000)
/lib64/ld-linux-x86-64.so.2 (0x00007fbe37bf3000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fbe37071000)

我对这个错误有点困惑,因为它使用了正确的路径(即集群中的 libc),但仍然提示缺少 glibc 版本。在集群上运行 ldd 时,它返回不是动态可执行文件,并且运行二进制文件会导致上述两个错误。看起来还包含其他库(linux-vdso.so.1、ld-linux-x86-64.so.2 和 libm.so.6)。我也应该使用旧版本吗?

现在我有两个主要问题:

  • 这是否是正确的方法?
  • 如果是:如何正确链接旧的 libc?

最佳答案

参见this回答。

Is this even the correct approach here

不:您不能像链接命令那样使用不匹配版本的glibc。您使用了来自(系统安装的)libc 的crt0.old-linux.so,但是libc.so.6 来自旧的(从集群复制的)libc。那是行不通的。

关于gcc - 使用较旧的 libc 进行编译(未找到版本 `GLIBC_2.14'),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10815453/

相关文章:

c - 如何预加载共享库并使用在同一包装函数中使用 malloc 的函数来包装 malloc?

swift - 使用 Swift 创建库

algorithm - 这个循环优化叫什么,它是如何工作的?

c - 未知操作码 '.pword'

c - 使用单个头文件链接到由多个库和目标文件组成的静态库

ubuntu - 缺少 SDL 库?

linux - 使用 arg 时出现 nasm 段错误

c - 是否可以在编译时检测 C 中的范围错误

c - 检测 ELF 可执行文件中未解析的符号

android - 在android studio项目中链接.so库