linux目标文件ELF的格式

发布时间:2022-11-12 00:11:59阅读:41次
系统大全为您提供  <spanstyle="font-family:Arial,Helvetica,sans-serif;background-color:rgb(255,255,255);"></span><spanstyle="font-family:Arial,Helvetica,sans-serif;background-color:rgb(255,255,255);">现在PC上流行的可执行文件格式主要是windows下的PE和linux下的ELF文件,他们都是COFF格式文件变种。目标文件时源代码编译后但未进行链接的那些中间文件,它跟可执行文件的格式几乎没有什么区别,因此目标文件(.o文件)也和可执行文件使用一样的储存格式。</span>在linux中除了可执行文件还有几种文件也是使用ELF格式储存的,其中包括动态库文件(.so),可重定位文件(.o),核心转储文件(进程终止时系统将一些进程信息储存到该类型的文件)。我们可以使用file命令查看文件类型eg:?123xiang@xiang:~/workspacenux$fileprimprim:ELF32-bitLSBexecutable,Intel80386,version1(SYSV),dynamicallylinked(usessharedlibs),forGNU/Linux2.6.24,BuildID[sha1]=0xd54ce2ecedb22482c79f597093ff8c0b8f7c7113,notstrippedxiang@xiang:~/workspacenux$关于ELF文件的格式,其中包含了文件头(fileheader),代码段(.text),数据段(.data)未初始化数据段(.bss)等,通过objdump命令可以查看各个段的信息。?123456789101112131415161718192021222324xiang@xiang:~/workspace/algorithm$g++-cprim.cpp-oprim.oxiang@xiang:~/workspace/algorithm$objdump-hprim.oprim.o:fileformatelf32-i386Sections:IdxNameSizeVMALMAFileoffAlgn0.text0000031f0000000000000000000000342**2CONTENTS,ALLOC,LOAD,RELOC,READONLY,CODE1.data000000000000000000000000000003542**2CONTENTS,ALLOC,LOAD,DATA2.bss003d3c210000000000000000000003602**5ALLOC3.rodata000000080000000000000000000003602**2CONTENTS,ALLOC,LOAD,READONLY,DATA4.ctors000000040000000000000000000003682**2CONTENTS,ALLOC,LOAD,RELOC,DATA5.comment0000002c00000000000000000000036c2**0CONTENTS,READONLY6.note.GNU-stack000000000000000000000000000003982**0CONTENTS,READONLY7.eh_frame000000dc0000000000000000000003982**2CONTENTS,ALLOC,LOAD,RELOC,READONLY,DATAxiang@xiang:~/workspace/algorithm$objdump-hprim1,文件头(fileheader)在文件头中包含了文件的魔数,机器字长,版本,运行平台,文件类型,入口地址,短信息等内容,其中魔数用于告诉系统文件的类型,如ELF文件的魔数就是DEL符+ELF,2,代码,数据段这些段非常熟悉,需要说明的一点就是.data段包含的是已经初始化的全局变量和静态变量,而。bss段包含的时未初始化的全局变脸和静态变量。其中有些文件中还存在。rodata段,存放只读数据段。另外在.bss段中的变量的默认值为0,因此.bss在elf文件中实际上并不占用空间,只是在装载的时候需要分配虚拟内存空间。3. 段表,段表是elf文件除了文件头之外最重要的一个数据结构,其中包含了elf的各个段的信息,如每个段的段名,段的长度,在文件中的偏移,读写权限等,elf文件中的段结构就是由段表决定的,编译器,链接器装载器都是通过段表进行访问各个段的,段表的位置文件头中e_shoff决定,是在文件中的相对偏移。4,重定位表,链接器的作用是链接多个目标文件,在一个文件中变量引用或函数引用可能定义在其他的目标文件中,而这些符号引用需要使用绝对地址。对于这些符号引用需要放在一个特定的段中,这个段就是重定位表。代码段的重定位信息放在.rel.text中,数据段的重定位信息放在.rel.data中。5,字符串表,在ELF文件中有好多字符串,如段名,变量名,因为字符串的长度往往是不确定的,使用固定的结构来表示比较困难,一种常用的方法就是将所有的字符串放在一个单独的表中,而使用该字符串的地方只需要有个对该字符串的引用就可以了。6,符号表,为了能将不同的目标文件链接起来,需要解决不同目标文件之间的相互引用问题。为了解决这个问题,在每个文件中存在很多符号表,其中包括全局符号表,外部符号表,局部符号等。其中全局符号包含定义在本目标文件中的全局符号,这些符号可以被其他的目标文件引用,外部符号包含了在本目标文件中引用,却未在本目标文件中定义的符号。局部符号,指只有在编译单元内部可见的符号,在链接的过程中没有实际作用,链接器一般会忽略他们。关于符号还涉及函数签名,强符号,弱符号等问题。  以上就是系统大全给大家介绍的如何使的方法都有一定的了解了吧,好了,如果大家还想了解更多的资讯,那就赶紧点击系统大全官网吧。本文来自系统大全http://www.win7cn.com/如需转载请注明!推荐:win7纯净版