【问题标题】:How to link to a specific version of the standard library (with gcc)如何链接到特定版本的标准库(使用 gcc)
【发布时间】:2011-03-24 15:29:51
【问题描述】:

我已将 GCC 3.4 安装到 /opt/gcc-3.4,并使用它来编译与 GCC 4 不兼容的遗留代码。这也意味着旧版本的 C(++) 标准库 binutils , 和实用程序库。

它适用于某些库,但在编译 libtiff 时会失败,因为它会获取 /usr/lib 中的系统库(请参阅下面的输出)。这可能是一个自动工具/配置问题,但我不确定。我找不到配置开关或环境变量,我宁愿不修改我的系统 /usr/lib/libc.so 。

那么如何确保它链接到/opt/gcc-3.4.4/lib 中的标准库,而完全忽略/lib 和/usr/lib?

make 的输出(摘录):

libtool:链接:g++ -shared -nostdlib /usr/lib/crti.o /opt/gcc-3.4.3/lib/gcc/i686-pc-linux-gnu/3.4.3/crtbeginS.o .libs /tif_stream.o -Wl,--whole-archive ../port/.libs/libport.a -Wl,--no-whole-archive -Wl,-rpath -Wl,/home/jason/d0src34/prereq/ tiff-3.9.4/libtiff/.libs -Wl,-rpath -Wl,/opt/gcc-3.4.3/lib -Wl,-rpath -Wl,/home/jason/d0src34/prereq/usr/lib -Wl ,-rpath -Wl,/opt/gcc-3.4.3/lib ../libtiff/.libs/libtiff.so -L/usr/lib /usr/lib/libjpeg.so -lz -L/opt/gcc-3.4.3/lib/gcc/i686-pc-linux-gnu/3.4.3 -L/opt/gcc-3.4.3/lib/gcc/i686-pc-linux-gnu/3.4 .3/../../.. /opt/gcc-3.4.3/lib/libstdc++.so -L/home/jason/Downloads/gcc-3.4.3/build/i686-pc-linux-gnu/ libstdc++-v3/src -L/home/jason/Downloads/gcc-3.4.3/build/i686-pc-linux-gnu/libstdc++-v3/src/.libs -L/home/jason/Downloads/gcc-3.4 .3/build/gcc -lm -lc -lgcc_s /opt/gcc-3.4.3/lib/gcc/i686-pc-linux-gnu/3.4.3/crtendS.o /usr/lib/crtn.o -Wl ,-soname -Wl,libtiffxx.so.3 -o .libs/libtiffxx.so.3.9.4

/home/jason/d0src34/prereq/usr/bin/ld:/usr/lib/libc.so:文件格式无法识别;视为链接描述文件

/home/jason/d0src34/prereq/usr/bin/ld:/usr/lib/libc.so:5: 解析错误

【问题讨论】:

  • ld 手册页说:链接器使用以下搜索路径来定位所需的共享库。 (...各种可配置的东西...) 7. 默认目录,通常是/lib 和/usr/lib。那么,也许问题是,如何更改“默认目录”?我在配置 binutils(ld 所在的位置)时没有找到任何选项...

标签: gcc configure multiple-versions


【解决方案1】:

我为自己的问题找到了一个(骇人听闻的)答案:

我一直在使用 binutils 2.15,因为更高版本与 GCC 3.4 不兼容。在最近的版本中,/usr/lib/libc.so 的格式发生了变化,旧的 binutils 无法解析。

我暂时注释掉了最后一行(用“GROUP”),我的代码编译好了:

/* GNU ld script
   Use the shared library, but some functions are only in
   the static library, so try that secondarily.  */
OUTPUT_FORMAT(elf32-i386)
/* GROUP ( /lib/libc.so.6 /usr/lib/libc_nonshared.a  AS_NEEDED ( /lib/ld-linux.so.2 ) ) */

但是,我并不是很满意,因为我很难告诉其他想要使用该代码来编辑他们的系统文件的人。另外,我不确定我是否已将它链接到正确的 glibc 版本,因为系统 /usr/lib 仍在搜索路径中,所以我无法确定二进制文件是否可以在其他系统上运行。

【讨论】:

    猜你喜欢
    • 2010-10-24
    • 2011-03-10
    • 1970-01-01
    • 1970-01-01
    • 2012-02-12
    • 2020-09-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多