如何打印 mach-o 二进制文件从 dylibs 导入的所有符号?

问题描述

我是 MacOS 和 MacOS 编程的新手。我想知道应用程序是如何工作的(通过简单地了解二进制文件的导入系统 API 以供学习)。

我尝试了 otool,打印了帮助消息,我看到消息说 -L 打印使用的共享库。然后我运行了 otool -L <binary-file>,但它只打印了使用的库的名称,没有任何导入的符号。

也许我在 otool 中遗漏了一些东西,或者有没有其他工具可以帮助获取 mach-o 二进制文件中的导入符号?

解决方法

您可以使用 nm -u 获取简单的导入符号列表:

% nm -u /bin/echo
___mb_cur_max
___stdoutp
_err
_exit
_fflush
_getenv
_mbtowc
_putchar
_putwchar
_strcmp
_strlen
dyld_stub_binder

有关更多详细信息,包括每个符号预期来自的库,您可以使用 dyldinfo。但这需要 Xcode,并且必须作为 xcrun dyldinfo 调用。您需要 -bind-weak_bind-lazy_bind 的联合:

% xcrun dyldinfo -bind /bin/echo 
bind information:
segment section          address        type    addend dylib            symbol
__DATA_CONST __got            0x100004000    pointer      0 libSystem        ___mb_cur_max
__DATA_CONST __got            0x100004008    pointer      0 libSystem        ___stdoutp
__DATA_CONST __got            0x100004010    pointer      0 libSystem        dyld_stub_binder
% xcrun dyldinfo -weak_bind /bin/echo
no weak binding
% xcrun dyldinfo -lazy_bind /bin/echo
lazy binding information (from lazy_bind part of dyld info):
segment section          address    index  dylib            symbol
__DATA  __la_symbol_ptr  0x100008000 0x0000 libSystem        _err
__DATA  __la_symbol_ptr  0x100008008 0x000B libSystem        _exit
__DATA  __la_symbol_ptr  0x100008010 0x0017 libSystem        _fflush
__DATA  __la_symbol_ptr  0x100008018 0x0025 libSystem        _getenv
__DATA  __la_symbol_ptr  0x100008020 0x0033 libSystem        _mbtowc
__DATA  __la_symbol_ptr  0x100008028 0x0041 libSystem        _putchar
__DATA  __la_symbol_ptr  0x100008030 0x0050 libSystem        _putwchar
__DATA  __la_symbol_ptr  0x100008038 0x0060 libSystem        _strcmp
__DATA  __la_symbol_ptr  0x100008040 0x006E libSystem        _strlen

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...