符號(hào)
1、符號(hào)表種類(lèi):
- Symbol Table : 用來(lái)保存符號(hào)
- String Table : 用來(lái)保存符號(hào)的名稱(chēng)
- Indirect Symbol Table: 間接符號(hào)表。保存使用的外部符號(hào)迁匠。更準(zhǔn)確一點(diǎn)就是使用的外部動(dòng)態(tài)庫(kù)的符號(hào)。是Symbol Table的子集
2渠啤、符號(hào)區(qū)分:
-
按存在空間劃分
- non private external
- weak private external
-
按照模塊劃分
- weak global
- weak local
-
按功能劃分
- f(file)态贤、F(function)端辱、O(Data)得哆、d(Debug)脯颜、*ABS*(Absolute)、*COM*(Common)贩据、*UND*(?)
-
按符號(hào)種類(lèi)劃分
- U unde?ned(未定義)
-
A absolute(絕對(duì)符號(hào))
- 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(只能出現(xiàn)在
MH_OBJECT
類(lèi)型的Mach-O
?件中)-
-
debugger symbol table
-
-
S 除了上?所述的栋操,存放在其他
section
的內(nèi)容闸餐,例如未初始化的全局變量存放在(__DATA,__common
)中- I indirect symbol(符號(hào)信息相同,代表同?符號(hào))
u 動(dòng)態(tài)共享庫(kù)中的?寫(xiě)u表示?個(gè)未定義引?對(duì)同?庫(kù)中另?個(gè)模塊中私有外部符號(hào)
3讼庇、導(dǎo)?(Import)導(dǎo)出(Export)符號(hào):
- export symbol:導(dǎo)出表表示一個(gè)符號(hào)绎巨,其他文件可以將其導(dǎo)?(Import)
- Import symbol:導(dǎo)入其他庫(kù)的符號(hào)
4近尚、two_levelnamespace & ?at_namespace:
?級(jí)命名空間與?級(jí)命名空間蠕啄。鏈接器默認(rèn)采??級(jí)命名空間,也就是除了會(huì)記錄符號(hào) 名稱(chēng)戈锻,還會(huì)記錄符號(hào)屬于哪個(gè)動(dòng)態(tài)庫(kù)的歼跟,?如會(huì)記錄下來(lái)_NSLog來(lái)?Foundation。
5格遭、Weak Symbol:
- Weak Reference Symbol: 表示此未定義符號(hào)是弱引?哈街。如果動(dòng)態(tài)鏈接器找不到該符號(hào)的定義,則將其符 為0拒迅。靜態(tài)鏈接器會(huì)將此符號(hào)設(shè)置弱鏈接標(biāo)志骚秦。
- Weak defintion Symbol: 表示此符號(hào)為弱定義符號(hào)。如果靜態(tài)鏈接器或動(dòng)態(tài)鏈接器為此符號(hào)找到另?個(gè)(?弱)定義璧微,則弱定義將被忽略作箍。只能將合并部分中的符號(hào)標(biāo)記為弱定義。
6前硫、Common Symbol:
在定義時(shí)胞得,未初始化的全局符號(hào)。
鏈接器設(shè)置:
- -d: 強(qiáng)制定義Common Symbol屹电。
- -commons: 指定對(duì)待Common Symbol如何響應(yīng)阶剑。
strip命令
strip用來(lái)移除或修改符號(hào)表中的符號(hào)
間接符號(hào)不能刪除
strip動(dòng)態(tài)庫(kù)的時(shí)候,不能strip全局符號(hào)
Strip Style:在Xcode build setting中配置
- Debugging Symbols:調(diào)試符號(hào)
- All Symbols:全部符號(hào)
- Non-Global Symbols:除全局符號(hào)外的所有符號(hào)
Strip Debugging Symbols流程:
- 將Mach-O 解析成模型Object
- 遍歷LoadCommands
- 找到
Segname==__DWARF
的LoadCommand - 移除Section
- 從符號(hào)表中移除Symbol
- 將修改后的模型Object重新寫(xiě)入Mach-O
Strip All Symbols 流程
- Strip Debugging Symbols
- markSymbols
- 除了間接符號(hào)表中引用的符號(hào)全部刪除
Strip Non-Global Symbols流程:
- Strip Debugging Symbols
- 遍歷符號(hào)表
- 刪除
n_tyoe != N_EXT
的符號(hào). (n_tyoe != N_EXT, 為外部符號(hào))
strip命令參數(shù):
- -x: non_global
- 無(wú)參數(shù): 代表全部符號(hào)
- -S: 調(diào)試符號(hào)