如何打印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.so
search的目录
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
而不是-v
searchld.so
caching。
您可以通过执行以下命令来执行此操作:
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/