链接到旧版本的gcc

时间:2012-06-28 07:53:00

标签: c++ linux gcc dynamic-linking

我有CentOS 6.2(64位,默认为gcc 4.4.6)。不幸的是,我的代码只用gcc 3.4.6编译,所以我在/ home / rajat / local下单独安装了gcc(来自源代码)。在链接一个简单的“Hello World”程序时,我得到以下内容。

>ldd a.out 
linux-vdso.so.1 =>  (0x00007fff215ff000)
libstdc++.so.6 => /home/rajat/local/lib64/libstdc++.so.6 (0x00007f11853e7000)
libm.so.6 => /lib64/libm.so.6 (0x00000033be400000)
libgcc_s.so.1 => /home/rajat/local/lib64/libgcc_s.so.1 (0x00007f11851ce000)
libc.so.6 => /lib64/libc.so.6 (0x00000033bd000000)
/lib64/ld-linux-x86-64.so.2 (0x00000033bcc00000)

当stdc ++和gcc链接到我的3.4.6库时,libm和libc仍链接到默认库。这个可以吗?? 3.4.6安装也没有生成libm或libc库?

2 个答案:

答案 0 :(得分:2)

是的,没关系。

libc / libm是glibc的一部分,而不是gcc编译器。另一方面,libstdc ++是gcc的一部分。

答案 1 :(得分:1)

/lib/usr/lib中的库以及它们的64位副本是系统范围的库。它们应该是编译器中立,除了GCC之外的其他编译器也可以链接到它们实际上,特别是因为libc是与操作系统内核接口的唯一可移植方式。 / p>

libc编写者非常谨慎地编写头文件,以使不同的编译器生成相同的二进制内存对象,以便与库中的代码正确连接。此外,还有一个定义良好的OS ABI接口,所有编译器都遵守这些接口,以便彼此兼容。对于C以外的语言,这可能不适用,例如来自不同C ++编译器版本的目标文件很少相互配合。

编译器特定的库未安装在/lib/usr/lib中,有时可以静态链接,以便可以删除相关性。