如何打印ld(链接器)searchpath

打印ld所search的searchpath的方法是什么?

我不确定是否有简单的打印完整有效searchpath的选项。

但是:searchpath由命令行中的-L选项指定的目录组成,后接目录通过SEARCH_DIR("...")指令添加到searchpath中。 所以你可以解决这个问题,如果你能看到这两个,你可以这样做:

如果你直接调用ld

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

如果你通过gcc链接:

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

在Linux上,可以使用ldconfig (它维护ld.soconfiguration和caching)来打印出由ld.sosearch的目录

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

ldconfig -v打印链接器search的目录(没有前导标签)和在这些目录中find的共享库(带有前导标签); 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的第一个path是内置的或者从/etc/ld.so.conf中读取的。 然后,链接器可以在基本库searchpath下search其他目录,并使用sse2名称来增加CPUfunction。 这些path与hwcap一致,可以包含为这些CPUfunction量身定制的附加库。

最后一个注意事项:使用-p而不是-vsearchld.socaching。

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

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

gcc将一些额外的-Lpath传递给链接器,您可以使用以下命令列出它们:

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

build议使用ld.so.conf和ldconfig的答案是不正确的,因为它们引用由运行时dynamic链接程序search的path(即,每当程序执行时),这与ldsearch的path不同一个程序被链接)。

我在Linux上find的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 

这个问题是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 

不打印searchpath。

Mac版本:$ ld -v 2,不知道如何获得详细的path。 产量

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