符号

作者: iOS小洁 | 来源:发表于2022-12-18 20:32 被阅读0次

    符号

    1、符号表种类:

    • Symbol Table : 用来保存符号
    • String Table : 用来保存符号的名称
    • Indirect Symbol Table: 间接符号表。保存使用的外部符号。更准确一点就是使用的外部动态库的符号。是Symbol Table的子集

    2、符号区分:

    • 按存在空间划分

      • non private external
      • weak private external
    • 按照模块划分

      • weak global
      • weak local
    • 按功能划分

      • f(file)、F(function)、O(Data)、d(Debug)、*ABS*(Absolute)、*COM*(Common)、*UND*(?)
    • 按符号种类划分

      • U undefined(未定义)
    • A absolute(绝对符号)

      • T text section symbol(__TEXT.__text)
    • D data section symbol(__DATA.__data)

      • B bss section symbol(__DATA.__bss)
    • C common symbol(只能出现在MH_OBJECT 类型的Mach-O⽂件中)

      • - debugger symbol table
    • S 除了上⾯所述的,存放在其他section的内容,例如未初始化的全局变量存放在(__DATA,__common)中

      • I indirect symbol(符号信息相同,代表同⼀符号)
    • u 动态共享库中的⼩写u表示⼀个未定义引⽤对同⼀库中另⼀个模块中私有外部符号

    3、导⼊(Import)导出(Export)符号:

    • export symbol:导出表表示一个符号,其他文件可以将其导⼊(Import)
    • Import symbol:导入其他库的符号

    4、two_levelnamespace & flat_namespace:

    ⼆级命名空间与⼀级命名空间。链接器默认采⽤⼆级命名空间,也就是除了会记录符号 名称,还会记录符号属于哪个动态库的,⽐如会记录下来_NSLog来⾃Foundation。

    5、Weak Symbol:

    • Weak Reference Symbol: 表示此未定义符号是弱引⽤。如果动态链接器找不到该符号的定义,则将其符 为0。静态链接器会将此符号设置弱链接标志。
    • Weak defintion Symbol: 表示此符号为弱定义符号。如果静态链接器或动态链接器为此符号找到另⼀个(⾮弱)定义,则弱定义将被忽略。只能将合并部分中的符号标记为弱定义。

    6、Common Symbol:

    在定义时,未初始化的全局符号。

    链接器设置:

    • -d: 强制定义Common Symbol。
    • -commons: 指定对待Common Symbol如何响应。

    strip命令

    strip用来移除或修改符号表中的符号

    间接符号不能删除

    strip动态库的时候,不能strip全局符号

    Strip Style:在Xcode build setting中配置

    • Debugging Symbols:调试符号
    • All Symbols:全部符号
    • Non-Global Symbols:除全局符号外的所有符号

    Strip Debugging Symbols流程:

    1. 将Mach-O 解析成模型Object
    2. 遍历LoadCommands
    3. 找到Segname==__DWARF的LoadCommand
    4. 移除Section
    5. 从符号表中移除Symbol
    6. 将修改后的模型Object重新写入Mach-O

    Strip All Symbols 流程

    1. Strip Debugging Symbols
    2. markSymbols
    3. 除了间接符号表中引用的符号全部删除

    Strip Non-Global Symbols流程:

    1. Strip Debugging Symbols
    2. 遍历符号表
    3. 删除n_tyoe != N_EXT的符号. (n_tyoe != N_EXT, 为外部符号)

    strip命令参数:

    1. -x: non_global
    2. 无参数: 代表全部符号
    3. -S: 调试符号

    相关文章

      网友评论

        本文标题:符号

        本文链接:https://www.haomeiwen.com/subject/slesqdtx.html