符号
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
)
- T text section symbol(
-
D data section symbol(
__DATA.__data
)- B bss section symbol(
__DATA.__bss
)
- B bss section symbol(
-
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流程:
- 将Mach-O 解析成模型Object
- 遍历LoadCommands
- 找到
Segname==__DWARF
的LoadCommand - 移除Section
- 从符号表中移除Symbol
- 将修改后的模型Object重新写入Mach-O
Strip All Symbols 流程
- Strip Debugging Symbols
- markSymbols
- 除了间接符号表中引用的符号全部删除
Strip Non-Global Symbols流程:
- Strip Debugging Symbols
- 遍历符号表
- 删除
n_tyoe != N_EXT
的符号. (n_tyoe != N_EXT, 为外部符号)
strip命令参数:
- -x: non_global
- 无参数: 代表全部符号
- -S: 调试符号
网友评论