使用otool -L可查看macOS程序声明的dylib依赖路径及版本;otool -l结合grep可解析LC_LOAD_DYLIB等加载命令;DYLD_PRINT_LIBRARIES=1可捕获运行时实际加载的dylib;otool -D显示dylib的install_name;otool -tV用于分析符号调用关系。

如果您尝试分析某个 macOS 程序或动态库的外部依赖关系,但无法直观获知其加载了哪些 dylib 文件,则可能是由于缺少对 Mach-O 二进制结构中动态链接信息的解析手段。以下是使用 otool 命令查看动态库依赖的具体操作步骤:
一、使用 otool -L 查看基础依赖列表
otool -L 是最常用且直接的方式,用于列出目标文件(可执行文件、.dylib 或 .framework 中的二进制)所声明依赖的所有动态库路径及其版本信息。该命令读取 Mach-O 文件中的 LC_LOAD_DYLIB 加载命令,不执行实际加载,仅解析静态链接声明。
1、打开终端应用。
2、输入命令:otool -L /path/to/your_binary_or_dylib,将 /path/to/your_binary_or_dylib 替换为实际路径,例如 /usr/bin/python3 或 /System/Library/Frameworks/Foundation.framework/Versions/A/Foundation。
3、回车执行后,输出每行包含一个依赖 dylib 的绝对路径(或 @rpath/@loader_path 等重定向路径)、兼容版本(compatibility version)和当前版本(current version)。
二、使用 otool -l 结合 grep 筛选详细加载命令
otool -l 输出所有 Load Command 的原始结构,其中包含 LC_LOAD_DYLIB、LC_ID_DYLIB、LC_RPATH 等关键信息,适用于需确认 install_name、rpath 设置或调试路径解析失败的场景。
1、在终端中运行:otool -l /path/to/your_binary_or_dylib | grep -A 3 'load.*dylib\|LC_LOAD_DYLIB\|LC_ID_DYLIB'。
2、观察输出中以 cmd LC_LOAD_DYLIB 或 cmd LC_ID_DYLIB 开头的区块,其后紧跟的 name 字段即为声明的库路径。
3、若需查看全部 rpath 条目,可执行:otool -l /path/to/your_binary_or_dylib | grep -A 2 LC_RPATH。
三、配合 DYLD_PRINT_LIBRARIES=1 运行时验证实际加载行为
otool -L 仅反映编译期声明的依赖,而 DYLD_PRINT_LIBRARIES=1 可捕获程序运行时 dyld 实际加载的 dylib 路径与顺序,用于验证 @rpath 解析是否成功、是否存在重复加载或路径 fallback 行为。
1、在终端中输入:DYLD_PRINT_LIBRARIES=1 /path/to/your_binary,注意路径必须指向可执行文件本身(非 .app 包路径),例如 DYLD_PRINT_LIBRARIES=1 /Applications/TextEdit.app/Contents/MacOS/TextEdit。
2、程序启动后,终端将逐行打印形如 dyld: loaded: /usr/lib/libobjc.A.dylib 的日志。
3、若需保存日志,可追加重定向:DYLD_PRINT_LIBRARIES=1 /path/to/binary > load_log.txt 2>&1。
四、使用 otool -D 获取动态库自身的 install_name
每个 dylib 文件在构建时被赋予一个唯一标识符 install_name(即 LC_ID_DYLIB 中的 name 字段),它决定了该库被其他二进制引用时的逻辑名称,也是 @rpath 解析的基准。查看此值有助于诊断链接错误或重签名问题。
1、执行命令:otool -D /path/to/library.dylib。
2、输出结果即为该 dylib 的 install_name,常见形式如 @rpath/libexample.dylib 或 /usr/local/lib/libexample.dylib。
3、若需修改 install_name,须使用 install_name_tool -id 命令,并确保具备写权限及代码签名兼容性。
五、使用 otool -tV 查看汇编级符号调用关系
当需要深入分析某函数是否真正引用了特定 dylib 中的符号(而非仅声明依赖),可结合反汇编输出验证调用点。otool -tV 提供节区内容与指令流,适用于底层调试与安全审计。
1、运行:otool -tV /path/to/binary | head -n 50,限制输出前 50 行以避免刷屏。
2、查找含 callq、jmpq 或 pushq 后接外部符号名的指令行,例如 callq _printf@PLT。
3、交叉核对该符号是否属于 otool -L 输出中的某个 dylib 所提供,方法是用 nm -gU /path/to/dylib | grep _printf 检索。

















