LD_DEBUG 环境变量 (2012)

2026-06-09 1 阅读 tanelpoder
最初发布于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 显示重定位处理文件 显示输入文件符号的进度 显示符号表处理绑定 显示有关符号绑定版本的信息 显示版本依赖性 所有先前选项 组合统计信息 显示重定位统计信息 未使用的确定 未使用的 DSOs help 显示此帮助消息并退出 将调试输出定向到文件而不是标准输出 a可以使用 LD_DEBUG_OUTPUT 环境变量指定文件名。注意 还有许多其他有用的工具可以处理链接问题: strace 程序提供对所有系统调用的深入了解,包括搜索、打开动态库 ldd 程序解决动态库依赖关系 objdump -x YOURFILE | grep NEEDED 命令列出程序或库中的记录,显示需要哪些其他库 patchelf 程序可以轻松更改 ELF 可执行文件的 rpath,从而更改内置搜索顺序 LD_PRELOAD 环境允许轻松替换动态库 需要进一步建议?凭借 20 多年的经验,我们在提供帮助方面拥有得天独厚的优势 – 请通过 webs@bnikolic.co.uk 与我们联系 注意此变量仅适用于 Linux。在 MS Windows 上,可以通过使用 gflags.exe 程序启用“显示加载程序快照”(https://abitofscotland.wordpress.com/2019/12/20/dll-load-failure/) 来获取类似信息,然后使用 Windbg 查看日志。例如:安装 Windows SDK for gflags 和 Windbg winget 安装 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]; cat [0] 28504 需要:find library=libc.so.6 [0];搜索28504:搜索路径=/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:尝试文件=/home/bnikolic/s/lib/tls/x86_64/libc.so.6 28504:尝试文件=/home/bnikolic/s/lib/tls/libc.so.6 28504:尝试文件=/home/bnikolic/s/lib/x86_64/libc.so.6 28504:尝试file=/home/bnikolic/s/lib/libc.so.6 28504:尝试 file=tls/x86_64/libc.so.6 28504:尝试 file=tls/libc.so.6 28504:尝试 file=x86_64/libc.so.6 28504:尝试 file=libc.so.6 28504:尝试文件=/home/bnikolic/d/p/R-2.14.1bin/lib/R/lib/tls/x86_64/libc.so.6 28504:尝试文件=/home/bnikolic/d/p/R-2.14.1bin/lib/R/lib/tls/libc.so.6 28504:尝试文件=/home/bnikolic/d/p/R-2.14.1bin/lib/R/lib/x86_64/libc.so.6 28504:尝试文件=/home/bnikolic/d/p/R-2.14.1bin/lib/R/lib/libc.so.6 28504:搜索缓存=/etc/ld.so.cache 28504:尝试文件=/lib/x86_64-linux-gnu/libc.so.6 28504: 28504: 文件=libc.so.6 [0];生成链接映射28504:动态:0x00007fc38e525b40基数:0x00007fc38e18c000大小:0x00000000003a0368 28504:条目:0x00007fc38e1ad420 phdr: 0x00007fc38e18c040 phnum: 10 28504: 28504: 检查文件 /lib/x86_64-linux-gnu/libc.so.6 [0] 中的版本 `GLIBC_2.4' 文件 cat [0] 28504: 检查文件中的版本 `GLIBC_2.3'文件 cat [0] 28504 需要 /lib/x86_64-linux-gnu/libc.so.6 [0]:检查文件 /lib/x86_64-linux-gnu/libc.so.6 [0] 中的版本“GLIBC_2.3.4”