符号表

作者: 凯歌948 | 来源:发表于2021-01-25 19:55 被阅读0次

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符号)显示

相关文章

  • dsym

    iOS开发时经常需要接触符号表的概念,本文主要分享符号表相关知识,包括什么是符号表,符号表的作用,符号表的产生过程...

  • iOS逆向基础03-符号表

    一.什么是符号表 我们都知道iOS可以通过符号表来恢复堆栈的调用,那么什么是符号表呢? 我们可以通过符号表来还原类...

  • Unity BuglySDK符号表接入

    什么是符号表? 符号表是内存地址与函数名、文件名、行号的映射表。符号表元素如下所示: 为什么要配置符号表? 为了能...

  • 杂记

    0624 符号表的理解 符号表的理解,以下内容摘自C++编译器符号表有哪些内容 符号表存储的内容有哪些?从编译器来...

  • 编译器笔记44-运行存储分配-符号表

    符号表 符号表的组织:为每个作用域(程序块)建立一个独立的符号表 根据符号表进行数据访问 标识符的基本处理方法 当...

  • iOS Crash 常用分析方法

    崩溃分析 崩溃日志(crash log) 根据符号表来监测崩溃位置 什么是符号表符号表就是指在Xcode项目编译后...

  • fishhook

    fishhook:前提,在符号表里的函数(动态加载才会在符号表里 原函数名+目标函数+原函数地址 1.找到符号表首...

  • iOS_Bug收集管理工具_Bugly

    一、集成Bugly 二、如何上传符号表到bugly平台? 目前只支持通过符号表工具上传,请下载符号表工具上传(内附...

  • Bugly网站中关于dSYM文件脚本自动上传几个注意点记录

    什么是符号表? 符号表是内存地址与函数名、文件名、行号的映射表。符号表元素如下所示: <起始地址> <结束地址> ...

  • Bugly iOS 符号表配置

    什么是符号表? 符号表是内存地址与函数名、文件名、行号的映射表。符号表元素如下所示: <起始地址> <结束地址> ...

网友评论

      本文标题:符号表

      本文链接:https://www.haomeiwen.com/subject/gyxyzktx.html