我有两台机器,
- RHEL 4机器
- 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会有较旧的符号。