如何打印 mach-o 二进制文件从 dylibs 导入的所有符号?
How to print all symbols that a mach-o binary imports from 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
我是 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