符号表

2021-01-25  本文已影响0人  凯歌948

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符号)显示
上一篇 下一篇

猜你喜欢

热点阅读