交流
商城
MCN
登入
注册
首页
提问
分享
讨论
建议
公告
动态
发表新帖
发表新帖
2 ELF头
分享
未结
0
2666
李延
LV6
2022-07-17
悬赏:20积分
# 1 ELF 头 ELF 头,文件开始的最前部分,描述这个文件的一些基本信息。我们可以在linux的服务器的`/usr/include/elf.h` 这个文件中找到它的结构定义 ```c typedef struct { unsigned char e_ident[EI_NIDENT]; /* 魔数固定的ELF, EI_NIDENT 为16个字节 */ Elf64_Half e_type; /* 该文件的类型 2字节 */ Elf64_Half e_machine; /* 该程序需要的体系架构 2字节 */ Elf64_Word e_version; /* 文件的版本 4字节 */ Elf64_Addr e_entry; /* 程序的入口地址 8字节 */ Elf64_Off e_phoff; /* Program header table(程序) 在文件中的偏移量 8字节 */ Elf64_Off e_shoff; /* Section header table(节头表) 在文件中的偏移量 8字节 */ Elf64_Word e_flags; /* Processor-specific flags */ Elf64_Half e_ehsize; /* 表示ELF header大小 2字节 */ Elf64_Half e_phentsize; /* 表示Program header table中每一个条目的大小 2字节 */ Elf64_Half e_phnum; /* 表示Program header table中有多少个条目 2字节 */ Elf64_Half e_shentsize; /* 表示Section header table中的每一个条目的大小 2字节 */ Elf64_Half e_shnum; /* 表示Section header table中有多少个条目 2字节 */ Elf64_Half e_shstrndx; /* 包含节名称的字符串是第几个节 2字节 */ } Elf64_Ehdr; ``` 上面几种类型的自动类型为: | 类型名称 | 具体类型 | 字节长度 | | ---------- | -------- | -------- | | Elf64_Half | uint16_t | 16bit | | Elf64_Word | uint32_t | 32bit | | Elf64_Addr | uint64_t | 64bit | | Elf64_Off | uint64_t | 64bit | | | | | # 2 示例 上面我们列出来头部的存储结构,下面我们以前面main.c文件为例,进行说明 ## 2.1 c语言代码 ```c #include <stdio.h> int main(){ printf("Hello, World!\n"); return 0; } ``` ## 2.2 编译后内容 使用gcc编译 ```sh gcc -c main.s ``` 通过vscode 查看main.o文件  这里只截取了前64字节,分析 | 字段 | 值 | 含义 | | ----------- | ----------------------- | --------------------------------------------------------- | | e_ident | | 前16个字节,为固定内容,开发4个字节固定为7F和ELF | | e_type | 01 00 | 2字节,值为01.表示文件类型,可以不关注 | | e_machine | 3E 00 | 2字节,值为62,表示体系架构 | | e_version | 01 00 00 00 | 4字节,值为 01,文件版本 | | e_entry | 00 00 00 00 00 00 00 00 | 程序的入口地址 8字节,因为这个还不是可执行文件,所以值为0 | | e_phoff | 00 00 00 00 00 00 00 00 | 程序的位置,与函数入口相同,不是可执行文件,所以没有 | | e_shoff | A0 02 00 00 00 00 00 00 | 节头表的位置在0x02A0处 | | e_flags | 00 00 00 00 | Processor-specific flags,可以不关注 | | e_ehsize | 40 | 2字节,文件头大小,64个字节 | | e_phentsize | 00 | 2字节,表示Program header table中每一个条目的大小 | | e_phnum | 00 | 2字节,表示Program header table中有多少个条目 | | e_shentsize | 00 | 2字节,表示Section header table中的每一个条目的大小 | | e_shnum | 0c | 2字节,表示Section header table中有12个条目 | | e_shstrndx | 00 | 2字节包含节名称的字符串是第几个节 | 整体分析下来,在目前阶段,对我们有用的形象不多,主要包括 - e_ehsize elf头大小 - e_shoff:节头表位置 - e_shnum: 节头表数量 # 3 objdump 上面我们对照二进制分析了一下elf头的内容,但这样分析太复杂,我们可以借助objdump命令,直接查看 ```sh objdump -f main.o ``` 结果 ```c main.o: file format elf64-x86-64 architecture: i386:x86-64, flags 0x00000011: HAS_RELOC, HAS_SYMS start address 0x0000000000000000 ``` 我们可以看到打印了文件的相关格式,与运行系统,已经程序入口的地址。
回帖
消灭零回复
提交回复
热议榜
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应用
微信扫码关注公众号