返回

文章详情

LD_DEBUG环境变量(2012)

Hacker News2026年6月9日 17:29

最初于2012年4月23日发布,2019年9月10日更新(添加故障排除工具链接),2019年10月18日更新(迁移到Jekyll),2023年4月3日更新,添加其他工具的链接。使用许多共享(动态)加载库开发大型系统有时会导致一些难以诊断的令人沮丧的错误。这些错误往往是由于系统上有多个版本的库,而加载了“错误”的版本,而不是开发者所需的版本。注意:您还可以使用我为Linux上链接器问题诊断而实现的在线工具,它是一个专家系统。写这篇文章时,它正在扩展,但可能已经非常实用。我常常通过使用strace命令(man strace)调试这些问题,以检查哪些库正在被访问。然而,有一种更高效但可能不太为人所知的调试共享库加载问题的方法:LD_DEBUG环境变量。如果设置了LD_DEBUG变量,则Linux动态链接器将转储调试信息,这些信息可以快速解决大部分加载问题。要查看可用的选项,只需将变量设置为help运行任何程序,即:LD_DEBUG=help cat。LD_DEBUG环境变量的有效选项包括:libs显示库搜索路径,reloc显示重定位处理,files显示输入文件符号的处理进度,bindings显示符号绑定的信息,versions显示版本依赖关系,all将所有先前选项组合在一起,statistics显示重定位统计,unused确定未使用的DSO,help显示此帮助信息并退出。要将调试输出定向到文件而不是标准输出,可以使用LD_DEBUG_OUTPUT环境变量指定文件名。注意:还有许多其他有用的工具来处理链接问题:strace程序提供对所有系统调用的洞察,包括搜索、打开动态库,ldd程序解析动态库依赖关系,objdump -x YOURFILE | grep NEEDED命令列出程序或库中的记录,显示需要哪些其他库,patchelf程序可轻松更改ELF可执行文件的rpath,更改内置搜索顺序,LD_PRELOAD环境允许轻松替换动态库。需要进一步的建议吗?凭借超过20年的经验,我们在帮助方面独具优势 - 请通过webs@bnikolic.co.uk与我们联系。注意:此变量仅适用于Linux。在MS Windows上,可以通过启用“显示加载器快照”(https://abitofscotland.wordpress.com/2019/12/20/dll-load-failure/)来获得类似信息,方法是使用gflags.exe程序启用,然后使用windbg查看日志。例如:安装Windows SDK以获得gflags和windbg winget install Microsoft.WindowsSDK.10.0.19041(或从Microsoft网站下载),为可执行文件启用ShowLoaderSnaps。例如:要为notepad.exe启用,请在Powershell中执行&"C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\gflags.exe" /i notepad.exe +sls。在WinDbg应用程序下执行notepad.exe,将显示详细的DLL加载日志。以下是我在笔记本电脑上运行的示例:LD_DEBUG=all cat 28504:28504:file=libc.so.6 [0]; needed by cat [0] 28504:find library=libc.so.6 [0]; searching 28504:search path=/home/bnikolic/s/lib/tls/x86_64:/home/bnikolic/s/lib/tls:/home/bnikolic/s/lib/x86_64:/home/bnikolic/s/lib:tls/x86_64:tls:x86_64::/home/bnikolic/d/p/R-2.14.1bin/lib/R/lib/tls/x86_64:/home/bnikolic/d/p/R-2.14.1bin/lib/R/lib/tls:/home/bnikolic/d/p/R-2.14.1bin/lib/R/lib/x86_64:/home/bnikolic/d/p/R-2.14.1bin/lib/R/lib (LD_LIBRARY_PATH) 28504:trying file=/home/bnikolic/s/lib/tls/x86_64/libc.so.6 28504:trying file=/home/bnikolic/s/lib/tls/libc.so.6 28504:trying file=/home/bnikolic/s/lib/x86_64/libc.so.6 28504:trying file=/home/bnikolic/s/lib/libc.so.6 28504:trying file=tls/x86_64/libc.so.6 28504:trying file=tls/libc.so.6 28504:trying file=x86_64/libc.so.6 28504:trying file=libc.so.6 28504:trying file=/home/bnikolic/d/p/R-2.14.1bin/lib/R/lib/tls/x86_64/libc.so.6 28504:trying file=/home/bnikolic/d/p/R-2.14.1bin/lib/R/lib/tls/libc.so.6 28504:trying file=/home/bnikolic/d/p/R-2.14.1bin/lib/R/lib/x86_64/libc.so.6 28504:trying file=/home/bnikolic/d/p/R-2.14.1bin/lib/R/lib/libc.so.6 28504:search cache=/etc/ld.so.cache 28504:trying file=/lib/x86_64-linux-gnu/libc.so.6 28504:28504:file=libc.so.6 [0]; generating link map 28504:dynamic:0x00007fc38e525b40 base:0x00007fc38e18c000 size:0x00000000003a0368 28504:entry:0x00007fc38e1ad420 phdr:0x00007fc38e18c040 phnum:10 28504:28504:checking for version `GLIBC_2.4' in file /lib/x86_64-linux-gnu/libc.so.6 [0] required by file cat [0] 28504:checking for version `GLIBC_2.3' in file /lib/x86_64-linux-gnu/libc.so.6 [0] required by file cat [0] 28504:checking for version `GLIBC_2.3.4' in file /lib/x86_64-linux-gnu/libc.so.6 [0] required by file cat [0] ...

赞助内容

NordVPN Next-gen Antivirus

本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。

请我喝杯咖啡