本文共 1933 字,大约阅读时间需要 6 分钟。
ELF(Executable and Linkable Format,可执行连接格式)是Linux系统中用于存储程序和库的文件格式。ELF文件可分为三种类型:
.a
和.o
文件。bash
、gcc
等。.so
文件。目标文件在程序链接和执行过程中发挥重要作用。
ELF文件头位于文件开头,记录文件的组织信息。通过分析ELF文件头,我们可以了解文件的类型、体系结构、版本、入口点等关键信息。
e_ident
:16字节,包含文件特性和机器无关信息,开头固定值为0x7f
和ELF字符。e_type
:2字节,文件类型标识。e_machine
:2字节,运行所需的体系结构。e_version
:4字节,文件版本。e_entry
:4字节,程序入口地址。e_phoff
:4字节,程序头表偏移。e_shoff
:4字节,段表偏移。e_flags
:4字节,处理器特定标志。e_ehsize
:2字节,文件头大小。e_phentsize
:2字节,程序头表条目大小。e_phnum
:2字节,程序头表条目数。e_shentsize
:2字节,段头表条目大小。e_shnum
:2字节,段头表条目数。e_shstrndx
:2字节,段名称字符串表在段头表中的索引。编写一个简单的C程序elf1.c
:
#includevoid main() { int a = 20135318; printf("Hello %d", a);}
生成目标文件elf1.o
:
gcc -c elf1.c -o elf1.o
使用ls -l elf1.o
查看文件大小:
ls -l elf1.o
文件大小为1032字节。使用readelf -a elf1.o
查看ELF头信息。
通过readelf -a elf1.o
获取ELF头信息:
e_ident
:7f454c46010101000000000000000000
,表示这是一个ELF32文件。e_type
:0x0001
,表示是可重定向文件。e_machine
:0x0003
,表示Intel 80386体系结构。e_version
:0x00000001
,表示文件版本。e_entry
:0x00000000
,没有入口点。e_phoff
:0x00000000
,程序头表偏移为0。e_shoff
:0x00000124
,段表偏移为124字节。e_ehsize
:0x34
,文件头大小为52字节。e_phentsize
:0x0000
,程序头表条目大小为0。e_phnum
:0x0000
,程序头表条目数为0。e_shentsize
:0x0028
,段头表条目大小为32字节。e_shnum
:0x000d
,段头表条目数为13。e_shstrndx
:0x000a
,段名称字符串表在段头表中的索引为10。使用objdump -x elf1.o
查看段信息:
使用readelf -s elf1.o
查看段信息:
.text
段:存储可执行指令,偏移为0x000034
,大小为0x0000192
。.data
段:存储全局变量,偏移为0x0000440
,大小为0x0000192
。.strtab
:存储字符串,偏移为0x0001f08
,大小为0x0000238
。.symtab
:存储符号名称,偏移为0x00018f0
,大小为0x0000618
。.rodata
:存储只读数据,偏移为0x00005e0
,大小为0x000000c
。通过hexdump -s 52 -n 39 -C elf1
查看.text
段内容:
00000000000000000000000000000000 00000000000000000000000000000000
通过objdump -d elf1
反汇编获取指令码:
00000000000000000000000000000000 00000000000000000000000000000000
通过对ELF文件头、段表和符号表的分析,我们可以深入理解ELF文件的组织结构和内存布局。这对于程序开发、调试和优化具有重要意义。
转载地址:http://iqkfk.baihongyu.com/