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

问题描述

我有两台机器,

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

现在,我有了可以在RHEL4机器上编译的代码,然后可以在两台机器上运行可执行文件。 但是,如果我在RHEL6计算机上编译相同的代码,则无法在RHEL4计算机上运行可执行文件。它将引发错误“需要GLIBC 2.7版本”。

现在的问题是,RHEL6计算机上的GLIBC 2.7已经支持较早版本,并且具有与较早版本相关的标头。所以我可以以某种方式告诉我的gcc编译器使用特定的早期版本的gcc来编译代码。 (因为它可以在早期版本上进行编译...)

更多信息:

$ readelf -a glibc

在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 -a glibc 在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版本。从distrowatch for 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版本中的 not 符号。

所以我能以某种方式告诉我的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将具有较旧的符号。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...