⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 elf.txt

📁 序言 1. OBJECT文件 导言 ELF头(ELF Header) Sections String表(String Table) Symbol表(Symbol Table)
💻 TXT
📖 第 1 页 / 共 5 页
字号:
		elf文件格式--
			另一文本方式的elf文档

write by breadbox Email:breadbox@muppetlabs.com		

译:alert7 < alert7@21cn.com > from m4in security team  
   			      http://www.patching.net
   isearthling < isearthling@163.net >
  					19:45 2001-5-16
译者注:
   由于翻译者水平有限(包括技术水平和翻译水平:(),所以
   有些地方或许比较难懂,可能还有理解错误的地方,如果有
   任何的问题,欢迎email:alert7@21cn.com
   我们会虚心接受的,会在以后的修订中更正过来。
   (总不能误导后来的读者,所以如果你英文比较好的话,还
   是看原版吧:),不要丢鸡蛋啊^_^)
   
这份文档和原始的那份ELF文件格式的文档有以下一个不同:

1. 忽略了分页记数 。
2. 因为上述原因,在这篇内容目录中去掉了页号,索引完全被忽略。
   (不象Postscript文档,txt文本可以用来搜索)
3. 页标题的内容和文章的页脚已经在开始的时候被换掉了。
4. 文章的排版也已经修正过了。
5. 如果必要,不同的字体已经被忽略了。大部分地方,这片文档能让你
   充分的理解。然而,很小的地方,原始的文档使用了斜体字来指出文
   章中的字符变量。在那种情况下,本文使用<尖括号>。在原始的文档
   中没有出现尖括号。
6. 原始的文档有三个错误,如果你是不经意读它的话,是不会明显
   就能找出的。但是在这里,明确的被鉴别出来了。
   我很冒昧的纠正了那些错误。在他们的位置用一个{*}做上了标记。
   可能还有其他我没有看出来的的错误。

如果有如何其他的区别都是我的责任。这样的错误请
mailto:breadbox@muppetlabs.com.

Brian Raiter
[Last edited Fri Jul 23 1999]

   ________________________________________________________________


		 EXECUTABLE AND LINKABLE FORMAT (ELF)

	     Portable Formats Specification, Version 1.1
		    Tool Interface Standards (TIS)

   ________________________________________________________________


   =========================== Contents 内容===========================


   序言
1. OBJECT文件
   导言
   ELF头(ELF Header)
   Sections
   String表(String Table)
   Symbol表(Symbol Table)
   重定位(Relocation)
2. 程序装载与动态连接
   导言
   Program头(Program Header)
   Program装载(Program Loading)
   Dynamic连接(Dynamic Linking)
3. C LIBRARY
   C Library

   ________________________________________________________________


			          导言

   ________________________________________________________________


		  ELF: 可执行连接格式

可执行连接格式是UNIX系统实验室(USL)作为应用程序二进制接口
(Application Binary Interface(ABI)而开发和发布的。工具接口标准委
员会(TIS)选择了正在发展中的ELF标准作为工作在32位INTEL体系上不同操
作系统之间可移植的二进制文件格式。

假定开发者定义了一个二进制接口集合,ELF标准用它来支持流线型的软件
发展。 应该减少不同执行接口的数量。因此可以减少重新编程重新编译的
代码。


			 关于这片文档

这篇文档是为那些想创建目标文件或者在不同的操作系统上执行文件的开发
着准备的。它分以下三个部分:

* 第一部分, “目标文件Object Files”描述了ELF目标文件格式三种主要
  的类型。
* 第二部分, “程序转载和动态连接”描述了目标文件的信息和系统在创建
  运行时程序的行为。
* 第三部分, “C 语言库”列出了所有包含在libsys中的符号,标准的ANSI C
  和libc的运行程序,还有libc运行程序所需的全局的数据符号。

注意: 参考的X86体系已经被改成了Intel体系。

   ________________________________________________________________


			   1. 目标文件(Object file)

   ________________________________________________________________


   ========================= 序言 =========================


第一部分描述了iABI的object文件的格式, 被称为ELF(Executable
and Linking Format). 在object文件中有三种主要的类型。

* 一个可重定位(relocatable)文件保存着代码和适当的数据,用来和其他的
  object文件一起来创建一个可执行文件或者是一个共享文件。
* 一个可执行(executable)文件保存着一个用来执行的程序;该文件指出了
  exec(BA_OS)如何来创建程序进程映象。
* 一个共享object文件保存着代码和合适的数据,用来被下面的两个链接器
  链接。第一个是连接编辑器[请参看ld(SD_CMD)],可以和其他的可重定位和
  共享object文件来创建其他的object。第二个是动态链接器,联合一个
  可执行文件和其他的共享object文件来创建一个进程映象。

一个object文件被汇编器和联接器创建, 想要在处理机上直接运行的object
文件都是以二进制来存放的。那些需要抽象机制的程序,比如象shell脚本,
是不被接受的。

在介绍性的材料过后,第一部分主要围绕着文件的格式和关于如何建立程序。
第二部分也描述了object文件的几个组成部分,集中在执行程序所必须的信息上。


			     文件格式

Object文件参与程序的联接(创建一个程序)和程序的执行(运行一个程序)。
object 文件格式提供了一个方便有效的方法并行的视角看待文件的内容,
在他们的活动中,反映出不同的需要。例 1-1图显示了一个object文件的
组织图。

+ 图1-1: Object文件格式

  Linking 视角                      Execution 视角
  ============                      ==============
  ELF header                        ELF header
  Program header table (optional)   Program header table
  Section 1                         Segment 1
  ...                               Segment 2
  Section n                         ...
  Section header table              Section header table (optional)

一个ELF头在文件的开始,保存了路线图(road map),描述了该文件的组织情况。
sections保存着object 文件的信息,从连接角度看:包括指令,数据,
符号表,重定位信息等等。特别sections的描述会出项在以后的第一部分。
第二部分讨论了段和从程序的执行角度看文件。

假如一个程序头表(program header table)存在,那么它告诉系统如何来创建一
个进程的内存映象。被用来建立进程映象(执行一个程序)的文件必须要有一个程
序头表(program header table);可重定位文件不需要这个头表。一个
section头表(section header table)包含了描述文件sections的信息。每个
section在这个表中有一个入口;每个入口给出了该section的名字,大小,
等等信息。在联接过程中的文件必须有一个section头表;其他object文件可要
可不要这个section头表。

注意: 虽然图显示出程序头表立刻出现在一个ELF头后,section头表跟着其他
section部分出现,事实是的文件是可以不同的。此外,sections和段(segments)
没有特别的顺序。只有ELF头(elf header)是在文件的固定位置。


			 数据表示
object文件格式支持8位、32位不同的处理器。不过,它试图努力的在更大
或更小的体系上运行。因此,object文件描绘一些控制数据需要用与机器
无关的格式,使它尽可能的用一般的方法甄别object文件和描述他们的内容。
在object文件中剩余的数据使用目标处理器的编码方式,不管文件是在哪台
机子上创建的。

+ 图 1-2: 32-Bit Data Types

  Name           Size Alignment   Purpose
  ====           ==== =========   =======
  Elf32_Addr      4       4       Unsigned program address
  Elf32_Half      2       2       Unsigned medium integer
  Elf32_Off       4       4       Unsigned file offset
  Elf32_Sword     4       4       Signed large integer
  Elf32_Word      4       4       Unsigned large integer
  unsigned char   1       1       Unsigned small integer

所有的object文件格式定义的数据结构是自然大小(natural size),为相关
的类型调整指针。如果需要,数据结构中明确的包含了确保4字节对齐的填
充字段。来使结构大小是4的倍数。数据从文件的开始也有适当的对齐。
例如,一个包含了Elf32_Addr成员的结构将会在文件内对齐到4字节的边界上。

因为移植性的原因,ELF不使用位字段。


   ========================== ELF Header ==========================


一些object文件的控制结构能够增长的,所以ELF头包含了他们目前的大小。
假如object文件格式改变,程序可能会碰到或大或小他们不希望的控制结构。
程序也有可能忽略额外(extra)的信息。
对待来历不明(missing)的信息依靠上下文来解释,假如扩展被定义,它们
将会被指定。

+ 图 1-3: ELF Header

  #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

  这个最初的字段标示了该文件为一个object文件,提供了一个机器无关
  的数据,解释文件的内容。在下面的ELF的鉴别(ELF Identification)
  部分有更详细的信息。

* e_type

  该成员确定该object的类型。

               Name        Value  Meaning
               ====        =====  =======
               ET_NONE         0  No file type
               ET_REL          1  Relocatable file
               ET_EXEC         2  Executable file
               ET_DYN          3  Shared object file
	       ET_CORE         4  Core file
	       ET_LOPROC  0xff00  Processor-specific
	       ET_HIPROC  0xffff  Processor-specific

  虽然CORE的文件内容未被指明,类型ET_CORE是保留的。
  值从 ET_LOPROC 到 ET_HIPROC(包括ET_HIPROC)是为特殊的处理器保留的。
  如有需要,其他保留的变量将用在新的object文件类型上。

* e_machine

  该成员变量指出了运行该程序需要的体系结构。

                    Name      Value  Meaning
	            ====      =====  =======
                    EM_NONE       0  No machine
		    EM_M32        1  AT&T WE 32100
                    EM_SPARC      2  SPARC
                    EM_386        3  Intel 80386
                    EM_68K        4  Motorola 68000
                    EM_88K        5  Motorola 88000
                    EM_860        7  Intel 80860
                    EM_MIPS       8  MIPS RS3000

  如有需要,其他保留的值将用到新的机器类型上。特殊处理器名使用机器名来
  区别他们。例如,下面将要被提到的成员flags使用前缀EF_;在一台EM_XYZ机器
  上,flag称为WIDGET,那么就称为EF_XYZ_WIDGET。

* e_version

  这个成员确定object文件的版本。

                 Name         Value  Meaning
                 ====         =====  =======
                 EV_NONE          0  Invalid version
		 EV_CURRENT       1  Current version

  值1表示原来的文件格式;创建新版本就用>1的数。EV_CURRENT值(上面给
  出为1)如果需要将指向当前的版本号。

* e_entry

  该成员是系统第一个传输控制的虚拟地址,在那启动进程。假如文件没有
  如何关联的入口点,该成员就保持为0。

* e_phoff

  该成员保持着程序头表(program header table)在文件中的偏移量(以字节计数)。
  假如该文件没有程序头表的的话,该成员就保持为0。

* e_shoff

  该成员保持着section头表(section header table)在文件中的偏移量(以字节
  计数)。假如该文件没有section头表的的话,该成员就保持为0。

* e_flags

  该成员保存着相关文件的特定处理器标志。
  flag的名字来自于EF_<machine>_<flag>。看下机器信息“Machine Information”
  部分的flag的定义。

* e_ehsize

  该成员保存着ELF头大小(以字节计数)。

* e_phentsize

  该成员保存着在文件的程序头表(program header table)中一个入口的大小
  (以字节计数)。所有的入口都是同样的大小。

* e_phnum

  该成员保存着在程序头表中入口的个数。因此,e_phentsize和e_phnum
  的乘机就是表的大小(以字节计数).假如没有程序头表(program header table),
  e_phnum变量为0。

* e_shentsize

  该成员保存着section头的大小(以字节计数)。一个section头是在section
  头表(section header table)的一个入口;所有的入口都是同样的大小。

* e_shnum

  该成员保存着在section header table中的入口数目。因此,e_shentsize和
  e_shnum的乘积就是section头表的大小(以字节计数)。
  假如文件没有section头表,e_shnum值为0。

* e_shstrndx

  该成员保存着跟section名字字符表相关入口的section头表(section header 
  table)索引。假如文件中没有section名字字符表,该变量值为SHN_UNDEF。
  更详细的信息 看下面“Sections”和字符串表(“String Table”) 。

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -