需要 GLIBC 2.7 版本。使用较新的 GLIBC 版本编译 C++ 代码,同时支持较早的 glibc
GLIBC 2.7 version required. Compile C++ code with later GLIBC version while supporting earlier glibc
我有两台机器,
- RHEL 4 机器
- RHEL 6 机器
现在我有了可以在 RHEL4 机器上编译的代码,然后 运行 两台机器上的可执行文件。
但是如果我在 RHEL6 机器上编译相同的代码,我不能 运行 RHEL4 机器上的可执行文件。它抛出错误“需要 GLIBC 2.7 版本”。
现在我的问题是,RHEL6 机器上的 GLIBC 2.7 已经支持早期版本并且与早期版本有 headers 相关。那么我能否以某种方式告诉我的 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 上编译代码 headers。因为我没有使用 GLIBC 2.3.4
中没有的任何新东西
让我们确认一下 RHEL 上的默认 glibc 版本。来自 distrowatch 用于 RHEL:
- RHEL 4 有 glibc 2.3.4
- RHEL 6 有 glibc 2.12
I cannot run the executable on RHEL4 machine. It throws an error "GLIBC 2.7 version required".
自 2.3.4 以来,glibc 中有更新的符号版本,它们在 2.12 中,但在 2.3.4 中没有。所以这是预期的,不会起作用。
现在我的问题是,RHEL6 机器上的 GLIBC 2.7 已经支持早期版本并且与早期版本有 headers 相关。
是的。但是当你用 glibc 2.12 编译时,它可能会使用旧 glibc 版本中 而不是 的符号。
So can I somehow tell my gcc compiler to use a particular earlier version of gcc to compile the code.
这是编译器 - gcc - 这就是这里的问题。它是 glibc 库。即使您在使用 glibc 2.12 的系统上安装较旧的 gcc,您仍然会遇到同样的问题。
So is there not a way I can compile code on RHEL6 using GLIBC 2.3.4 headers. Since I am not using anything new which was not in GLIBC 2.3.4
同样,您混淆了很多东西 - headers 不是问题所在。它是 glibc 库,特别是它使用的新符号。 “您”可能没有使用任何特定于 glibc 2.12 的内容,但可能会自动引入较新的符号。显然这就是你的情况。
我不确定为什么你想这样做。如果您对 RHEL 4 (glibc 2.3.4) 感到满意,那么为什么要在其上编译并在 RHEL 6 上使用它——因为较新的 glibc 将具有较旧的符号。
我有两台机器,
- RHEL 4 机器
- RHEL 6 机器
现在我有了可以在 RHEL4 机器上编译的代码,然后 运行 两台机器上的可执行文件。 但是如果我在 RHEL6 机器上编译相同的代码,我不能 运行 RHEL4 机器上的可执行文件。它抛出错误“需要 GLIBC 2.7 版本”。
现在我的问题是,RHEL6 机器上的 GLIBC 2.7 已经支持早期版本并且与早期版本有 headers 相关。那么我能否以某种方式告诉我的 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 上编译代码 headers。因为我没有使用 GLIBC 2.3.4
中没有的任何新东西让我们确认一下 RHEL 上的默认 glibc 版本。来自 distrowatch 用于 RHEL:
- RHEL 4 有 glibc 2.3.4
- RHEL 6 有 glibc 2.12
I cannot run the executable on RHEL4 machine. It throws an error "GLIBC 2.7 version required".
自 2.3.4 以来,glibc 中有更新的符号版本,它们在 2.12 中,但在 2.3.4 中没有。所以这是预期的,不会起作用。
现在我的问题是,RHEL6 机器上的 GLIBC 2.7 已经支持早期版本并且与早期版本有 headers 相关。
是的。但是当你用 glibc 2.12 编译时,它可能会使用旧 glibc 版本中 而不是 的符号。
So can I somehow tell my gcc compiler to use a particular earlier version of gcc to compile the code.
这是编译器 - gcc - 这就是这里的问题。它是 glibc 库。即使您在使用 glibc 2.12 的系统上安装较旧的 gcc,您仍然会遇到同样的问题。
So is there not a way I can compile code on RHEL6 using GLIBC 2.3.4 headers. Since I am not using anything new which was not in GLIBC 2.3.4
同样,您混淆了很多东西 - headers 不是问题所在。它是 glibc 库,特别是它使用的新符号。 “您”可能没有使用任何特定于 glibc 2.12 的内容,但可能会自动引入较新的符号。显然这就是你的情况。
我不确定为什么你想这样做。如果您对 RHEL 4 (glibc 2.3.4) 感到满意,那么为什么要在其上编译并在 RHEL 6 上使用它——因为较新的 glibc 将具有较旧的符号。