ABI Mach-O
Mach-0(Mach Object) 是mac0S、i0S、iPa dOS存储程序和库的文件格式。对应系统通过应用二进制接口(appLication binary interface, 缩写为ABI) 来运行该格式的文件。Mach-0格式用来替代BSD系统的a.out格式。
Mach-0文件格式保存了在编译过程和链接过程中产生的机器代码和数据, 从而为静态链接和动态链接的代码提供了单一文件格式。
之前段始终是4096字节或4KB的倍数,其中4096字节是最小大小。
现在段是16KB的倍数, 在macOS_x 86_64上是16k, 在iOS上是32k。
Symbol Table
通过两个load commands:
LC_SYMTAB:当前Mach-0中的符号表信息。
LC_DYSYMTAB:描述动态链接器使用其他的SymbolTable信息。
用来描述SymbolTable的大小和位置, 以及其他元数据。
LC_SYMTAB用来描述该文件的符号表。不论是静态链接器还是动态链接器在链接此文件时, 都要使用该Load command。调试器也可以使用该load command找到调试信息。
symtab_command
定义LC_SYMTAB加载命令具体属性。在/usr/incLude/mach-o/Loader.h中定义:
struct symtab_command{
//共有属性, 指明当前描述的加载命令, 当前被设置为LC_SYMTAB
uint 32_t cmd;
//共有属性。指明加载命令的大小, 当前被设置为sizeof(symtab_command)
uint 32_t cmd size;
//表示从文件开始到symboltable所在位置的偏移量。symboltable用[n list] 来表示
uint 32_t sym off;
//符号表内符号的数量
uint 32_tn syms;
//表示从文件开始到string table所在位置的偏移量
uint3z_ts troff;
//表示string table大小(以byte为单位)
uint 32_t str size;
};
nlist
定义符号的具体表示含义
struct n list{
//表示该符号在string table的索引
union{
//在Mach-0中不使用此字段
char“n_name;
//索引
longn_str x;
}n_un;
unsigned charn_type;/*type flag, see below*/
unsigned charn_sect;/*section number or NO_SECT*/
short n_desc; /*see<mach-o/stab.h>*/
unsigned long n_value;/*value of this symbol Cor stab offset) */
};
section名称与作用
名称 作用
TEXT.text 可执行的机器码
TEXT.cstring 去重后的C字符串
TEXT.const 初始化过的常量
TEXT.stubs 符号桩。lazy binding的表对应项指针指向的地址的代码
TEXT.stub_helper 辅助函数。当在lazy binding的表中没有找到对应项的指针表示的真正的符号地址的时候, 指向这。
TEXT.unwind_info 存储处理异常情况信息
TEXT.eh_frame 调试辅助信息
DATA.data 初始化过的可变的数据
DATA.nl_symbol_ptr 非lazy-binding的指针表, 每个表中的指针指向一个在装载过程中, 被动态链接器搜索完成的符号
DATA.la_symbol_ptr lazy-binding的指针表, 每个表中的指针一开始指向stub_helper
DATA.const 没有初始化过的常量
DATA.mod_in it_func 初始化函数, 在main之前调用
DATA.mod_term_func 终止函数, 在main返回之后调用
DATA.bss 没有初始化的静态变量
DATA.common 没有初始化过的符号声明(for example, inti; )
nm命令
打印 nlist 结构的符号表(symbol table)。
常用nm命令参数
nm -pa a.o
-a: 显示符号表的所有内容
-g: 显示全局符号
-p: 不排序,显示符号表本来的顺序
-r: 逆转顺序
-u 显示未定义符号
-m: 显示N_SECT类型的符号(Mach-O符号)显示
网友评论