需要GLIBC 2.7版本.使用更高版本的GLIBC编译C++代码,同时支持早期的GLIBC



我有两台机器,

  1. RHEL 4机器
  2. RHEL 6机器

现在我有了一个代码,可以在RHEL4机器上编译,然后在这两台机器上运行可执行文件。但是,如果我在RHEL6机器上编译相同的代码,我就无法在RHEL4机器上运行可执行文件。它抛出一个错误";需要GLIBC 2.7版本";。

现在我的问题是,RHEL6机器上的GLIBC 2.7已经支持早期版本,并且具有与早期版本相关的头。因此,我可以告诉我的gcc编译器使用特定的早期版本的gcc来编译代码吗。(因为它可以在早期版本上编译…(

更多信息:

$readelf-一个油嘴滑舌的

在RHEL4机器上显示,

Addr: 0x0000000000014428  Offset: 0x014428  Link: 4 (.dynstr)
000000: Rev: 1  Flags: BASE   Index: 1  Cnt: 1  Name: libc.so.6
0x001c: Rev: 1  Flags: none  Index: 2  Cnt: 1  Name: GLIBC_2.2.5
0x0038: Rev: 1  Flags: none  Index: 3  Cnt: 2  Name: GLIBC_2.2.6
0x0054: Parent 1: GLIBC_2.2.5
0x005c: Rev: 1  Flags: none  Index: 4  Cnt: 2  Name: GLIBC_2.3
0x0078: Parent 1: GLIBC_2.2.6
0x0080: Rev: 1  Flags: none  Index: 5  Cnt: 2  Name: GLIBC_2.3.2
0x009c: Parent 1: GLIBC_2.3
0x00a4: Rev: 1  Flags: none  Index: 6  Cnt: 2  Name: GLIBC_2.3.3
0x00c0: Parent 1: GLIBC_2.3.2
0x00c8: Rev: 1  Flags: none  Index: 7  Cnt: 2  Name: GLIBC_2.3.4
0x00e4: Parent 1: GLIBC_2.3.3
0x00ec: Rev: 1  Flags: none  Index: 8  Cnt: 2  Name: GLIBC_PRIVATE
0x0108: Parent 1: GLIBC_2.3.4

$readelf——油嘴滑舌在RHEL6机器上显示,

版本定义部分'.gnu.Version_d'包含17个条目:

Addr: 0x00000031b2a16eb8  Offset: 0x016eb8  Link: 5 (.dynstr)
000000: Rev: 1  Flags: BASE   Index: 1  Cnt: 1  Name: libc.so.6
0x001c: Rev: 1  Flags: none  Index: 2  Cnt: 1  Name: GLIBC_2.2.5
0x0038: Rev: 1  Flags: none  Index: 3  Cnt: 2  Name: GLIBC_2.2.6
0x0054: Parent 1: GLIBC_2.2.5
0x005c: Rev: 1  Flags: none  Index: 4  Cnt: 2  Name: GLIBC_2.3
0x0078: Parent 1: GLIBC_2.2.6
0x0080: Rev: 1  Flags: none  Index: 5  Cnt: 2  Name: GLIBC_2.3.2
0x009c: Parent 1: GLIBC_2.3
0x00a4: Rev: 1  Flags: none  Index: 6  Cnt: 2  Name: GLIBC_2.3.3
0x00c0: Parent 1: GLIBC_2.3.2
0x00c8: Rev: 1  Flags: none  Index: 7  Cnt: 2  Name: GLIBC_2.3.4
0x00e4: Parent 1: GLIBC_2.3.3
0x00ec: Rev: 1  Flags: none  Index: 8  Cnt: 2  Name: GLIBC_2.4
0x0108: Parent 1: GLIBC_2.3.4
0x0110: Rev: 1  Flags: none  Index: 9  Cnt: 2  Name: GLIBC_2.5
0x012c: Parent 1: GLIBC_2.4
0x0134: Rev: 1  Flags: none  Index: 10  Cnt: 2  Name: GLIBC_2.6
0x0150: Parent 1: GLIBC_2.5
0x0158: Rev: 1  Flags: none  Index: 11  Cnt: 2  Name: GLIBC_2.7
0x0174: Parent 1: GLIBC_2.6
0x017c: Rev: 1  Flags: none  Index: 12  Cnt: 2  Name: GLIBC_2.8
0x0198: Parent 1: GLIBC_2.7
0x01a0: Rev: 1  Flags: none  Index: 13  Cnt: 2  Name: GLIBC_2.9
0x01bc: Parent 1: GLIBC_2.8
0x01c4: Rev: 1  Flags: none  Index: 14  Cnt: 2  Name: GLIBC_2.10
0x01e0: Parent 1: GLIBC_2.9
0x01e8: Rev: 1  Flags: none  Index: 15  Cnt: 2  Name: GLIBC_2.11
0x0204: Parent 1: GLIBC_2.10
0x020c: Rev: 1  Flags: none  Index: 16  Cnt: 2  Name: GLIBC_2.12
0x0228: Parent 1: GLIBC_2.11
0x0230: Rev: 1  Flags: none  Index: 17  Cnt: 2  Name: GLIBC_PRIVATE
0x024c: Parent 1: GLIBC_2.12

因此,我无法使用GLIBC 2.3.4头在RHEL6上编译代码。由于我没有使用GLIBC 2.3.4 中没有的任何新内容

让我们确认RHEL上的默认glibc版本。从RHEL:的发行版观看

  • RHEL 4具有glibc 2.3.4
  • RHEL 6具有glibc 2.12

我无法在RHEL4计算机上运行可执行文件。它抛出一个错误";需要GLIBC 2.7版本";。

自2.3.4以来,glibc中有更新的符号版本,它们在2.12中,但不在2.3.4中。所以这是意料之中的事,不会奏效。

现在我的问题是,RHEL6机器上的GLIBC 2.7已经支持早期版本,并且具有与早期版本相关的头。

是的。但是,当您使用glibc 2.12进行编译时,在旧的glibc版本中,它可能使用而不是的符号。

所以我可以告诉我的gcc编译器使用特定的早期版本的gcc来编译代码吗。

这里的问题出在编译器gcc上。这是glibc图书馆。即使您在使用glibc 2.12的系统上安装了一个旧的gcc,您仍然会遇到同样的问题。

因此,我无法使用GLIBC 2.3.4头在RHEL6上编译代码。由于我没有使用GLIBC 2.3.4 中没有的任何新内容

同样,您混淆了很多东西——标题不是问题所在。它是glibc库,特别是它使用的较新符号"你"可能没有使用glibc 2.12特定的任何东西,但可以自动引入较新的符号。很明显,你的情况就是这样。

我不确定你为什么要这样做。如果您对RHEL 4(glibc 2.3.4(感到满意,那么为什么要在它上编译并在RHEL 6上使用它呢?因为较新的glibc会有较旧的符号。

最新更新