【问题标题】:GLIBC 2.7 version required. Compile C++ code with later GLIBC version while supporting earlier glibc [duplicate]需要 GLIBC 2.7 版本。使用更高版本的 GLIBC 编译 C++ 代码,同时支持早期的 glibc [重复]
【发布时间】:2020-12-07 23:43:23
【问题描述】:

我有两台机器,

  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 中没有的任何新东西

【问题讨论】:

  • 这能回答你的问题吗? How can I link to a specific glibc version?
  • @ŁukaszŚlusarczyk 我怀疑这在这里​​有用。除非可以跟踪可能从较新的 glibc 中使用的所有可能的符号,并且使用相应的较旧符号版本(当您仅编译时这是不切实际的),否则它不会起作用。在这种情况下,为什么不在旧系统上编译呢?

标签: c++ gcc centos g++ glibc


【解决方案1】:

让我们确认一下 RHEL 上的默认 glibc 版本。来自distrowatch 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 将具有较旧的符号。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-21
    • 1970-01-01
    • 2012-06-01
    • 2013-04-03
    • 1970-01-01
    • 1970-01-01
    • 2019-09-12
    • 2014-11-16
    相关资源
    最近更新 更多