linux可执行文件格式.docx
《linux可执行文件格式.docx》由会员分享,可在线阅读,更多相关《linux可执行文件格式.docx(15页珍藏版)》请在冰点文库上搜索。
linux可执行文件格式
Linux可执行文件格式
•Elf也就是“ExecutableandLinkingFormat.”
•Elf起源于Unix,经改进应用于FreeBSD和Linux等现有类Unix操作系统。
•微软的PE格式也学习了ELF格式的优点。
•ELF文档服务于在不同的操作系统上目标文件的创建或者执行文件的开发。
它分以下三个部分:
•“目标文件”描述了ELF目标文件格式三种主要的类型。
•“程序装载和动态连接”描述了目标文件的信息和系统在创建运行时程序的行为。
•“C语言库”列出了所有包含在libsys中的符号、标准的ANSIC和libc的运行程序,还有libc运行程序所需的全局的数据符号。
三种主要类型:
•一个可重定位文件(relocatablefile)保存着代码和适当的数据,用来和其他的目标文件一起来创建一个可执行文件或者是一个共享文件。
•一个可执行文件(executablefile)保存着一个用来执行的程序,该文件指出了exec(BA_OS)如何来创建程序进程映象。
•一个共享目标文件(sharedobjectfile)保存着代码和合适的数据,用来被下面的两个链接器链接。
第一个是链接编辑器,可以和其他的重定位和共享目标文件来创建另一个目标文件。
第二个是动态链接器,联合一个可执行文件和其他的共享目标文件来创建一个进程映象。
ELF的结构
ELFheader
ELFheader
Programheadertable(optional)
Programheadertable
Section1
Segment1
…
Segment2
Sectionn
…
…
…
…
…
Sectionheadertable
Sectionheadertable(optional)
ELF头
•#defineEI_NIDENT16
•typedefstruct{
•unsignedchare_ident[EI_NIDENT];
•Elf32_Halfe_type;
•Elf32_Halfe_machine;
•Elf32_Worde_version;
•Elf32_Addre_entry;
•Elf32_Offe_phoff;
•Elf32_Offe_shoff;
•Elf32_Worde_flags;
•Elf32_Halfe_ehsize;
•Elf32_Halfe_phentsize;
•Elf32_Halfe_phnum;
•Elf32_Halfe_shentsize;
•Elf32_Halfe_shnum;
•Elf32_Halfe_shstrndx;
•}Elf32_Ehdr;
常用标示
名称
偏移量
目的
EI_MAG0
0
e_ident[EI_MAG0]toe_ident[EI_MAG3]:
文件的前4个字符保存一个魔术数(magicnumber),用来确定该文件是否为ELF的目标文件。
参见表7-7
EI_MAG1
1
EI_MAG2
2
EI_MAG3
3
EI_CLASS
4
e_ident[EI_CLASS],用来确定文件的类型或者说是容量。
参见表1-8
EI_DATA
5
e_ident[EI_DATA]指定了在目标文件中特定处理器数据的编码方式。
参见表1-9
EI_VERSION
6
e_ident[EI_VERSION]表明了ELF头的版本号。
现在这个变量的值一定要设为EV_CURRENT,参见表7-5
EI_OSABI
7
操作系统和ABI的标识
EI_ABIVERSION
8
ABI版本
EI_PAD
9
e_ident[EI_PAD]标识了在e_ident中开始的未使用的字节,那些字节保留并被设置为0。
程序把它们从目标文件中读出但应该忽略。
如果当前未被使用的字节有了新的定义,EI_PAD变量将会被改变。
EI_NIDENT
16
e_ident[]的长度
节
•一个目标文件的节头表可以让我们定位所有的节。
节头表是一个Elf32_Shdr结构的数组。
一个节头表的索引是这个数组的下标。
•ELF头结构中的e_shoff成员给出了节头表的偏移量(从文件开始计数)。
•e_shnum告诉我们节头表中包含了多少个表项;
•e_shentsize给出了每个表项的长度。
某些节头表索引是保留的,这些索引在目标文件中没有与之对应的节。
•typedefstruct{
•Elf32_Wordsh_name;
•Elf32_Wordsh_type;
•Elf32_Wordsh_flags;
•Elf32_Addrsh_addr;
•Elf32_Offsh_offset;
•Elf32_Wordsh_size;
•Elf32_Wordsh_link;
•Elf32_Wordsh_info;
•Elf32_Wordsh_addralign;
•Elf32_Wordsh_entsize;
•}Elf32_Shdr;
字符串表
•字符串表节(Stringtablesections)保存着以NULL终止的一系列字符,一般我们称为字符串。
目标文件使用这些字符串来表示符号和节名。
一个字符串的引用是一个字符串表节的索引。
字符表
•一个目标文件的符号表(symboltable)保存了定位和重定位程序的定义和引用的信息。
一个符号表索引是相应的下标。
0表项特指了该表的第一个表项,就象未定义的符号索引一样。
重定位(Relocation)
•重定位(Relocation)是链接符号引用和符号定义的过程。
比如,当一个程序调用一个函数的时候,相关的调用必须在执行时把控制传送到正确的目标地址。
换句话说,重定位文件应当包含如何修改他们的节内容的信息,从而允许可执行文件或共享目标文件为一个进程的程序映像保存正确的信息。
程序头
•一个可执行的或共享的目标文件的程序头表是一个结构数组,每一个结构描述一个段或其他系统准备执行该程序所需要的信息。
一个目标文件段包含一个或多个部分(就象下面的“段目录”所描述的那样)。
程序头仅仅对于可执行或共享的目标文件有意义。
•typedefstruct{
•Elf32_Wordp_type;
•Elf32_Offp_offset;
•Elf32_Addrp_vaddr;
•Elf32_Addrp_paddr;
•Elf32_Wordp_filesz;
•Elf32_Wordp_memsz;
•Elf32_Wordp_flags;
•Elf32_Wordp_align;
•}Elf32_Phdr;
段内容实例
TextSegmentDataSegment
程序载入
当创建或增加一个进程映像的时候,系统在逻辑上将拷贝一个文件的段到一个虚拟的内存段
动态链接
•程序解释器(ProgamInterpreter)
–系统为解释器“编写”了一个内存映像,而不是使用原始的可执行文件的段映像。
此时该解释器就负责接收来自系统的控制并且为应用程序提供一个环境变量。
•动态链接器(DynamicLinker)
–当使用动态链接方式建立一个可执行文件时,链接器把一个PT_INTERP类型的元素加到可执行文件中,告诉系统像该系统的解释器一样调用动态链接器。
•动态节(DynamicSection)
–如果一个目标文件参与动态的链接,它的程序头表将有一个类型为PT_DYNAMIC的元素。
该“段”包含了.dynamic节。
一个_DYNAMIC特别的符号,表明了该节包含了以下结构的一个数组。
•共享目标的依赖关系(SharedObjectDependencies)
–当链接器处理一个文档库时,它取出库中成员并且把它们拷贝到一个输出的目标文件中。
当运行时没有包括一个动态链接器的时候,那些静态的链接服务是可用的。
共享目标也提供服务,动态链接器必须把正确的共享目标文件链接到要执行的进程映象中。
因此,可执行文件和共享的目标文件之间存在着明确的依赖性。
•全局偏移量表(GlobalOffsetTable,GOT)
–全局偏移量表在私有数据中保存着绝对地址,所以在不影响位置无关性和程序代码段共享能力的情况下应该使地址是可用的。
一个程序参考它的GOT(使用位置无关的地址)并提取绝对的地址,所以与重定向无关的位置定位到绝对的位置。
•PLT过程连接表(ProcedureLinkageTable)
–正如GOT重定位把位置无关的地址计算成绝对地址一样,PLT过程链接表重定向那些与位置无关的函数调用到绝对的地址。
简单的C程序及其ELF格式信息
intxx,yy;
main()
{
xx=1;
yy=2;
printf("xx%dyy%d\n",xx,yy);
}
ELF头信息
root#objdump-fa.out
a.out:
fileformatelf32-i386
architecture:
i386,flags0x00000112:
EXEC_P,HAS_SYMS,D_PAGED
startaddress0x080483dc
程序头
ProgramHeader:
PHDRoff0x00000034vaddr0x08048034paddr0x08048034align2**2
filesz0x000000c0memsz0x000000c0flagsr-x
INTERPoff0x000000f4vaddr0x080480f4paddr0x080480f4align2**0
filesz0x00000019memsz0x00000019flagsr--
LOADoff0x00000000vaddr0x08048000paddr0x08048000align2**12
filesz0x00000564memsz0x00000564flagsr-x
LOADoff0x00000564vaddr0x08049564paddr0x08049564align2**12
filesz0x000000a8memsz0x000000ccflagsrw-
DYNAMICoff0x0000059cvaddr0x0804959cpaddr0x0804959calign2**2
filesz0x00000070memsz0x00000070flagsrw-
NOTEoff0x00000110vaddr0x08048110paddr0x08048110align2**2
filesz0x00000018memsz0x00000018flagsr--
Dynamic节
DynamicSection:
NEEDEDlibc.so.4
INIT0x8048390
FINI0x8048550
HASH0x8048128
STRTAB0x80482c8
SYMTAB0x80481b8
STRSZ0xad
SYMENT0x10
DEBUG0x0
PLTGOT0x8049584
PLTRELSZ0x18
PLTREL0x11
JMPREL0x8048378
节头表
Sections:
IdxNameSizeVMALMAFileoffAlgn
0.interp00000019080480f4080480f4000000f42**0
CONTENTS,ALLOC,LOAD,READONLY,DATA
1.note.ABI-tag000000180804811008048110000001102**2
CONTENTS,ALLOC,LOAD,READONLY,DATA
2.hash000000900804812808048128000001282**2
CONTENTS,ALLOC,LOAD,READONLY,DATA
3.dynsym00000110080481b8080481b8000001b82**2
CONTENTS,ALLOC,LOAD,READONLY,DATA
4.dynstr000000ad080482c8080482c8000002c82**0
CONTENTS,ALLOC,LOAD,READONLY,DATA
5.rel.plt000000180804837808048378000003782**2
CONTENTS,ALLOC,LOAD,READONLY,DATA
6.init0000000b0804839008048390000003902**2
CONTENTS,ALLOC,LOAD,READONLY,CODE
7.plt000000400804839c0804839c0000039c2**2
CONTENTS,ALLOC,LOAD,READONLY,CODE
8.text00000174080483dc080483dc000003dc2**2CONTENTS,ALLOC,LOAD,READONLY,CODE
9.fini000000060804855008048550000005502**2
CONTENTS,ALLOC,LOAD,READONLY,CODE
10.rodata0000000e0804855608048556000005562**0
CONTENTS,ALLOC,LOAD,READONLY,DATA
11.data0000000c0804956408049564000005642**2
CONTENTS,ALLOC,LOAD,DATA
12.eh_frame000000040804957008049570000005702**2
CONTENTS,ALLOC,LOAD,DATA
13.ctors000000080804957408049574000005742**2
CONTENTS,ALLOC,LOAD,DATA
14.dtors000000080804957c0804957c0000057c2**2
CONTENTS,ALLOC,LOAD,DATA
15.got000000180804958408049584000005842**2
CONTENTS,ALLOC,LOAD,DATA
16.dynamic000000700804959c0804959c0000059c2**2
CONTENTS,ALLOC,LOAD,DATA
17.bss000000240804960c0804960c0000060c2**2
ALLOC
18.stab000001bc00000000000000000000060c2**2
CONTENTS,READONLY,DEBUGGING
19.stabstr000003880000000000000000000007c82**0
CONTENTS,READONLY,DEBUGGING
20.comment000000c8000000000000000000000b502**0
符号表
SYMBOLTABLE:
080480f4ld.interp00000000
08048110ld.note.ABI-tag00000000
08048128ld.hash00000000
080481b8ld.dynsym00000000
080482c8ld.dynstr00000000
08048378ld.rel.plt00000000
08048390ld.init00000000
0804839cld.plt00000000
080483dcld.text00000000
08048550ld.fini00000000
08048556ld.rodata00000000
08049564ld.data00000000
08049570ld.eh_frame00000000
08049574ld.ctors00000000
0804957cld.dtors00000000
08049584ld.got00000000
0804959cld.dynamic00000000
•0804960cld.bss00000000
•00000000ld.stab00000000
•00000000ld.stabstr00000000
•00000000ld.comment00000000
•00000000ld.note00000000
•00000000ld*ABS*00000000
•00000000ld*ABS*00000000
•00000000ld*ABS*00000000
•00000000ldf*ABS*00000000crtstuff.c
•08048460l.text00000000gcc2_compiled.
•08049568lO.data00000000p.3
•0804957clO.dtors00000000__DTOR_LIST__
•0804956clO.data00000000completed.4
•08048460lF.text00000000__do_global_dtors_aux
•08049570lO.eh_frame00000000__EH_FRAME_BEGIN__
080484b4lF.text00000000fini_dummy
0804960clO.bss00000018object.11
080484bclF.text00000000frame_dummy
080484e0lF.text00000000init_dummy
08049570lO.data00000000force_to_data
08049574lO.ctors00000000__CTOR_LIST__
00000000ldf*ABS*00000000crtstuff.c
08048520l.text00000000gcc2_compiled.
08048520lF.text00000000__do_global_ctors_aux
08049578lO.ctors00000000__CTOR_END__
08048548lF.text00000000init_dummy
08049570lO.data00000000force_to_data
08049580lO.dtors00000000__DTOR_END__
08049570lO.eh_frame00000000__FRAME_END__
00000000ldf*ABS*00000000p10.c
080483acF*UND*00000031printf
0804959cgO*ABS*00000000_DYNAMIC
08048550gO*ABS*00000000_etext
08048390gF.init00000000_init
08049624gO.bss00000004environ
00000000w*UND*00000000__deregister_frame_info
08049630gO*ABS*00000000end
08049628gO.bss00000004xx
08049564gO.data00000004__progname
080483dcgF.text00000083_start
0804960cgO*ABS*00000000__bss_start
080484e8gF.text00000038main
08048550gF.fini00000000_fini
0804962cgO.bss00000004yy
080483bcF*UND*00000070atexit
0804960cgO*ABS*00000000_edata
08049584gO*ABS*00000000_GLOBAL_OFFSET_TABLE_
08049630gO*ABS*00000000_end
080483ccF*UND*0000005bexit
00000000w*UND*00000000__register_frame_info
动态符号表
DYNAMICSYMBOLTABLE:
080483acDF*UND*00000031printf
0804959cgDO*ABS*00000000_DYNAMIC
08048550gDO*ABS*00000000_etext
08048390gDF.init00000000_init
08049624gDO.bss00000004environ
00000000wD*UND*00000000__deregister_frame_info
08049630gDO*ABS*00000000end
08049564gDO.data00000004__progname
0804960cgDO*ABS*00000000__bss_start
08048550gDF.fini00000000_fini
080483bcDF*UND*00000070atexit
0804960cgDO*ABS*00000000_edata
08049584gDO*ABS*00000000_GLOBAL_OFFSET_TABLE_
08049630