如何打印 ld (链接器)搜索路径

按照搜索顺序打印 查找的搜索路径的方法是什么。

212751 次浏览

我不确定是否有任何简单地打印完整有效的搜索路径的选项。

但是: 搜索路径由命令行上的 -L选项指定的目录组成,后面是通过链接器脚本中的 SEARCH_DIR("...")指令添加到搜索路径的目录。所以如果你能看到这两个,你就可以算出来,你可以这样做:

如果你直接调用 ld:

  • -L选项就是你所说的那些选项。
  • 要查看链接器脚本,请添加 --verbose选项。查找 SEARCH_DIR("...")指令,通常在输出的顶部附近。(请注意,对于 ld的每次调用,这些脚本不一定相同——链接器有许多不同的内置默认链接器脚本,并根据各种其他链接器选项在它们之间进行选择。)

如果你通过 gcc链接:

  • 您可以将 -v选项传递给 gcc,以便它向您展示如何调用链接器。实际上,它通常不直接调用 ld,而是通过一个名为 collect2的工具(位于它的一个内部目录中)间接调用 ld。这将显示正在使用的 -L选项。
  • 您可以将 -Wl,--verbose添加到 gcc选项中,使其将 --verbose传递给链接器,以查看上面描述的链接器脚本。

在 Linux 上,可以使用 ldconfig(它维护 ld.so 配置和缓存)打印出 ld.so搜索的目录

ldconfig -v 2>/dev/null | grep -v ^$'\t'

ldconfig -v通过链接器(没有前导选项卡)打印出目录搜索,以及在这些目录中找到的共享库(有前导选项卡) ; grep获得这些目录。在我的机器上,这条线会打印出来

/usr/lib64/atlas:
/usr/lib/llvm:
/usr/lib64/llvm:
/usr/lib64/mysql:
/usr/lib64/nvidia:
/usr/lib64/tracker-0.12:
/usr/lib/wine:
/usr/lib64/wine:
/usr/lib64/xulrunner-2:
/lib:
/lib64:
/usr/lib:
/usr/lib64:
/usr/lib64/nvidia/tls: (hwcap: 0x8000000000000000)
/lib/i686: (hwcap: 0x0008000000000000)
/lib64/tls: (hwcap: 0x8000000000000000)
/usr/lib/sse2: (hwcap: 0x0000000004000000)
/usr/lib64/tls: (hwcap: 0x8000000000000000)
/usr/lib64/sse2: (hwcap: 0x0000000004000000)
第一个路径(行中没有 hwcap)是内置的,或者是从/etc/ld.so.conf 读取的。 然后链接器可以在基本库搜索路径下搜索其他目录,名称如 sse2对应于额外的 CPU 能力。 以 hwcap为代表的这些路径可以包含为这些 CPU 功能量身定制的附加库

最后一个注意事项: 使用 -p代替上面的 -v搜索 ld.so缓存。

您可以通过执行以下命令来实现这一点:

ld --verbose | grep SEARCH_DIR | tr -s ' ;' \\012

GCC向链接器传递一些额外的 L 路径,您可以使用以下命令列出这些路径:

gcc -print-search-dirs | sed '/^lib/b 1;d;:1;s,/[^/.][^/]*/\.\./,/,;t 1;s,:[^=]*=,:;,;s,;,;  ,g' | tr \; \\012

建议使用 ld.so.conf 和 ldconfig 的答案是不正确的,因为它们指的是运行时动态链接器搜索的路径(即每当一个程序被执行时) ,这与 搜索的路径(即每当一个程序被链接时)是不一样的。

这个问题被标记为 Linux,但是也许在 Linux 下也可以这样工作?

gcc -Xlinker -v

在 Mac OS X 下,这样打印:

@(#)PROGRAM:ld  PROJECT:ld64-224.1
configured to support archs: armv6 armv7 armv7s arm64 i386 x86_64 armv6m armv7m armv7em
Library search paths:
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/usr/lib
Framework search paths:
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/System/Library/Frameworks/
[...]

上述 gcc-Xlinker选项只是将 -v传递给 ld。然而:

ld -v

不打印搜索路径。

我在 Linux 上找到的最兼容的 gcc 和 clang 命令(感谢 armando.sano) :

$ gcc -m64 -Xlinker --verbose  2>/dev/null | grep SEARCH | sed 's/SEARCH_DIR("=\?\([^"]\+\)"); */\1\n/g'  | grep -vE '^$'

如果给定 -m32,它将输出正确的库目录。

我机器上的例子:

g++ -m64:

/usr/x86_64-linux-gnu/lib64
/usr/i686-linux-gnu/lib64
/usr/local/lib/x86_64-linux-gnu
/usr/local/lib64
/lib/x86_64-linux-gnu
/lib64
/usr/lib/x86_64-linux-gnu
/usr/lib64
/usr/local/lib
/lib
/usr/lib

g++ -m32:

/usr/i686-linux-gnu/lib32
/usr/local/lib32
/lib32
/usr/lib32
/usr/local/lib/i386-linux-gnu
/usr/local/lib
/lib/i386-linux-gnu
/lib
/usr/lib/i386-linux-gnu
/usr/lib
Mac 版本: $ld-v2,不知道如何获得详细路径。 输出

Library search paths:
/usr/lib
/usr/local/lib
Framework search paths:
/Library/Frameworks/
/System/Library/Frameworks/