繁体   English   中英

如何打印 ld(linker) 搜索路径

[英]How to print the ld(linker) search path

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

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

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

在 Linux 上,您可以使用维护 ld.so 配置和缓存的ldconfig来打印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缓存。

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

但是:搜索路径由命令行上的-L选项指定的目录组成,然后是链接描述文件中的SEARCH_DIR("...")指令添加到搜索路径的目录。 因此,如果您可以看到这两个,您就可以解决问题,您可以执行以下操作:

如果您直接调用ld

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

如果您通过gcc链接:

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

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

这个问题被标记为 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

不打印搜索路径。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM