ELF(Executable and Linkable Format,可执行与可链接格式)
文件类型
file SimpleSection.o
1、可重定位文件(relocatable):xxx.o、xxx.a
2、可执行文件(executable)
3、共享目标文件(shared object):xxx.so
4、核心转储文件(core dump)
代码段(.text):指令
数据段(.data):已初始化的全局变量和局部静态变量
BSS(Block Started by Symbol)段(.bss):未初始化的全局变量和局部静态变量
只读数据段(.rodata):只读变量和常量
文件头
readelf -h SimpleSection.o
typedef struct elf32_hdr{
unsigned char e_ident[EI_NIDENT];
Elf32_Half e_type;
Elf32_Half e_machine;
Elf32_Word e_version;
Elf32_Addr e_entry; /* Entry point */
Elf32_Off e_phoff;
Elf32_Off e_shoff;
Elf32_Word e_flags;
Elf32_Half e_ehsize;
Elf32_Half e_phentsize;
Elf32_Half e_phnum;
Elf32_Half e_shentsize;
Elf32_Half e_shnum;
Elf32_Half e_shstrndx;
} Elf32_Ehdr;
段表
readelf -S SimpleSection.o
typedef struct elf32_shdr {
Elf32_Word sh_name;
Elf32_Word sh_type;
Elf32_Word sh_flags;
Elf32_Addr sh_addr;
Elf32_Off sh_offset;
Elf32_Word sh_size;
Elf32_Word sh_link;
Elf32_Word sh_info;
Elf32_Word sh_addralign;
Elf32_Word sh_entsize;
} Elf32_Shdr;
![](https://img-blog.csdnimg.cn/direct/4a00a2dbbed643e0a7996668a74bdf0d.png)
重定位表
readelf -r SimpleSection.o
.rel.text
.rel.data
typedef struct elf32_rel {
Elf32_Addr r_offset;
Elf32_Word r_info;
} Elf32_Rel;
字符串表
readelf -x 11 SimpleSection.o
.strtab
段表字符串表
readelf -x 12 SimpleSection.o
.shstrtab
符号表
readelf -s SimpleSection.o
.symtab
typedef struct elf32_sym{
Elf32_Word st_name;
Elf32_Addr st_value;
Elf32_Word st_size;
unsigned char st_info;
unsigned char st_other;
Elf32_Half st_shndx;
} Elf32_Sym;
函数和变量统称为符号
符号类型
1、STT_NOTYPE,未知类型
2、STT_OBJECT,变量
3、STT_FUNC,函数
4、STT_SECTION,段名
5、STT_FILE,文件名
对于非COMMON的STT_OBJECT和STT_FUNC,st_shndx表示符号所在的段在段表中的下标,st_value表示偏移
对于COMMON的STT_OBJECT,st_shndx = SHN_COMMON,st_value表示符号的对齐属性
强符号和弱符号
针对本文件的符号定义
默认函数和已初始化的全局变量为强符号,未初始化的全局变量为弱符号
__attribute__ ((weak))
强引用和弱引用
针对外部文件的符号引用
强引用:如果符号未定义,ld报错;弱引用:如果符号未定义,ld不报错,默认其为0
__attribute__ ((weakref))
程序头表
readelf -l SimpleSection.elf
![](https://img-blog.csdnimg.cn/direct/d89ec9e990a949baba65b79932e1eb2a.png)