LLDB 符号转储

LLDB symbol dumps

我试图从 LLDB 中理解以下符号转储 shell

(lldb) target create --no-dependents '9.0/Symbols/Library/Application Support/WatchKit/WK'
Current executable set to '9.0/Symbols/Library/Application Support/WatchKit/WK' (armv7k).
(lldb) image list
[  0] 675ED1EB-BAA0-3453-B7B1-3E69310F40FD 0x00004000 9.0/Symbols/Library/Application Support/WatchKit/WK
(lldb) image dump symtab
Dumping symbol table for 1 modules.
Symtab, file = 9.0/Symbols/Library/Application Support/WatchKit/WK, num_symbols = 6:
               Debug symbol
               |Synthetic symbol
               ||Externally Visible
               |||
Index   UserID DSX Type            File Address/Value Load Address       Size               Flags      Name
------- ------ --- --------------- ------------------ ------------------ ------------------ ---------- ----------------------------------
[    0]      0     Code            0x0000000000007fcc                    0x0000000000000030 0x001e0000  stub helpers
[    1]      1   X Data            0x0000000000004000                    0x0000000000003fcc 0x000f0010 _mh_execute_header
[    2]      2   X ReExported                                                               0x000b0000 main -> /System/Library/PrivateFrameworks/SockPuppetGizmo.framework/SockPuppetGizmo`_SPApplicationMain
[    3]      3   X Undefined       0x0000000000000000                    0x0000000000000000 0x00010100 _SPApplicationMain
[    4]      4   X Undefined       0x0000000000000000                    0x0000000000000000 0x00010500 dyld_stub_binder
[    5]      5  S  Trampoline      0x0000000000007ffc                    0x0000000000000004 0x00000000 main

大部分我都能理解,因为有与符号相关的地址和大小,但其中一些我不理解。在这种情况下,有 2 个 "undefined" 符号,地址为 0x00,大小为 0x00。我的问题是这些符号是什么意思?这是否意味着它们在运行时得到解决,我真的不应该在试图理解崩溃日志中的内容时担心它们?

您的猜测是正确的,未定义符号是一个二进制文件想要从其他二进制文件使用的符号。当您的程序运行时,它们将由加载程序修复。

因此,例如,如果您编写标准 "hello world" 程序,则主二进制文件将具有 "printf" 的未定义符号。顺便说一句,这些与您在 nm.

的输出中看到的 U 类型的符号相同