可执行文件的生成、源文件与目标文件不能直接运行的原因、

1、main.o不能直接运行的原因:
源代码文件(.c)—> 预编译(.i)—>编译(.s)—>汇编(.o),
经过这个过程生成.obj(.o)目标文件,即文件通过预处理后进行一系列的词法分析、语义分析、语法分析及优化后生成相应的汇编代码文件,继而由汇编器将汇编代码转变成机器可以执行的指令得到目标文件。一个源文件生成一个目标代码,因此目标文件也可视为模块。
虽然这个目标文件中包含了机器语言代码,但并不是一个完整的程序,由于缺少启动代码与库代码所以暂时不能运行。
启动代码:相当于程序与操作系统的接口。
库代码:C语言的库函数代码,几乎每一个函数都会用到库函数文件。
因此我们在运行程序时还需要在进一步链接(.exe),通过链接器把启动代码,库代码,和目标代码结合在一起,并将它们放入单个文件,即可执行文件。

引发问题:
(1)为什么不直接在编译生成的目标文件时也同时自动链接启动代码与库代码?

原因一:在编译时期即对变量、函数等目标地址(重定位入口)置0,直到链接时再进行重定位,以此避免期间需要人工多次重新计算跳转的目标地址。
原因二:现代软件开发过程中,软件规模往往很大,尤其针对这种情况,模块化进行开发无疑是最高效、最安全的方法,那么对于这些相互依赖又相互独立的模块的开发、编译、测试、后期维护等就必须将链接这一过程单独提出来,进行独立的编译,系统的组装,减少库代码的多次重复调用。

(2)目标文件里面到底有什么?

编译器、链接器、装载器都是依靠段来表定位和访问各个段的属性。

2、main.c不能直接运行,需要经过哪些步骤才可以运行:
(1)源代码文件(.c)

(2)预编译/预处理(.i)
宏定义检查并展开、预处理指令、注释替换空格、头文件等。
(3)编译(.s)
进行一系列的词法分析、语义分析、语法分析及优化后生成相应的汇编代码文件。
(4)汇编(.o)
由汇编器将汇编代码转变成机器可以执行的指令得到目标文件。
(5)链接(.e)
模块拼接——>静态链接,
地址和空间分配、符号决议、重定位等生成可执行文件。

通过上述五步,即可得到可执行文件。

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 源文件到可执行文件经历以下步骤: 1. 预处理:对源代码进行宏替换、头文件展开等操作,生成一个被称为预处理文件的中间文件。 2. 编译:将预处理文件转换为汇编代码,即将高级语言的代码转换为汇编语言的代码。 3. 汇编:将汇编代码转换为机器码,生成一个目标文件。 4. 链接:将目标文件与库文件进行链接,生成执行文件。链接的过程包括符号解析、重定位等步骤,确保所有的符号引用都能正确地链接到符号定义。 使用现代编译器时,以上步骤通常会自动完成。 ### 回答2: 源文件到可执行文件经历以下几个步骤: 1. 预处理(Preprocessing):在这个阶段,预处理器将对源文件进行预处理,处理包括注释的删除、宏的展开等。预处理的结果是一个经过处理的源文件,通常以.i或者.ii作为文件扩展名。 2. 编译(Compilation):编译器将预处理后的源文件转换成汇编语言代码(Assembly code),此时生成文件通常以.s作为文件扩展名。汇编语言是一种低级的语言,它与机器指令一一对应。 3. 汇编(Assembly):在汇编阶段,汇编器将汇编语言代码转换成机器代码(Machine code),即二进制指令。生成文件通常以.o作为文件扩展名。 4. 链接(Linking):链接器将编译和汇编得到的目标文件与其他的目标文件或者库文件进行链接,生成最终的可执行文件。链接器的主要作用包括解析全局变量和函数的引用、解析函数调用的地址、将目标文件和库文件中的定义合并等。生成的可执行文件文件扩展名根据操作系统的不同可能有所变化,常见的有.exe(Windows)和.out(Linux)等。 总之,源文件到可执行文件的转换过程包括预处理、编译、汇编和链接四个主要步骤。每个步骤都有自己独特的功能,并且需要不同的工具和处理。通过这个过程,我们可以将高级语言编写的源代码转换成计算机可以直接执行的机器代码。 ### 回答3: 源文件到可执行文件经历以下几个步骤: 1. 预处理:在这个步骤中,源文件会经过预处理器将其中的预处理指令(如#include、#define等)进行替换或扩展。预处理器还可以进行条件编译和宏展开等操作,最终生成一个被修改过的源文件。 2. 编译:编译阶段是将预处理后的源文件转换为汇编语言的过程。编译器将源文件中的每个函数和变量编译成对应的汇编代码,并生成一个汇编语言文件。 3. 汇编:在这个步骤中,汇编器将汇编代码转换为机器语言指令。汇编器会将汇编语言文件中的每一条指令翻译为机器指令,并生成一个目标文件。 4. 链接:链接阶段将目标文件与其他必要的库文件进行合并,生成执行文件。链接器会将目标文件中的函数和变量与库文件中的函数和变量进行匹配,并生成最终的可执行文件。 最终的可执行文件就是经过上述步骤处理完成的程序。当我们运行这个可执行文件时,计算机会按照其中的机器指令来执行程序,实现相应的功能。整个过程可以通过命令行编译器(如gcc)或集成开发环境(IDE)中的编译器工具链来完成。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值