【问题标题】:Strange gcc linker search paths奇怪的 gcc 链接器搜索路径
【发布时间】:2017-03-23 19:56:19
【问题描述】:

运行 gcc-Wl,--verbose 会打印出类似的东西

attempt to open /foo/gcc-6.3.0/lib64/../lib64/libm.so failed
attempt to open /foo/gcc-6.3.0/lib64/../lib64/libm.a failed
attempt to open /foo/gcc-6.3.0/lib/x86_64-redhat-linux/6.3.0/libm.so failed
attempt to open /foo/gcc-6.3.0/lib/x86_64-redhat-linux/6.3.0/libm.a failed
attempt to open /foo/gcc-6.3.0/lib/../lib64/libm.so failed
attempt to open /foo/gcc-6.3.0/lib/../lib64/libm.a failed
attempt to open /foo/gcc-6.3.0/lib/gcc/x86_64-redhat-linux/6.3.0/libm.so failed
attempt to open /foo/gcc-6.3.0/lib/gcc/x86_64-redhat-linux/6.3.0/libm.a failed
attempt to open /foo/gcc-6.3.0/lib/gcc/x86_64-redhat-linux/6.3.0/../../../x86_64-redhat-linux/6.3.0/libm.so failed
attempt to open /foo/gcc-6.3.0/lib/gcc/x86_64-redhat-linux/6.3.0/../../../x86_64-redhat-linux/6.3.0/libm.a failed
attempt to open /foo/gcc-6.3.0/lib/gcc/x86_64-redhat-linux/6.3.0/../../../../lib64/libm.so failed
attempt to open /foo/gcc-6.3.0/lib/gcc/x86_64-redhat-linux/6.3.0/../../../../lib64/libm.a failed
attempt to open /lib/../lib64/libm.so failed
attempt to open /lib/../lib64/libm.a failed
attempt to open /usr/lib/../lib64/libm.so succeeded

这些路径需要在其中包含一堆../ 是否有原因?例如,为什么/foo/gcc-6.3.0/lib64/../lib64/libm.so 不只是/foo/gcc-6.3.0/lib64/libm.so?此外,一些较长的路径扩展到相同的事物,例如/foo/gcc-6.3.0/lib/gcc/x86_64-redhat-linux/6.3.0/../../../../lib64/libm.so/foo/gcc-6.3.0/lib/../lib64/libm.so

另外,/foo/gcc-6.3.0/lib 明显缺乏,而大多数库都安装在lib 而不是lib64

【问题讨论】:

    标签: linux gcc ld


    【解决方案1】:

    我在这里发现了两个类似的问题:

    Why does g++ look in LIBRARY_PATH/../lib64 and where is this documented?

    g++ searches /lib/../lib/, then /lib/

    here 的评论阐明了是什么决定了这些路径是如何形成的。

    然而,这些并不能回答为什么使用这么多这些路径,即使它们解析到同一个目录。

    【讨论】:

      【解决方案2】:

      /foo/gcc-* 中的库由gcc-* 包提供,它是/lib64//lib 中提供的实际库的符号链接。

      这些符号链接为gcc 提供有针对性的支持。

      实际的库包含共享库。

      gcc-objc为例,它指向的库libobjc

      $ rpm -ql gcc-objc
      <snip>
      /usr/lib/gcc/x86_64-redhat-linux/4.4.4/include/objc/thr.h
      /usr/lib/gcc/x86_64-redhat-linux/4.4.4/include/objc/typedstream.h
      /usr/lib/gcc/x86_64-redhat-linux/4.4.4/libobjc.a
      /usr/lib/gcc/x86_64-redhat-linux/4.4.4/libobjc.so
      /usr/lib/gcc/x86_64-redhat-linux/4.4.7
      <snip>
      
      $ ls -l /usr/lib/gcc/x86_64-redhat-linux/4.4.4/libobjc.so
      /usr/lib/gcc/x86_64-redhat-linux/4.4.4/libobjc.so -> ../../../../lib64/libobjc.so.2
      
      $ rpm -ql libobjc
      /usr/lib64/libobjc.so.2
      /usr/lib64/libobjc.so.2.0.0
      

      现在让我们看看这些包的描述。

      $ rpm -qi gcc-objc
      gcc-objc provides Objective-C support for the GCC.
      Mainly used on systems running NeXTSTEP, Objective-C is an
      object-oriented derivative of the C language.
      
      $ rpm -qi libobjc
      This package contains Objective-C shared library which is needed to run
      Objective-C dynamically linked programs.
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-02-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-24
        • 2014-06-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多