您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 经营企划 > 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的结构ELFheaderELFheaderProgramheadertable(optional)ProgramheadertableSection1Segment1…Segment2Sectionn……………SectionheadertableSectionheadertable(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_MAG00e_ident[EI_MAG0]toe_ident[EI_MAG3]:文件的前4个字符保存一个魔术数(magicnumber),用来确定该文件是否为ELF的目标文件。参见表7-7EI_MAG11EI_MAG22EI_MAG33EI_CLASS4e_ident[EI_CLASS],用来确定文件的类型或者说是容量。参见表1-8EI_DATA5e_ident[EI_DATA]指定了在目标文件中特定处理器数据的编码方式。参见表1-9EI_VERSION6e_ident[EI_VERSION]表明了ELF头的版本号现在这个变量的值一定要设为EV_CURRENT,参见表7-5EI_OSABI7操作系统和ABI的标识EI_ABIVERSION8ABI版本EI_PAD9e_ident[EI_PAD]标识了在e_ident中开始的未使用的字节,那些字节保留并被设置为0。程序把它们从目标文件中读出但应该忽略。如果当前未被使用的字节有了新的定义,EI_PAD变量将会被改变。EI_NIDENT16e_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.outa.out:fileformatelf32-i386architecture:i386,flags0x00000112:EXEC_P,HAS_SYMS,D_PAGEDstartaddress0x080483dc程序头ProgramHeader:PHDRoff0x00000034vaddr0x08048034paddr0x08048034align2**2filesz0x000000c0memsz0x000000c0flagsr-xINTERPoff0x000000f4vaddr0x080480f4paddr0x080480f4align2**0filesz0x00000019memsz0x00000019flagsr--LOADoff0x00000000vaddr0x08048000paddr0x08048000align2**12filesz0x00000564memsz0x00000564flagsr-xLOADoff0x00000564vaddr0x08049564paddr0x08049564align2**12filesz0x000000a8memsz0x000000ccflagsrw-DYNAMICoff0x0000059cvaddr0x0804959cpaddr0x0804959calign2**2filesz0x00000070memsz0x00000070flagsrw-NOTEoff0x00000110vaddr0x08048110paddr0x08048110align2**2filesz0x00000018memsz0x00000018flagsr--Dynamic节DynamicSection:NEEDEDlibc.so.4INIT0x8048390FINI0x8048550HASH0x8048128STRTAB0x80482c8SYMTAB0x80481b8STRSZ0xadSYMENT0x10DEBUG0x0PLTGOT0x8049584PLTRELSZ0x18PLTREL0x11JMPREL0x8048378节头表Sections:IdxNameSizeVMALMAFileoffAlgn0.interp00000019080480f4080480f4000000f42**0CONTENTS,ALLOC,LOAD,READONLY,DATA1.note.ABI-tag000000180804811008048110000001102**2CONTENTS,ALLOC,LOAD,READONLY,DATA2.hash000000900804812808048128000001282**2CONTENTS,ALLOC,LOAD,READONLY,DATA3.dynsym00000110080481b8080481b8000001b82**2CONTENTS,ALLOC,LOAD,READONLY,DATA4.dynstr000000ad080482c8080482c8000002c82**0CONTENTS,ALLOC,LOAD,READONLY,DATA5.rel.plt000000180804837808048378000003782**2CONTENTS,ALLOC,LOAD,READONLY,DATA6.init0000000b0804839008048390000003902**2CONTENTS,ALLOC,LOAD,READONLY,CODE7.plt000000400804839c0804839c0000039c2**2CONTENTS,ALLOC,LOAD,READONLY,CODE8.text00000
本文标题:linux可执行文件格式
链接地址:https://www.777doc.com/doc-840156 .html