【问题标题】:How does the `-n` option to `image lookup` in LLDB operate compared to the `-s` option?与 `-s` 选项相比,LLDB 中`image lookup` 的`-n` 选项如何操作?
【发布时间】:2019-09-10 07:49:17
【问题描述】:

我知道-s 选项会在符号表 (image dump symtab) 中搜索与 <symbol> 匹配的符号。

但是,我不明白-n 选项是如何运作的。它从-s 返回不同的结果,如果它没有在符号表中搜索函数/符号,它在哪里寻找<function-or-symbol>

help image lookup:

-s <symbol> ( --symbol <symbol> )
            Lookup a symbol by name in the symbol tables in one or more target modules.

-n <function-or-symbol> ( --name <function-or-symbol> )
            Lookup a function or symbol by name in one or more target modules.

【问题讨论】:

    标签: ios macos debugging lldb


    【解决方案1】:

    官方GDB to LLDB command map reference说:

    This one finds debug symbols:
    (lldb) image lookup -r -n <FUNC_REGEX>
    
    This one finds non-debug symbols:
    (lldb) image lookup -r -s <FUNC_REGEX>
    
    Provide a list of binaries as arguments to limit the search. 
    

    所以,image lookup -n 只搜索调试符号,而 image lookup -s 搜索非调试符号。

    【讨论】:

      【解决方案2】:

      在 lldb 中,“符号表”是指链接器和加载器用于从名称到可调用对象的表。所以 -s 不会查询调试信息。

      lldb 的约定是使用“函数”而不是“符号”来表示来自调试信息的可调用对象的表示。所以 -n 将查询链接器/加载器的符号表信息和调试信息以匹配给定的名称。

      【讨论】:

      • 谢谢。然而,对于一个简单的“HelloWorld”C 程序,-n 如何返回比-s 更少的结果?根据您的回答,-s 将始终是同一搜索字符串的-n 的子集。另外,“链接器”是指在运行时调用的“动态链接器”?
      • -n 应该同时查看两者。如果不是,那就是一个错误。
      • 至于“链接器”,我指的是链接器编写的符号表。如果您在二进制文件上查看 nm 的输出 - 这是转储链接器符号表的命令 - 您会看到很多 T 符号 - 这些是导出的 TEXT 符号 - 这些是加载器 (= = 动态链接器)读取。但是也有很多t 符号。这些是加载程序不会读取的未导出符号,但链接器将它们与导出符号放在同一个表中。 -s 将从链接器的符号表中查询导出和未导出的符号。
      • t 符号始终存在于未剥离的调试版本中,但操作系统框架通常会保留其中一些未导出的符号,因为它们使通过框架的回溯更容易理解。
      • 谢谢!我的表达是链接器只为 Mach-O 目标文件(例如可执行文件)创建一个符号表? - 或最多两个,一个用于导出符号,一个用于导入符号。
      猜你喜欢
      • 1970-01-01
      • 2020-03-19
      • 2011-10-24
      • 2018-10-27
      • 1970-01-01
      • 2013-09-08
      • 1970-01-01
      • 2014-05-04
      • 1970-01-01
      相关资源
      最近更新 更多