`
fixopen
  • 浏览: 84115 次
文章分类
社区版块
存档分类
最新评论

可执行文件格式详述,ABI和loader……

阅读更多
上回书说到可执行文件的格式,这一节详细描述一下。
可执行文件是由头和体组成的。这跟别的复杂一点的文件一样。它的体分成一些叫做节(section)的东西,这是它的特色。另外比较有特色的东西是:我们一般把可执行文件叫做程序的影像(image)。唔,这个叫法也不赖。可执行文件的价值在于执行,执行的程序也就是活着的程序叫做程序的影像。呵呵,这个概念打通了文件和进程的通道,以前说过的loader。一般情况下,可执行文件放在永久性的存储设备上,进程放在速度较快的主存上——一般是半导体存储设备,易失性的。loader干的主要的活之一就是把可执行文件从速度较慢的哟耐久性存储设备转移到速度较快的主存上。这个转移有什么难处呢?有一定的难点。最主要的就是:由于程序被转移(又叫做装载)到主存的以后,这个程序就要运行了,照常理想来,一个程序要施展其手脚,总得先准备出场地。是的,要准备其场地的。可以想象的到,其中最主要的是要操作的数据。但是别忘了,数据难道不包括在可执行文件影像里面?确实,有一种数据不包括在里面。就是那种没有初始值的数据。没有初始值的数据,包括在image里面也是没有价值的,是吧。所以,需要在主存中开辟这么一块地方,用来存放这种数据。是不是这就完了?不是,参见我写的关于对象生命周期和内存模型的概念就知道,我们还要准备好栈空间,以供程序运行的时候使用,准备好堆空间,以供程序运行的时候使用。是不是就完了?不是,还不是,还有别的。

有一个叫做重定位的概念需要在这儿引入。程序中需要操作数据,这个大家都知道,但是怎么用来指定那个数据呢?比如:程序中说,要把a和b相加的和赋值给c,怎么表达呢?用a b c对象的名字来表达?不是。呵呵,用的是a b c对象的地址。地址!这是一个关键的概念。好,我们现在看看会导致什么问题。c = a + b会演化成,load data from address of a,load data from address of b,add these data,store the result to address of c。我们不关心别的,就关注:address of {a|b|c},它们怎么来的,我们在程序中可没有给它们地址啊。呵呵,肯定是中间某个环节给出来的了。我们看看有可能是那个环节。compiler?嗯,很有可能,compiler给出各个对象一个唯一的地址。linker,对,linker给它们分配地址也很正常。那loader呢?loader给出地址也很合理。其实,这些环节都曾经给出了这些对象的地址。是的,都给出过。这里面会涉及到一个相对地址和绝对地址的问题。绝对地址就是指在运行环境中给准备的地址空间中指定其一。比如:运行环境给准备了4G的地址空间,你说你的某个对象使用3038M139K那个地方的空间。这就是绝对地址。绝对地址不好。原因很简单。你得自己保证对象的地址不冲突,而且,强迫你依赖于运行环境。那么相对地址呢?嗯,它在linker的运作下基本上是一个基本要求。 compiler生成相对地址,linker把它们(模块们)联合起来,放入同一个地址空间中,loader把image装入主存时,很有可能重新定位 image中各个对象的地址。

好的。重定位解释完了。是不是loader的活也干完了呢?哦,no,还有点。这牵扯到外部对象引用的问题。想一想,对连接器面对的各个模块来说,别的模块中的对象也算是外部对象。所以,外部对象的引用问题也不是很难,当然,也不很简单。

好了,说了这些东西以后,我们的可执行文件究竟以什么格式存在呢?且看……
分享到:
评论

相关推荐

    Linux 可执行文件格式详细文档

    ### Linux 可执行文件格式(ELF)详细解析 #### 一、概述 在Linux操作系统中,可执行文件采用的是可执行与可链接格式(Executable and Linkable Format, ELF),这是一种广泛使用的文件格式标准,用于定义如何组织...

    (12.2)--可执行文件的加载1

    2. 加载器(loader)的工作:execve函数会调用加载器(loader)来加载可执行文件。加载器根据可执行文件的程序(段)头表中的信息,将可执行文件的代码和数据从磁盘“拷贝”到存储器中。实际上,这个过程不会真正地...

    ELF文件格式分析.pdf

    ELF文件格式规范是ELF标准的核心内容,其内容包括目标模块格式、可执行文件格式以及调试记录信息与格式等。ELF文件格式的目的是为软件开发人员提供一组二进制接口定义,这些接口可以延伸到多种操作环境,从而减少...

    ELF文件格式分析

    ELF标准由工具接口标准(TIS)委员会指定,并针对32位Intel体系结构上的多种操作系统提供了目标文件格式、可执行文件格式以及调试记录信息格式等标准。 ELF文件格式主要包含以下几部分: 1. ELF Header:包含了描述...

    System V ABI Update中英文翻译

    System V ABI Update文档主要围绕ELF(Executable and Linkable Format,可执行和链接格式)展开,它是UNIX和类UNIX系统中用于存储可执行文件、目标文件、共享库和核心转储的核心文件的一种文件格式。ELF格式是一种...

    ELF 文件格式分析-北京大学信息科学技术学院操作系统实验室

    ELF文件包括目标文件格式、可执行文件格式以及调试记录信息与格式等内容。这个文件格式被设计为一种可移植的目标文件格式,其目的是让软件开发人员可以使用相同的接口在不同的操作系统环境中进行工作,进而达到降低...

    ABI7500-2.0软件使用指南0223XIE教学内容.docx

    ABI7500-2.0 软件是一款专业的生物信息学软件,用于分析和处理生物样本数据。本指南将指导用户如何正确使用 ABI7500-2.0 软件,完成实验设计、数据分析和结果解释。 一、软件安装和启动 1. 打开 ABI7500-2.0 软件...

    ELF文件系统格式.pdf

    ELF(Executable and Linkable Format)是一种被广泛使用的文件格式,主要用于存储可执行文件、共享库、目标代码、核心转储等。它由UNIX系统实验室开发,并被TIS委员会采纳为一种可移植的目标文件格式,适用于多种...

    ELF文件系统格式

    可执行链接格式(Executable and Linking Format)最初是由UNIX系统实验室(UNIX System Laboratories,USL)开发并发布的,作为应用程序二...接口的内容包括目标模块格式、可执行文件格式以及调试记录信息与格式等。

    ELF 文件格式分析.pdf

    综上所述,ELF 文件格式是一种复杂而强大的文件格式,它为程序的编译、链接、加载和执行提供了必要的支持。通过深入理解 ELF 文件格式,开发者可以更好地理解程序是如何构建和运行的,这对于调试和优化程序具有重要...

    ELF文件格式分析电子版

    ELF文件的规范包含目标模块格式、可执行文件格式以及调试记录信息等,它为软件开发人员提供了一组二进制接口定义,使得软件可以在不同的操作环境中运行而无需重新编译。 ELF文件主要包含以下几个部分: 1. ELF头部...

    Exception Handling ABI for the ARM Architecture

    - ELF模型:ELF(Executable and Linkable Format)是一种常用的二进制文件格式。文档中的ELF模型涉及了可重定位ELF文件和可执行ELF文件,明确了异常处理在这些文件中的编码方式。 - 可重定位ELF:在编译和链接过程...

    elf文件格式(中文版)

    其后,工具接口标准委员会(TIS)选择ELF作为跨32位Intel架构上不同操作系统间可移植的二进制文件格式标准,旨在减少执行接口的多样性,从而降低代码重写和重新编译的需求。 #### 二、ELF文件结构详解 ##### 1. ...

    ELF文件格式详解

    ELF(Executable and Linkable Format)文件格式是Unix和Unix-like系统(包括Linux)中常用的二进制文件格式,用于存储程序的代码和数据。ELF文件既可以用作可执行文件,也可以用作可重定位的目标文件(生成库文件)...

    cxx-abi文档

    这个标准文档详细定义了C++编译器如何生成和解析对象文件、库以及可执行程序中的二进制表示形式。CXX-ABI的目的是确保不同编译器生成的代码能够正确地交互,使得开发者可以在不考虑底层实现细节的情况下,编写可移植...

    ABI技术内幕,描述ABI接口技术

    ABI接口技术包括库文件的组织方式、可执行文件的格式以及动态链接器的行为。在Android开发中,开发者通常需要为每个支持的ABI构建独立的APK或者使用多APK策略。每个APK包含特定ABI的.so库文件,这样可以减少非目标...

    shiboken6.abi3.dll文件

    shiboken6.abi3.dll文件

Global site tag (gtag.js) - Google Analytics