符号

符号

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: 调试符号

你可能感兴趣的:(符号)