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

时间:2012-03-29 09:50:25

标签: linux gcc linker ld

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

6 个答案:

答案 0 :(得分:77)

在Linux上,您可以使用ldconfig来维护ld.so配置和缓存,以{/ 1}}打印出目录搜索

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) 的第一个路径是内置的,或者从/etc/ld.so.conf读取。 然后,链接器可以在基本库搜索路径下搜索其他目录,其名称如hwcap对应于其他CPU功能。 这些路径(行中有sse2)可以包含为这些CPU功能量身定制的附加库。

最后一点注意事项:使用hwcap代替-p以上搜索-v缓存。

答案 1 :(得分:72)

您可以通过执行以下命令来执行此操作:

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的答案不正确,因为它们引用运行时动态链接器搜索的路径(即每当执行程序时),这与<搜索的路径不同strong> ld (即每当程序被链接时)。

答案 2 :(得分:63)

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

但是:搜索路径由命令行上的-L选项指定的目录组成,后跟由链接描述文件中的SEARCH_DIR("...")指令添加到搜索路径的目录。所以如果你能看到这两个,你就可以解决这个问题,你可以这样做:

如果您直接调用ld

  • -L选项是您所说的任何内容。
  • 要查看链接描述文件,请添加--verbose选项。查找SEARCH_DIR("...")指令,通常位于输出顶部附近。 (请注意,ld的每次调用都不一定相同 - 链接器有许多不同的内置默认链接描述文件,并根据各种其他链接器选项在它们之间进行选择。)

如果您通过gcc进行关联:

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

答案 3 :(得分:23)

我在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

答案 4 :(得分:5)

问题是标记为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/
[...]

上面-Xlinker的{​​{1}}选项只会将gcc传递给-v。但是:

ld

不会打印搜索路径。

答案 5 :(得分:1)

Mac版:$ ld -v 2,不知道如何获取详细路径。 输出

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