交流
商城
MCN
登入
注册
首页
提问
分享
讨论
建议
公告
动态
发表新帖
发表新帖
5 ELF节-符号表,systab
分享
未结
0
2875
李延
LV6
2022-07-17
悬赏:20积分
# 1 作用 符号表主要有以下作用: - 定义本文件中的全局符号,可被其他文件引用,如:函数、全局变量 - 本文件中引用的符号,但在本文件中没有定义的外部符号 - 段名 - 局部符号 - 行号信息 # 2 结构 ```c typedef struct { Elf32_Word st_name; /* Symbol name (string tbl index) */ Elf32_Addr st_value; /* Symbol value */ Elf32_Word st_size; /* Symbol size */ unsigned char st_info; /* Symbol type and binding */ unsigned char st_other; /* Symbol visibility */ Elf32_Section st_shndx; /* Section index */ } Elf32_Sym; typedef struct { Elf64_Word st_name; /* Symbol name (string tbl index) 32位 */ unsigned char st_info; /* Symbol type and binding 8为*/ unsigned char st_other; /* Symbol visibility 8位*/ Elf64_Section st_shndx; /* Section index 16位*/ Elf64_Addr st_value; /* Symbol value 64位*/ Elf64_Xword st_size; /* Symbol size 64位*/ } Elf64_Sym; ``` - St_name 符号名称,对应字符串中的下标 - St_value 符号表中对应的值, - St_size 符号大小 - St_info 符号类型与绑定信息, - St_other 目前为0, - St_shndx 符号所在的段 64位时,共24个字节。 ## 2.1 st_info 高4位表示绑定类型,低4位表示符号类型,具体如下  ## 2.2 st_shndex 表示符号这个成员所在段表的下标,如果符号不在定义的本文件中,使用特殊符号,包括: - SHN_ABS 0xfff1 - SHN_COMMON 0xfff2 - SHN_UNDEF 0 表示符号未定义 # 3 命令查看 ```c readelf -s call1.o ``` # 3 函数定义 ## 3.1 已知函数 对于如代码 ```c int sun1(){ return 1; } int sun2(){ return 1; } int main(){ return sun1()+sun2(); } ```  我们可以看到有3个函数定义在里面,同样我们可以找到对于二进制文件:在0x120到0x228字节处  我们以函数sun2进行分析:  应为是大端,所以需要反过来查看,对于关系如下: | 字段 | 内容 | 含义 | | -------- | ---- | -------------------------------------- | | st_name | 0x0E | 就是在strtab节中的索引,在第15个字节处 | | st_info | 0x12 | 全局变量、是个函数 | | st_other | 0x0 | - | | st_shndx | 0x01 | 下标为1的段。.test段 | | st_value | 0x0B | 表示在.test的0b处 | | st_size | 0x0B | 表示大小为0b | | | | | ## 3.2 未知函数 对于如下代码: ```c int sun1(); int sun2(); int main(){ return sun1()+sun2(); } ``` 结果如下:  这里主要改变的是st_info为 0x10 :从函数变为了未知类型 ## 3.3 static 局部函数 依旧是之前代码,加上static修饰 ```c static int sun1(){ return 1; } static int sun2(){ return 1; } int main(){ return sun1()+sun2(); } ``` 符号表中结果,sun2为:  st_info为 0x02: 绑定信息变为局部符号。 # 4 全局变量 ```c struct book{ char *name; int size; }; struct book a = {"c语言设计",100}; struct book b = {"c语言设计2",300}; int q = 3; extern int cc; int main(){ return a.size +b.size+q+cc; } ``` 这里我们定义了3种不同的变量。我们依次解析: ## 4.1 extern  st_info为 0x10,未知类型,全局符号 ## 4.2 int  | 字段 | 内容 | 含义 | | -------- | ---- | --------------------- | | st_name | 0x0f | - | | st_info | 0x11 | 全局变量、数据对象 | | st_other | 0x0 | - | | st_shndx | 0x03 | 下标为3的段。.data段 | | st_value | 0x20 | 数据值在.data的0x20处 | | st_size | 0x04 | 占4个字节 | ## 4.3 struct  基本与int相似,只是: - st_value 值为0x10 - st_size 0x10 表示占用16个字节
回帖
消灭零回复
提交回复
热议榜
java 相关知识分享
8
好的程序员与不好的程序员
6
写给工程师的十条精进原则
5
spring boot以jar包运行配置的logback日志文件没生成
5
一步一步分析SpringBoot启动源码(一)
5
MockMvc测试
5
【吐槽向】是不是有个吐槽的板块比较好玩
4
logstash jdbc同步mysql多表数据到elasticsearch
3
IntelliJ IDEA 优质License Server
3
.gitignore忽略规则
3
SpringBoot启动源码分析
3
一步一步分析SpringBoot启动源码(三)
3
2
一步一步分析SpringBoot启动源码(二)
2
积分不够将无法发表新帖
2
官方产品
Meta-Boot - 基于MCN
MCN - 快速构建SpringBoot应用
微信扫码关注公众号