我们编译产生的ELF文件,在最开始包含了一个ELF文件头, 其中有一个字段E_PHOFF指向了同文件中一块“程序头表”的偏移位置。 而这个程序头表中包含了若干个表项, 每个表项表明了组成ELF文件的若干个段的地址,大小,属性的信息。 再对照SCL文件,可以发现原来每个段与SCL中的各个加载域一一对应。 所以ELF各个段其实就是SCL中指定的各段内容的二进制表现。
有的项目编译产生的ELF文件只包含一个段,但是却有若干个节。同样在ELF头的e_shoff字段给出了节头在整个文件中的偏移(如果节头存在的话),节头也叫节头表,节头可看做一个在文件中连续存储的结构数组(Elf32_Shdr结构的数组),数组的长度由ELF头的e_shnum字段给出,数组中每个结构的字节大小由ELF头的e_shentsize字段给出。
节头表是从连接角度看待ELF文件的结果,所以从节头的角度ELF文件分成了许多的节,每个节保存着用于不同目的的数据,这些数据可能被前面提到的程序头重复引用。由于节中数据的用途不同,节被分为不同的类型,每种类型的节都有自己组织数据的方式。有的节存储着一些字符串,;有的节保存一张符号表,程序从动态连接库中引入的函数和变量都会出现在一个叫做”动态符号表“的节中;重定位表则包含在重定位节中。