ELF头
Object目标文件类型
- 一个可重定位(relocation)文件保存着代码和适当的数据,用来和其他的object文件一起创建一个可执行文件或一个共享文件。
- 一个可执行(executable)文件保存着一个用来执行的程序,该文件指出exec(BA_OS)如何创建程序进程映像。
- 一个共享object文件保存着代码和合适的数据,用来被链接器链接。第一个链接器[ld(SD_CMD)],可以和其他的可重定位和共享object文件来创建其他的object;第二个动态链接器,联合一个可执行文件和其他共享object文件来创建一个进程映像。
Object文件格式
数据表示
ELF Header结构体
#define EI_NIDENT 16
typedef struct{
unsigned char e_ident[EI_NIDENT];
Elf32_Half e_type;
Elf32_half e_machine;
Elf32_Word e_version;//目标文件的版本,若为0,则是无效的版本,若>=1,则指示当前版本号
Elf_Addr e_entry;//目标文件的入口地址
Elf_Off e_phoff;//程序头表在文件的偏移量(以字节计数),若没有程序头表,则为0
Elf_Off e_shoff;//section头表在文件的偏移量(以字节计数),若没有section头表,则为0
Elf32_Word e_flags;//保存相关文件的特定处理器标志,来自EF_<machine>_<flag>
Elf32_Half e_ehsize;//指示ELF头的大小
Elf32_Half e_phentsize;//程序头表成员大小
Elf32_Half e_phnum;//程序头表的成员个数
Elf32_Half e_shentsize;//section头表成员大小
Elf32_Half shnum;//section头表的成员数量
Elf32_Half e_shstrndx;//section表名字符串索引,若文件没有section名字符串,则该变量为SHN_UNDEF
}Elf32_Ehdr;
e_ident
e_indent[]数组解析目标文件的内容
Name | Index | Purpose |
---|---|---|
EI_MAG0 | 0 | File identification |
EI_MAG1 | 1 | File identification |
EI_MAG2 | 2 | File identification |
EI_MAG3 | 3 | File identification |
EI_CLASS | 4 | File class |
EI_DATA | 5 | Data encoding |
EI_VERSION | 6 | File version |
EI_PAD | 7 | Start of padding bytes |
EI_NIDENT | 16 | Size of e_ident[] |
1、EI_MAG0~EI_MAG3:保存着一个魔术数,用来确定该文件是否weiELF目标文件
2、EI_CLASS:确定文件的类型
3、EI_DATA:指示该文件的数据编码方式
Name | Value | Meaning |
---|---|---|
ELFDATANONE | 0 | 无效数据编码格式 |
ELFDATA2LSB | 1 | 大端编程格式 |
ELFDATA2MSB | 2 | 小端编程格式 |
e_type类型
确定目标文件的类型
Name | Value | Meaning |
---|---|---|
ET_NONE | 0 | No file type |
ET_REL | 1 | Relocatable file |
ET_EXEC | 2 | Executable file |
ET_DYN | 3 | Shared object file |
ET_CORD | 4 | Core file |
ET_LOPROC | 0xff00 | Processor-specific |
ET_HIPROC | 0xffff | Processor-specific |
e_machine
指出运行该程序需要的体系结构
Name | Value | Meaning |
---|---|---|
EM_NONE | 0 | No machine |
EM_M32 | 1 | AT&T WE 32100 |
EM_SPARC | 2 | SPARC |
EM_386 | 3 | Intel 80386 |
EM_68K | 4 | Motorola 68000 |
EM_88K | 5 | Motorola 88000 |
EM_860 | 7 | Intel 80860 |
EM_MIPS | 8 | MIPS RS3000 |
ELF节
section头表结构体
一个section对应一个section节头数据结构体
typedef struct
{
Elf32_Word sh_name; /* Section name (string tbl index) */
Elf32_Word sh_type; /* Section type */
Elf32_Word sh_flags; /* Section flags */
Elf32_Addr sh_addr; /* Section virtual addr at execution */
Elf32_Off sh_offset; /* Section file offset */
Elf32_Word sh_size; /* Section size in bytes */
Elf32_Word sh_link; /* Link to another section */
Elf32_Word sh_info; /* Additional section information */
Elf32_Word sh_addralign; /* Section alignment */
Elf32_Word sh_entsize; /* Entry size if section holds table */
} Elf32_Shdr;
section介绍
节名称 | 类型 | 属性 | 说明 |
---|---|---|---|
.bss | SHT_NOBITS | SHF_ALLOC + SHF_WRITE | 保存未初始化的数据,当程序开始运行时,系统初始化该section数据为0 |
.comment | SHT_PROGBITS | none | 保存版本控制信息 |
.data | SHT_PROGBITS | SHF_ALLOC + SHF_WRITE | 保存初始化的数据 |
.debug | SHT_PROGBITS | none | 保存标号调试信息 |
.dynamic | SHT_DYNAMIC | SHF_ALLOC [+ SHF_WRITE] | 保存动态链接的信息 |
.dynstr | SHT_STRTAB | SHF_ALLOC | 保存动态链接时需要的字符串,一般情况下,名字字符串关联着符号表的入口 |
.dynsym | SHT_DYNSYM | SHF_ALLOC | 保存着动态符号 |
.fini | SHT_PROGBITS | SHF_ALLOC + SHF_EXECINSTR | 进程的终止代码 |
.got | SHT_PROGBITS | 全局偏移量表 | |
.hash | SHT_HASH | SHF_ALLOC | 标号的哈希表 |
.init | SHT_PROGBITS | SHF_ALLOC + SHF_EXECINSTR | 进程的初始化代码 |
.interp | SHT_PROGBITS | 程序的解释程序的路径 | |
.line | SHT_PROGBITS | none | 编辑字符的行数信息 |
.note | SHT_NOTE | none | |
.plt | SHT_PROGBITS | 过程链接表 | |
.rel | SHT_REL | 重定位信息表 | |
.rela | SHT_RELA | 重定位信息表 | |
.rodata | SHT_PROGBITS | SHF_ALLOC | 只读数据 |
.shstrtab | SHT_STRTAB | none | section名称字符串表 |
…strtab | SHT_STRTAB | 字符串表 | |
.symtab | SHT_SYMTAB | 符号表 | |
.text | SHT_PROGBITS | HF_ALLOC + SHF_EXECINSTR | 可执行指令 |
符号表
/* Symbol table entry. */
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;
字符串表
符号值
重定位
/* Relocation table entry without addend (in section of type SHT_REL). */
typedef struct
{
Elf32_Addr r_offset; /* Address */
Elf32_Word r_info; /* Relocation type and symbol index */
} Elf32_Rel;
/* Relocation table entry with addend (in section of type SHT_RELA). */
typedef struct
{
Elf32_Addr r_offset; /* Address */
Elf32_Word r_info; /* Relocation type and symbol index */
Elf32_Sword r_addend; /* Addend */
} Elf32_Rela;
重定位类型
Linux命令行
1、file命令查看相应的文件格式
来源:CSDN
作者:DylanHe215
链接:https://blog.csdn.net/qq_24601427/article/details/103632821