elf文件格式学习总结.doc

elf文件格式学习总结.doc

ID:58867554

大小:25.69 KB

页数:6页

时间:2020-09-21

elf文件格式学习总结.doc_第1页
elf文件格式学习总结.doc_第2页
elf文件格式学习总结.doc_第3页
elf文件格式学习总结.doc_第4页
elf文件格式学习总结.doc_第5页
资源描述:

《elf文件格式学习总结.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、elf文件格式学习总结编译器将一个源文件生成目标文件时,会在目标文件中生成符号表和重定位表。 符号表包含在文件中定义的全局符号以及在文件中引用的外部符号(外部函数或变量)。重定位表告诉链接器在哪些位置要进行重定位操作。 编译器生成的目标文件在文件的开始处会有一个elf头,描绘了整个文件的组织结构。它还包括很多节(section)。这些节有的是系统定义好的,有些是用户在文件在通过.section命令自定义的,链接器会将多个输入目标文件中的相同的节合并。 链接器对编译生成的目标文件进行链接时,A.首先进行符

2、号解析,找出外部符号在哪定义。如果外部符号在一个静态库中定义,则直接将对应的定义代码复制到最终生成的目标文件中。B.接着链接器进行符号重定位。编译器在生成目标文件时,通常使用从零开始的相对地址,而在链接过程中,链接器从一个指定的地址开始,根据输入目标文件的顺序,以段(segment)为单位将它们拼装起来。其中每个段可以包括很多个节(section)。除了目标文件的拼装,重定位过程中还完成了下面两个任务:一是生成最终的符号表,二是对代码段(.text)中的某些位置进行修改,要修改的位置由编译器生成的重定位

3、表指出。 链接过程中还会生成两个表:got表和plt表。 got表中每一项都是本运行模块要引用的全局变量或函数的地址,可以用got表来间接引用全局变量。函数也可以把got表的首地址作为一个基准,用相对该基准的偏移量来(直接)引用静态函数。由于动态链接器(ld-linux.so)不会把运行模块(*.so)加载到固定地址,在不同进程的地址空间中各运行模块的绝对地址、相对地址都不同。这种不同反映到got表上,就是每个进程的每个运行模块都有独立的got表,所以进程间不能共享got表(内容)。 plt表中每一项都

4、是一小段汇编代码,对应于本运行模块要引用的每一个全局函数。当链接器发现某个符号引用是位于其它共享目标文件(动态连接库*.so)中的一个全局函数时,就在文件的plt表里创建一个项目,以便将来重定位。 链接器生成的目标文件在文件开头也有一个elf头,描绘了整个文件的组织结构,这个文件中会有多个段(segment),每个段都由相应的节(section)拼装而成。 对由链接器链接生成的可执行目标文件进行加载运行时,内核首先读取elf文件头。根据头部数据指示分别读入各种数据结构,找出可加载的段并调用mmap()函

5、数将其加载到内存。内核找到标记为PT_INTERP的段,这个段对应着动态链接器的名称,然后加载动态链接器(linux中通常是/lib/ld-linux.so.2)。接着内核将控制权交给动态链接器。动态链接器检查程序对外部文件(共享库)的依赖性,并在需要时对其进行加载。之后动态链接器开始对程序中的外部引用(即全局变量/函数)进行重定位,即定位出程序其引用的外部变量/函数的真实内存地址。R_386_GLOB_DAT类型的重定位项目涉及到got表。R_386_JMP_SLOT类型的重定位项目涉及到plt表。动

6、态链接还有一个延迟(lazy)特性,即真正引用时才进行重定位(环境变量LD_BIND_NOW为空值NULL时)。接下来动态链接器执行elf文件中标记为.init节的代码,进行程序运行的初始化。最后动态链接器把控制权交给程序,从elf文件头中定义的入口处开始执行程序。 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ELF文件格式(翻译有些问题,部分修正) 3ELF文件格式3.1介绍目标文件有三种类型:a.可重定位文件(RelocatableF

7、ile)  (*.o)包含适合于与其他目标文件一起链接来生成可执行文件或者可共享目标文件的代码和数据。b.可执行文件(ExecutableFile)     (*.exe)适合于执行的程序,此文件规定了exec()如何创建一个程序的进程映像。c.可共享目标文件(SharedObjectFile)(*.so)包含了在两种使用环境中链接的代码和数据。首先链接器(ld)可以将它和其它可重定位文件和共享目标文件一起处理,生成另外一个目标文件(比如:编译器和连接器把*.o和*.so一起装配成一个*.exe文件)。

8、其次,动态链接器(DynamicLinker)可将它与某个可执行文件以及其它共享目标文件组合在一起,创建进程映像(比如:动态加载器把exe程序和*.so加载进内存执行)。 目标文件全部是程序的二进制表示,目的是直接在某种处理器上直接执行。3.4.1节区头部表格表5节区头部表格中的特殊下标SHN_COMMON  OXFFF2   此节区定义的符号是公共符号。如FORTRAN中COMMON或者未分配的C外部变量。 (《linux内核完全剖析》P

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。