`

elf格式学习总结

阅读更多

当编译一个源文件生成目标文件时,会在目标文件中生成符号表和重定位表。

符号表包含在文件中定义的全局符号以及在文件中引用的外部符号(外部函数或变量)。

重定位表告诉链接器在哪些位置要进行重定位操作。

编译生成的目标文件在文件的开始处会有一个elf头,描绘了整个文件的组织结构。它还包括很多节(section)。这些节有的是系统定义好的,有 些是用户在文件中通过.section命令自定义的,链接器会将各输入目标文件中的相同的节合并。

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

链接过程中还会生成两个表:got表和plt表。

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

plt表中第一项都是一小段代码,对应于本运行模块要引用的一个全局函数。当链接器发现某个符号引用是共享目标文件中的一个函数时,就在pltk 创建一个入口。

链接生成的目标文件在文件开头也有一个elf头号,描绘了整个文件的组织结构,这个文件中会有多个段(segment),每个段都由相应的节 (section)拼装而成。

对由链接器链接生成的可执行目标文件进行加载运行时,内核首先读取elf头。根据头部数据指示分别读入各种数据结构,找出可加载的段闭并调用 mmap()函数将其加载到内存。内核找到标记为PT_INTERP的段,这个段对应着动态链接器的名称,然后加载动态链接器。linux中通常是 /lib/ld-linux.so.2.接着内核将控制权交给动态链接器。动态链接器检查程序对外部文件(共享库)的依赖性,并在需要时对其进行加载。之 后动态链接器开始对程序中的外部引用进行重定位,即告诉程序其引用的外部变量/函数的地址。R_386_GLOB_DAT类型的入口涉及到got表。 R_3862_JMP_SLOT类型的入口涉及到plt表。动态链接还有一个延迟(lazy)特性,即真正引用时才进行重定位(环境变量 LD_BIND_NOW为空值NULL时)。接下来动态链接器执行elf文件中标记为.init节的代码,进行程序运行的初始化。最后动态链接器把控制权 交给程序, 从elf头中定义的入口处开始执行程序。

 

http://blog.csdn.net/BoySKung/archive/2008/12/10/3488468.aspx

分享到:
评论

相关推荐

    elf for linux.rar_elf_linux elf

    "elf"源代码是学习ELF格式的绝佳材料。通过阅读和分析,我们可以看到编译器如何将高级语言转换为ELF格式的二进制代码,以及链接器如何构建最终的可执行文件。源代码揭示了ELF的内部结构,让我们更深入地理解程序的...

    ELF文件格式

    ELF文件格式学习总结 ELF(Executable and Linkable Format)文件格式是 Unix/Linux 操作系统中使用的一种可执行文件格式。它是由 Unix 系统实验室(AT&T Bell Laboratories)在 1980 年代初期开发的,目的是为了...

    ELF FORMART FOR ARM ARCHITECTURE

    总结来说,ELF文件格式在ARM架构中扮演着核心角色,它为编译器、链接器和加载器提供了构建和执行程序所需的全部信息。理解ELF格式对于在ARM平台上进行软件开发和调试至关重要。通过深入学习和掌握ELF文件的内部机制...

    elf 加密机制

    ELF是UNIX系统上的一种常见的可执行文件格式,它包含用于系统加载和执行程序的信息。ELF文件的结构可以分为三部分:可执行头(Executable Header)、程序头(Program Headers)和节头(Section Headers)。这些部分...

    Linux-ELF文件详解

    ### Linux-ELF文件详解 #### 一、简介 ELF (Executable and Linkable Format) 是一种被广泛应用于Unix和类Unix系统...通过对ELF文件格式的学习,不仅可以深入了解Linux系统的内部机制,还能提高解决实际问题的能力。

    xtensa-esp32-elf-linux64-1.22.0-80-g6c4433a-5.2.0.tar.gz

    总结起来,"xtensa-esp32-elf-linux64-1.22.0-80-g6c4433a-5.2.0.tar.gz"是ESP32开发的重要组成部分,它为Linux用户提供了编译和调试ESP32应用程序的环境。正确理解和配置这个工具链是成功开发ESP32项目的基础。通过...

    ELF Format

    总结来说,ELF格式是Linux和类UNIX系统中不可或缺的一部分,它定义了二进制文件的组织方式,使得程序的链接、加载和执行变得更加高效和灵活。通过阅读《ELF Format》和《ELF.Format.Summary》这两份文档,你可以更...

    做着玩的NodeJS服务器端模板引擎--Elf

    总结起来,Elf作为一个个人开发的Node.js服务器端模板引擎,虽然小巧,但不失为学习和实践模板引擎原理的好例子。通过理解和使用Elf,我们可以深化对服务器端渲染的理解,同时也能锻炼我们的JavaScript编程技能。...

    cpp-ELF一个大规模轻量和灵活的实时战略游戏研究平台

    总结来说,cpp-ELF是一个为游戏AI研究而生的开源平台,它的轻量化、灵活性和强大的功能特性,使得它在学术界和游戏开发领域都有着广泛的应用前景。无论是为了学术研究,还是实际的游戏开发,ELF都是一个值得探索和...

    linux x86平台elf 进程注入so并且实现基于rel的hook ubuntu14.01测试通过

    总结来说,"linux x86平台elf 进程注入so并且实现基于rel的hook"是一种高级的逆向工程和调试技术,它涉及到了Linux系统编程、ELF文件格式、动态链接、内存管理和系统调用等多个方面。这一技术在软件调试、安全分析、...

    Executable and Linking Format (ELF) 英文文档中文文档

    总结来说,ELF文件格式是实现编译、链接和执行过程的关键组成部分,它在类Unix系统中扮演着核心角色,提供了高效且灵活的方式来组织和处理二进制程序。理解和掌握ELF,对于系统级开发、调试和性能优化具有重要意义。...

    FPGA NIOSII 11.0 烧写jic和elf文件

    该教程提供了从头到尾的完整流程,非常适合初学者学习。 #### 八、总结 通过上述步骤,我们可以有效地利用Quartus II 11.0和Nios II 11.0工具链进行FPGA项目开发,并顺利完成JIC和ELF文件的烧写。正确理解和掌握...

    riscv32-esp-elf-gcc8_4_0-esp-2021r2-patch5-linux-i686.tar.gz

    "elf"是Executable and Linkable Format的缩写,是UNIX系统中的标准文件格式,用于存储编译后的程序代码、数据和符号表等信息。 “gcc8_4_0”是指GNU Compiler Collection的版本号,这是一个广泛使用的开源编译器...

    Elf文件格式

    总结来说,ELF文件格式是Unix和类Unix系统的核心组成部分,它提供了一种高效且灵活的方式来组织和处理程序和库。了解ELF文件的结构和工作原理对于系统级编程和调试至关重要。华为LiteOS中的.elf文件更是体现了这种...

    Linux病毒原型的工作过程和关键环节.pdf

    ### Linux病毒原型的工作过程与关键环节详解 ...此外,通过学习ELFInfector等工具的具体实现细节,还可以帮助开发者更好地掌握ELF文件格式及其内部机制,为开发更安全可靠的Linux应用程序打下坚实的基础。

    安卓Linker源码(可修改编译).zip

    总结来说,Android Linker源码的学习和编译不仅能帮助我们理解程序加载和链接的底层机制,还可以为系统优化、性能提升或安全分析提供基础。通过对Linker的源码修改和编译,开发者可以更深入地控制和定制Android系统...

    安路科技最早期的CPLD(FPGA)ELF1系列数据手册

    《安路科技 ELF1系列 CPLD(FPGA) 数据手册》是关于...虽然已经停产,但其设计理念和架构仍然是学习现代可编程逻辑器件基础知识的重要参考。对于希望深入了解CPLD和FPGA的读者来说,这份数据手册仍然具有很高的价值。

    xtensa-esp-elf-gdb-11.2_20220823-i686-w64-mingw32.zip

    xtensa-esp-elf-gdb还支持一些高级功能,如条件断点、显示内存区域、跟踪指针变化等,这些功能可以通过查阅GDB的官方文档或相关教程进行学习。 总结,xtensa-esp-elf-gdb是ESP微控制器开发的重要工具,它提供了一种...

    code-elf-guide-V2.0

    开发者可以通过该项目学习到如何在uni-app中构建组件,以及如何利用组件实现特定功能,提升应用的用户体验。 通过深入理解和实践“code-elf-guide-V2.0”,开发者不仅可以掌握uni-app的Swiper组件,还能进一步提升...

Global site tag (gtag.js) - Google Analytics