图1
3 .数据显示
ELF数据编码顺序与机器相关,数据类型有6种,见表1。
4.
ELF文件头
像bmp、exe等文件一样,ELF的文件标题包含整个文件的控制结构。 定义如下
#define EI_NIDENT
16
typedef struct{
unsigned char e_ident[EI_NIDENT];
Elf32_Half
e_type;
Elf32_Half e_machine;
Elf32_Word e_version;
Elf32_Addr
e_entry;
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;
其中E_ident的16个字节表示ELF文件
(7F 'E' 'L' 'F' class )
数据版本号)。 E_type表示文件类型,2表示可执行文件。 E_machine说明机器种类,3是386台机器,8是
MIPS机器。 E_entry给出进程开始的虚拟地址。 这意味着系统控制转移的位置。 E_phoff表示程序
头儿
表的文件偏移,e_phentsize表示程序
header表中条目的长度(以字节数表示),e_phnum给出program
header表中的条目数。 同样,e_shoff,e_shentsize,e_shnum
分别表示section
header表的文件偏移、表中每个条目的字节数和条目数。 E_flags给出与处理器相关的标记,e_ehsize是ELF文件的头部的长度(字节数)
中选择所需的族。 E_shstrndx表示section名表的位置,表示section
header表中的索引。
以下是elf文件标头的示例: 请参见图2。
图2
5.
安全头
目标文件的安全头
table可以找到所有的section。 这是Elf32_Shdr结构的数组,section头表的索引是该数组的下标。 某些索引编号是保留的,无法在目标文件中使用这些特殊索引。
Section中含有除了ELF文件头部、程序标题表、Section标题表之外的目标文件的所有信息,目标文件Section满足几个条件:
)1)目标文件中的每个section只有一个section头部描述,可以存在不指示任何section的section头部描述。
)每个section在文件中占用一个连续的空间。
)3) Section之间不能重叠。
(4)目标文件可以具有非活动区域,各种headers和sections未复盖目标文件的每个字节,并且未定义这些非活动区域。
安全
头结构定义如下。
typedef struct{
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;
此处,sh_name表示section的名称,其值将在后面叙述
安全
头儿
斯汀
table中的索引,指示以null结尾的字符串。 Sh_type是类别,sh_flags表示进程运行时section的特性。 Sh_addr
如果此section出现在进程的内存映像中,则表示提供开始的虚拟地址。 Sh_offset提供文件中此section的偏移。 其他字段的意思不太好,
这里不详细叙述。
的section包含程序和控制信息,系统使用特定的section
有固定的类型和属性(由sh_type和sh_info表示)。 此处介绍一些常用的section:“.bss”部分包含占用程序内存映像的未初始化数
根据,在程序开始运行时,系统最初将此数据归零,但此section不占用文件空间。 “. data .”和“data1”部分包含占用内存映像的初始化数据。
. rodata和. rodata1部分包含程序映像中的只读数据。 shstrtab部分包含每个section的名称,并由section条目结构化
的sh_name索引。 ".strtab "部分包含表示符号的表" symbol "
table )名称的字符串。 symtab部分包含文件的符号表。 这个将在后面叙述。 text部分包含程序的可执行指令。
6.
符号表
目标文件中的符号表包含放置或重新定位程序符号定义和参照所需的信息。 符号表的入口结构定义如下:
typedef
struct{
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;
其中st_name包含符号表字符串表(strtab )的索引,可以执行以下操作
符号名称。 St_value表示符号的值,可以是绝对值、地址等。 St_size表示与符号相关的内存大小,例如一个数据结构中包含的字节数。
St_info定义符号的类型和绑定属性,并指示该符号是数据名称、函数名称、section名称还是源文件名称。 表示符号的绑定属性为local,
全球还是微信?
posted on 2009-05-26 14:43龙读(321 )注释)0)编辑收藏引用