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

📄 elf.txt

📁 序言 1. OBJECT文件 导言 ELF头(ELF Header) Sections String表(String Table) Symbol表(Symbol Table)
💻 TXT
📖 第 1 页 / 共 5 页
字号:

* SHT_DYNAMIC

  该section保存着动态连接的信息。当前的,一个object可能只有一个动态
  的section,但是,将来这个限制可能被取消。详细细节看第二部分的动态
  section(“Dynamic Section”)。

* SHT_NOTE

  该section保存着其他的一些标志文件的信息。详细细节看第二部分的“Note 
  Section” 。

* SHT_NOBITS

  该类型的section在文件中不占空间,但是类似SHT_PROGBITS。尽管该section
  不包含字节,sh_offset成员包含了概念上的文件偏移量。

* SHT_REL

  该section保存着具有明确加数的重定位的入口。
  就象object文件32位类型Elf32_Rel类型。一个object文件可能有多个
  重定位的sections。具体细节看重定位``Relocation''部分。

* SHT_SHLIB

  该section类型保留但语意没有指明。包含这个类型的section的程序
  是不符合ABI的。

* SHT_LOPROC through SHT_HIPROC

  在这范围之间的值为特定处理器语意保留的。

* SHT_LOUSER

  该变量为应用程序保留的索引范围的最小边界。

* SHT_HIUSER

  该变量为应用程序保留的索引范围的最大边界。在SHT_LOUSER和HIUSER的
  section类型可能被应用程序使用,这和当前或者将来系统定义的section
  类型是不矛盾的。

其他section类型的变量是保留的。前面提到过,索引0(SHN_UNDEF)的section
头存在的,甚至索引标记的是未定义的section引用。这个入口保存着以下的
信息。

+ 图1-11: Section Header Table Entry: Index 0

  Name            Value    Note
  ====            =====    ====
  sh_name           0      No name
  sh_type        SHT_NULL  Inactive
  sh_flags          0      No flags
  sh_addr           0      No address
  sh_offset         0      No file offset
  sh_size           0      No size
  sh_link	SHN_UNDEF  No link information
  sh_info	    0      No auxiliary information
  sh_addralign	    0      No alignment
  sh_entsize        0      No entries

一个section报头(section header table)的sh_flags成员保存着1位标记,
用来描述section的属性。以下是定义的值;其他的值保留。

+ 图1-12: Section Attribute Flags, sh_flags

  Name                Value
  ====                =====
  SHF_WRITE             0x1
  SHF_ALLOC             0x2
  SHF_EXECINSTR         0x4
  SHF_MASKPROC   0xf0000000

假如在sh_flags中的一个标记位被设置,该section相应的属性也被打开。
否则,该属性没有被应用。未明的属性就设为0。

* SHF_WRITE

  该section包含了在进程执行过程中可被写的数据。
 
* SHF_ALLOC

  该section在进程执行过程中占据着内存。一些控制section不存在一个
  object文件的内存映象中;对于这些sections,这个属性应该关掉。

* SHF_EXECINSTR

  该section包含了可执行的机器指令。

* SHF_MASKPROC

  所有的包括在这掩码中的位为特定处理语意保留的。

在section报头中,两个成员sh_link和sh_info的解释依靠该section的类型。

+ 图1-13: sh_link and sh_info Interpretation

  sh_type      sh_link                        sh_info
  =======      =======                        =======
  SHT_DYNAMIC  The section header index of    0
               the string table used by
               entries in the section.
  SHT_HASH     The section header index of    0
               the symbol table to which the
               hash table applies.
  SHT_REL,     The section header index of    The section header index of
  SHT_RELA     the associated symbol table.   the section to which the
                                              relocation applies.
  SHT_SYMTAB,  The section header index of    One greater than the symbol
  SHT_DYNSYM   the associated string table.   table index of the last local
                                              symbol (binding STB_LOCAL).
  other        SHN_UNDEF                      0


		Special Sections   特殊的Sections

不同的sections保存着程序和控制信息。下面列表中的section被系统使用,
指示了类型和属性。

+ 图1-14: Special Sections

  Name         Type           Attributes
  ====         ====           ==========
  .bss         SHT_NOBITS     SHF_ALLOC+SHF_WRITE
  .comment     SHT_PROGBITS   none
  .data        SHT_PROGBITS   SHF_ALLOC+SHF_WRITE
  .data1       SHT_PROGBITS   SHF_ALLOC+SHF_WRITE
  .debug       SHT_PROGBITS   none
  .dynamic     SHT_DYNAMIC    see below
  .dynstr      SHT_STRTAB     SHF_ALLOC
  .dynsym      SHT_DYNSYM     SHF_ALLOC
  .fini        SHT_PROGBITS   SHF_ALLOC+SHF_EXECINSTR
  .got         SHT_PROGBITS   see below
  .hash        SHT_HASH       SHF_ALLOC
  .init        SHT_PROGBITS   SHF_ALLOC+SHF_EXECINSTR
  .interp      SHT_PROGBITS   see below
  .line        SHT_PROGBITS   none
  .note        SHT_NOTE       none
  .plt         SHT_PROGBITS   see below
  .rel<name>   SHT_REL        see below
  .rela<name>  SHT_RELA       see below
  .rodata      SHT_PROGBITS   SHF_ALLOC
  .rodata1     SHT_PROGBITS   SHF_ALLOC
  .shstrtab    SHT_STRTAB     none
  .strtab      SHT_STRTAB     see below
  .symtab      SHT_SYMTAB     see below
  .text        SHT_PROGBITS   SHF_ALLOC+SHF_EXECINSTR

* .bss

  该sectiopn保存着未初始化的数据,这些数据存在于程序内存映象中。
  通过定义,当程序开始运行,系统初始化那些数据为0。该section不占
  文件空间,正如它的section类型SHT_NOBITS指示的一样。
  
* .comment

   该section保存着版本控制信息。

* .data and .data1
  这些sections保存着初始化了的数据,那些数据存在于程序内存映象中。

* .debug

  该section保存着为标号调试的信息。该内容是未指明的。

* .dynamic

  该section保存着动态连接的信息。该section的属性将包括SHF_ALLOC位。
  是否需要SHF_WRITE是跟处理器有关。第二部分有更详细的信息。

* .dynstr

  该section保存着动态连接时需要的字符串,一般情况下,名字字符串关联着
  符号表的入口。第二部分有更详细的信息。

* .dynsym

  该section保存着动态符号表,如“Symbol Table”的描述。第二部分有更
  详细的信息。
  
* .fini

  该section保存着可执行指令,它构成了进程的终止代码。
  因此,当一个程序正常退出时,系统安排执行这个section的中的代码。

* .got

  该section保存着全局的偏移量表。看第一部分的“Special Sections”和
  第二部分的“Global Offset Table”获得更多的信息。

* .hash

  该section保存着一个标号的哈希表。看第二部分的“Hash Table”获得更多
  的信息。

* .init

  该section保存着可执行指令,它构成了进程的初始化代码。
  因此,当一个程序开始运行时,在main函数被调用之前(c语言称为main),
  系统安排执行这个section的中的代码。

* .interp

  该section保存了程序的解释程序(interpreter)的路径。假如在这个section
  中有一个可装载的段,那么该section的属性的SHF_ALLOC位将被设置;否则,
  该位不会被设置。看第二部分获得更多的信息。 

* .line

  该section包含编辑字符的行数信息,它描述源程序与机器代码之间的对于
  关系。该section内容不明确的。

* .note

  该section保存一些信息,使用“Note Section”(在第二部分)中提到的格式。

* .plt

  该section保存着过程连接表(Procedure Linkage Table)。看第一部分的
  ``Special Sections''和第二部分的“Procedure Linkage Table”。

* .rel<name> and .rela<name>

  这些section保存着重定位的信息,看下面的``Relocation''描述。
  假如文件包含了一个可装载的段,并且这个段是重定位的,那么该section的
  属性将设置SHF_ALLOC位;否则该位被关闭。按照惯例,<name>由重定位适用
  的section来提供。因此,一个重定位的section适用的是.text,那么该名字
  就为.rel.text或者是.rela.text。

* .rodata and .rodata1

  这些section保存着只读数据,在进程映象中构造不可写的段。看第二部分的
  ``Program Header''获得更多的资料。

* .shstrtab

  该section保存着section名称。

* .strtab

  该section保存着字符串,一般地,描述名字的字符串和一个标号的入口相关
  联。假如文件有一个可装载的段,并且该段包括了符号字符串表,那么section
  的SHF_ALLOC属性将被设置;否则不设置。

* .symtab

  该section保存着一个符号表,正如在这个section里``Symbol Table''的
  描述。假如文件有一个可装载的段,并且该段包含了符号表,那么section
  的SHF_ALLOC属性将被设置;否则不设置。

* .text

  该section保存着程序的``text''或者说是可执行指令。


前缀是点(.)的section名是系统保留的,尽管应用程序可以用那些保留的
section名。应用程序可以使用不带前缀的名字以避免和系统的sections
冲突。object文件格式可以让一个定义的section部分不出现在上面的列
表中。一个object文件可以有多个同样名字的section。

为处理器体系保留的section名的形成是通过置换成一个体系名的缩写。
该名字应该取自体系名,e_machine使用的就是。例如,.Foo.psect就是
在FOO体系上定义的名字。

现存的扩展名是历史遗留下来的。

		       Pre-existing Extensions
		       =======================
			 .sdata     .tdesc
			 .sbss      .lit4
			 .lit8      .reginfo
			 .gptab     .liblist
			 .conflict


   =================== String Table 字符串表=========================


String table sections 保存着以NULL终止的一系列字符,一般我们称为字
符串。object文件使用这些字符串来描绘符号和section名。一个字符串的
参考是一个string table section的索引。第一个字节,即索引0,被定义保
存着一个NULL字符。同样的,一个string table的最后一个字节保存着一个
NULL字符,所有的字符串都是以NULL终止。索引0的字符串是没有名字或者说
是NULL,它的解释依靠上下文。一个空的string table section是允许的;
它的section header的成员sh_size将为0。对空的string table来说,非0的
索引是没有用的。

一个 settion 头的 sh_name 成员保存了一个对应于该 setion 头字符表部分
的索引(就象ELF头的 e_shstrndx 成员所特指的那样。下表列出了一个有 25 字节
的字符串表(这些字符串和不同的索引相关联):


       Index   +0   +1   +2   +3   +4   +5   +6   +7   +8   +9
       =====   ==   ==   ==   ==   ==   ==   ==   ==   ==   ==
          0    \0   n    a    m    e    .    \0   V    a    r     
         10    i    a    b    l    e    \0   a    b    l    e
         20    \0   \0   x    x    \0


+ Figure 1-15: String Table Indexes

  Index   String
  =====   ======
      0   none
      1   "name."
      7   "Variable"
     11   "able"
     16   "able"
     24   null string


如上所示,一个字符串表可能涉及该 section 中的任意字节。一个字符串可能 
引用不止一次;引用子串的情况是可能存在的;一个字符串也可能被引用若干次;而
不被引用的字符串也是允许存在的。

   ==================== Symbol Table 符号表=========================


一个object文件的符号表保存了一个程序在定位和重定位时需要的定义和引用的信息。
一个符号表索引是相应的下标。0表项特指了该表的第一个入口,就象未定义的符号
索引一样。初始入口的内容在该 section 的后续部分被指定。

                             Name       Value
                             ====       =====
			     STN_UNDEF      0

一个符号表入口有如下的格式:

+ Figure 1-16: Symbol Table Entry

  typedef struct {
      Elf32_Word	st_name;
      Elf32_Addr	st_value;
      Elf32_Word	st_size;

⌨️ 快捷键说明

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