Gcc 使用旧版libc编译(未找到'GLIBC_2.14';版本)

Gcc 使用旧版libc编译(未找到'GLIBC_2.14';版本),gcc,linker,shared-libraries,Gcc,Linker,Shared Libraries,我必须在当前的ubuntu(12.04)上编译一个程序。然后,该程序应使用CentOS和旧内核(2.6.18)在集群上运行。不幸的是,我不能直接在集群上编译。如果我只是编译并复制程序而不做任何更改,我会收到错误消息“kernel too old” 按照我的理解,这样做的原因不是内核版本,而是用于编译的libc版本。因此,我尝试编译程序,动态链接集群中的libc,静态链接其他所有内容 研究 关于这一点已经有很多问题了,但没有一个答案对我真正有用。以下是我对该主题的研究: 解释内核太旧消息的原因

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

按照我的理解,这样做的原因不是内核版本,而是用于编译的libc版本。因此,我尝试编译程序,动态链接集群中的libc,静态链接其他所有内容

研究

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

  • 解释内核太旧消息的原因
  • 类似,但更专业,没有答案
  • 按照建议的静态链接不起作用,因为集群上的libc太旧了。一个答案还提到使用旧的libc进行构建,但没有解释如何做到这一点
  • 是在运行旧操作系统的VM中编译。这是可行的,但很复杂。我也读到了
  • 它需要使用选项
    -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\u system、-lboost\u filesystem-Wl、-Bdynamic、-lc、-lstdc++、-lgcc\u进行编译

已编译二进制文件上的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

-rpath
设置DT_rpath标记,但不告诉链接器在那里查找libs,您需要
-L

请参阅答案

这是正确的方法吗

否:不能像link命令那样使用不匹配的glibc版本。您从新的(系统安装的)libc使用了
crt0.o
ld linux.so
,但从旧的(从集群复制的)libc使用了
libc.so.6
。这是行不通的