【问题标题】:How to print all symbols that a mach-o binary imports from dylibs?如何打印从 dylibs 导入的 mach-o 二进制文件的所有符号?
【发布时间】:2020-12-29 23:46:04
【问题描述】:

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

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

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

【问题讨论】:

    标签: macos mach-o otool


    【解决方案1】:

    您可以使用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
    

    【讨论】:

    • nm -u -m /bin/echo 可以更轻松地查看此信息。
    • @bdash 谢谢你们的有用回答。
    猜你喜欢
    • 1970-01-01
    • 2010-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 2014-09-04
    • 2010-09-21
    • 1970-01-01
    相关资源
    最近更新 更多