如何打印 ld(链接器)搜索路径
- 2024-10-10 09:28:00
- admin 原创
- 90
问题描述:
如何按照ld搜索的顺序打印其查找的搜索路径。
解决方案 1:
您可以通过执行以下命令来执行此操作:
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搜索的路径(即每当链接程序时)不同。
解决方案 2:
在 Linux 上,你可以使用ldconfig
,它维护 ld.so 配置和缓存,打印出使用以下命令搜索的目录ld.so
:
ldconfig -v 2>/dev/null | grep -v ^$' '
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
缓存。
解决方案 3:
我不确定是否有任何选项可以简单地打印完整的有效搜索路径。
但是:搜索路径由-L
命令行选项指定的目录以及SEARCH_DIR("...")
链接器脚本中的指令添加到搜索路径的目录组成。因此,如果您能看到这两个目录,就可以解决问题,具体操作如下:
如果您ld
直接调用:
选项
-L
就是您所说的一切。要查看链接器脚本,请添加
--verbose
选项。查找SEARCH_DIR("...")
指令,通常位于输出顶部附近。(请注意,这些指令不一定每次调用时都相同ld
——链接器有许多不同的内置默认链接器脚本,并根据各种其他链接器选项在它们之间进行选择。)
如果您通过以下方式链接gcc
:
您可以将
-v
选项传递给,gcc
以便它向您显示如何调用链接器。事实上,它通常不会ld
直接调用,而是通过名为的工具collect2
(位于其内部目录之一)间接调用,该工具又调用ld
。这将向您显示-L
正在使用的选项。您可以添加
-Wl,--verbose
选项gcc
以使其传递--verbose
到链接器,以查看如上所述的链接器脚本。
解决方案 4:
我发现的与 Linux 上的 gcc 和 clang 最兼容的命令(感谢 armando.sano):
$ gcc -m64 -Xlinker --verbose 2>/dev/null | grep SEARCH | sed 's/SEARCH_DIR("=?([^"]+)"); */
/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
解决方案 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
上面的选项就gcc
直接传递-v
给了ld
。但是:
ld -v
不打印搜索路径。
解决方案 6:
Mac 版本:$ ld -v 2,不知道如何获取详细路径。输出
Library search paths:
/usr/lib
/usr/local/lib
Framework search paths:
/Library/Frameworks/
/System/Library/Frameworks/
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件