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

时间:2012-05-30 11:32:46

标签: gcc linker shared-libraries

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

我理解它的方式,其原因不是内核版本,而是用于编译的libc版本。所以我尝试编译我的程序动态链接集群中的libc并静态链接其他所有内容。

研究

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

  • This question解释内核过旧消息的原因
  • This question相似但更专业,没有答案
  • 静态链接建议here不起作用,因为libc在群集上太旧了。一个答案还提到使用旧的libc进行构建,但没有解释如何执行此操作。
  • One way将在运行旧操作系统的VM中编译。这工作但很复杂。我还读到了you should not link libc statically
  • Apparently is 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时,它返回not a dynamic executable并运行二进制文件导致上述相同的两个错误。它看起来还包括其他库(linux-vdso.so.1,ld-linux-x86-64.so.2和libm.so.6)。我也应该使用旧版本吗?

所以现在我有两个主要问题:

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

2 个答案:

答案 0 :(得分:10)

请参阅this回答。

  

这是否是正确的方法

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

答案 1 :(得分:2)

-rpath设置DT_RPATH标记但不告诉链接器查找libs,你需要-L