来虎体育直播安装_在线最新版_娱乐安装


让中国的不锈钢管名扬世界

实标厚度-把诚信刻在脸上

全国免费加盟热线:

当前位置:来虎体育直播安装 > 新闻动态 > 行业动态 >

【论坛精华帖整理】ELF文件格式解析

文章出处:未知 人气:发表时间:2022-03-14

  带有(.)前缀的section是系统保留的,当然应用程序也可以在这些section语义允许的情况下使用这些section。应用程序可是使用前缀来命名其自己使用的section,以避免和系统section冲突。String table section包含了null终止的字符序列,也就是字符串。对象文件使用这些字符串来代表符号和section名称。对一个字符串的引用其实就是字符串表的索引。第一个字节,也就是0号索引,通常是一个null字符。同样地,字符串表的最后一个字节也是null,确保所有的字符串都是以null结尾。索引为0的字符串为0,即要么是没有名字要么是空名字,这要取决于上下文。空字符串表section也是允许的,此情况下,其section header的sh_size成员必须为0 。首先,section header string table section在section header中表项的索引通过ELF header的e_shstrndx成员找到,然后section header的sh_name定位该string table中的某一表项。例如:从图中我们可以看出,一个string table index可以指向该section中的任何字节,一个字符串可能会出现多次,当然也允许字符串未被引用;内核并不使用符号名。它是通过变量或函数的地址(指针)来使用变量或函数的,而 不是使用size_t BytesRead,内核更喜欢使用(例如)c0343f20来引用 这个变量。而另一方面,人们并不喜欢象c0343f20这样的名字。我们跟喜欢使用象 size_t BytesRead这样的表示。通常,这并不会带来什么问题。内核主要 是用C语言写成的,所以在我们编程时编译器/连接程序允许我们使用符号名,并且使 内核在运行时使用地址表示。这样大家都满意了。然而,存在一种情况,此时我们需要知道一个符号的地址(或者一个地址对应的 符号)。这是通过符号表来做到的,与gdb能够从一个地址给出函数名(或者给出一个 函数名的地址)的情况很相似。符号表是所有符号及其对应地址的一个列表。例如:你可以看出名称为dmi_broken的变量位于内核地址c03441a0处。对象文件的符号表用来保存用于定位和重组程序的符号定义和引用的信息,其可以独自占用一个section。符号表项0 STN_UNDEF指明了该表中第一项,其用与未定义符号。表项的初始内容将在后面讲到。1. st_name 该成员包含了对象文件的符号字符串表中一个表项的索引号,其保存了该符号的名称;如果该值为非0,其就是一个用来描述该符号名称的字符表索引,否则,该符号表项没有名字;2. st_value 该成员给出了相关符号的值,至于其中的内容是个绝对的值还是地址等等,取决于上下文;* 在可重组文件中,st_value包含了符号的对齐约束,该符号必须位于index为SHN_COMMON符号的section中;* 在可重组文件中,st_value包含了已定义符号的section偏移。也就是说,st_value为自st_shndx指向的section开始处的偏移;* 在可执行和共享对象文件中,st_value包含了逻辑地址,为了使得这些文件的符号更利于动态连接器使用,对应section的offset给定的是内存逻辑地址;3. st_size 许多符号都有尺寸,例如,一个数据对象的尺寸就是该对象中包含的字节数。如果符号没有大小或者大小未知,则该值为0;4. st_info 该成员指定了符号的类型和绑定属性,详述见下,其和bind以及type结合计算方法如下:#define ELF32_ST_BIND(i) ((i)4)#define ELF32_ST_INFO(b,t) (((b)5. st_other 该成员未定义;6. st_shndx 每个符号表项都和某section相关,该成员保存了此section在section head table中的索引。1. STB_LOCAL 本地符号,对于外部对象文件不可见。同样名称的符号也许会存在于多个文件中而不会互相干扰;2. STB_GLOBAL 全局符号,一个对象文件定义,所有对象文件共享;4. STB_LOPROC到STB_HIPROC 该范围内的符号为处理器特定的语义;2. STT_OBJECT 该符号和数据对象相关,例如变量,数组等等;4. STT_SECTION 该符号和section相关,其绑定行为一般为STB_LOCAL;5. STT_FILE 通常文件符号的名字给出了该对象文件相关的源文件的名字,其绑定行为一般为STB_LOCAL;6. STT_LOPROC 到 STT_HIPROC该范围内的符号为处理器特定的语义;重组就是将符号定义和符号引用连接起来的过程;例如,当程序调用函数时,调用指令必须被传递给执行时正确的目的地址。换句话说,可重组的文件必须包含了这样的信息:该信息描述了如何修改可重组文件的section内容,从而使得可执行或者共享对象文件包含了正确的进程内存映像信息。而Relocation表项就是可重组文件需要包含的信息;1. r_offset 该成员给出了应用重组动作的位置,对于一个可重组文件而言,该值就是从该section开始到重组将要影响的存储单元之间的字节偏移。对于可执行文件或共享对象文件而言,该值就是将要被重组影响的存储单元的逻辑地址;2. r_info 该成员给出了该需要重组的符号表索引,以及将要重组的类型。类如,一个调用指令的重组表项包含了将要被调用函数的符号表索引。如果其索引为STN_UNDEF,则使用0作为符号值。重组类型是和处理器相关的。其计算方式如下:3. r_addend 该成员指定了常量加数用来计算将要被存储到重组域中的值;本部分介绍了对象文件信息以及创建运行进程的系统行为。这里的一些信息适用于所有的系统,另一些是和处理器相关的。可执行和共享对象文件只是静态地代表了程序。要执行这样的程序,操作系统利用该文件来创建动态程序表现,或进程映像。进程印象包含了段,段包含了text、data、stack等等。本部分主要讨论以下几个问题:1. Program header 该部分补充了前一章讲述的内容,主要描述了程序执行时的对象文件结构,以及用于定位段映像的program header table基本数据结构;2. Program loading 给定一个对象文件,操作系统必须将其加载如内存来作为程序运行;3. Dynamic linking 详细信息不再叙述,请查阅ELF Format。可执行或共享对象文件的program header table是一个数据结构数组,每一个表项都描述了一个段或者其他系统用来为程序运行做准备的信息。对象文件的段可以包含多个section,下面的“段内容”将会详细描述。program header table只对可执行和共享对象文件有意义。文件通常通过其ELF header中的e_phentsize和e_phnum成员来指定其自身的program header table大小。1.3.3 Program header tablerogram header1. p_type 该成员表明了该数组元素所描述的段的类型以及如何解释该数组元素的属性;5. p_filesz 该成员给出了该段在文件中占用的字节数,可以为0;6. p_memsz 该成员给出了该段在内存映像中占用的字节,可以为0;8. p_align 当程序加载后,可加载的进程段的p_vaddr和p_offset取模page size(4KB)之后的值必须相等。该成员给出该段应该在内存和文件中的对齐值。1.3.4 Program header tablerogram header Type一些表项描述了进程段,其他的一些给出了对进程映像并无作用的辅助信息。段表项可以按照任何顺序出现,除非明确指定。1. PT_NULL 该元素不适用,其告诉program header table忽略它;2. PT_LOAD 其指定了可加载段,由p_filesz 和 p_memsz来描述。文件中的字节被映射到内存段中。如果段的内存尺寸大于其在文件中的尺寸,那么额外的数据将被填充为0。可加载的段,在program header table中通常按照p_vaddr升序排列;7. PT_PHDR 如果存在,指定了program header table本身在文件/内存中的位置和大小;可执行和共享对象文件都有基地址,其是程序对象文件内存映射后的最低的虚拟地址。基地址的用途就是用来在动态链接过程中重组内存映像;详细信息不再叙述,请查阅ELF Format。当动态连接器已经建立起进程映像并且执行完毕重组后,每一个共享对象都有机会执行一些初始化代码,这些初始化代码并不是按照特定顺序的,但是所有共享对象的初始化都是发生在可执行文件活动控制权之前。程序可以通过动态结构中的DT_INIT和DT_FINI动态表项来定义动态section,通常这些代码都驻留在.init和.fini section中,详细信息不再叙述,请查阅ELF Format。当操作系统创建或者增加一个进程映像的时候,其理论上将会拷贝文件的段到虚拟内存段中。系统读取文件内容的实际依赖于程序的执行环境的行为。一个进程在运行的过程中,如果没有引用逻辑页面,则其也不需要物理页面,通常大部分页面进程都是没有使用的。因此,延缓读取物理页面可以提高系统性能。为了获取该效率,可执行和共享对象文件的段的文件偏移及虚拟地址必须在按页面(4KB)取模后相等。虽然上面的例子文件中,对于text和data段而言,文件偏移和逻辑地址取模4KB后都是相等的。但是:1. text的第一个页面包含了ELF header,program header table以及其他的信息;理论上讲,系统对待每个段的内存权限都是相互独立的。段地址不得不调整来确保地址空间中的每个逻辑页面都有自己的权限;在上面的例子中,包含了text结尾和data开始的区域将要被映射两次:一次就是包含了text和data开始部分,另一个就是text末尾部分和data;data段的末尾还需要对为初始化数据的特殊处理,系统通常将其清零。

  网页论坛精华帖子master网页论坛精华帖子master网页论坛精华帖子master

同类文章排行

最新资讯文章

返回顶部