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

Tal*_*Kit 141 linux linker gcc ld

打印由ld按其搜索顺序查看的搜索路径的方法是什么.

fak*_*ken 82

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

ld --verbose | grep SEARCH_DIR | tr -s ' ;' \\012
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • 你当场。我有一个链接问题,在链接过程中,链接器会在/ usr / local / ..中找到手动安装的库,这会导致缺少库错误,并且链接失败。我每次都要重命名`/ usr / local`来排除该搜索路径。有没有一种简单的方法来排除或覆盖`/ usr / local`路径? (2认同)
  • 啊,现在这解释了为什么在 Centos 中使用本地库进行构建如此糟糕。包含路径搜索是“/usr/local/include”,然后是“/usr/include”,而链接器搜索是“/usr/lib64”,然后是“/usr/local/lib64” (2认同)

tel*_*ium 76

在Linux上,你可以使用ldconfig,其保持ld.so配置和高速缓存,打印出的目录搜索通过ld.so

ldconfig -v 2>/dev/null | grep -v ^$'\t'
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

没有hwcap在行中的第一个路径是内置的或从/etc/ld.so.conf读取.然后,链接器可以在基本库搜索路径下搜索其他目录,其名称sse2与其他CPU功能相对应.这些路径hwcap可以包含为这些CPU功能量身定制的附加库.

最后一点:使用-p而不是-v上面的搜索ld.so缓存.

  • 他问的是链接器(ld)而不是加载器(ld.so)! (46认同)
  • 如果我设置`export LD_LIBRARY_PATH =/some/other/dir`,它怎么可能不会影响这个命令的输出?!似乎它不起作用100%? (3认同)
  • @fons有趣的是,我来到这里寻找这个答案.:)链接时或运行时路径?我猜这就是问题所在.LIBRAY_PATH(链接时间)vs LD_LIBRARY_PATH. (3认同)
  • 我发现在某些平台(例如,使用Linaro工具链的手臂)上,ldconfig实际上并不搜索与运行时链接程序相同的目录。您可以*使其输出搜索路径,并通过启用调试来包含来自LD_LIBRARY_PATH的路径。例如,LD_DEBUG = libs /lib/ld-linux.so --list cat(您可以使用任何可执行文件,我首先想到的就是cat)。可能值得为“`搜索路径`” rep之以鼻。注意,如果您有一个/etc/ld.so.cache匹配所有需要的库,您将看不到内置的系统搜索路径,因为它不会那么远。 (2认同)

Mat*_*ery 66

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

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

如果您ld直接调用:

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

如果您通过gcc以下方式链接:

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

  • 链接器的--verbose选项可以解决问题.很有帮助! (5认同)

小智 28

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

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

如果你给-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
Run Code Online (Sandbox Code Playgroud)

用于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
Run Code Online (Sandbox Code Playgroud)

  • 为什么这需要这么模糊的方法? (2认同)

arm*_*ano 6

问题是标记为Linux,但也许这在Linux下也能正常工作?

gcc -Xlinker -v
Run Code Online (Sandbox Code Playgroud)

在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/
[...]
Run Code Online (Sandbox Code Playgroud)

上面的-Xlinker选项gcc只是传递-vld.然而:

ld -v
Run Code Online (Sandbox Code Playgroud)

不打印搜索路径.