当前位置: 首页 > 编程笔记 >

Linux下将源文件编译成目标文件的过程解析

戴霖
2023-03-14
本文向大家介绍Linux下将源文件编译成目标文件的过程解析,包括了Linux下将源文件编译成目标文件的过程解析的使用技巧和注意事项,需要的朋友参考一下

简介

请讲一下linux如何源文件逐步编译成可执行文件。

解答

首先先上图对编译的整个过程有个感性的认识,然后再逐步分析各个过程。

以hello.c 程序为例

# include <stdio.h>
main{
  printf("hello\n");
}

一个.c源程序需要经过预处理器生成.i文件,再经过编译器生成.s文件,再经过汇编器生成可重定位目标文件.o文件,再与其他.o文件经过链接器生成最终的可执行目标程序。

预处理阶段。主要是处理源文件中以“#”开头的预编译指令。

删除#define并展开宏

处理所有条件预编译指令,如#if, #ifdef, #endif

插入头文件到“#include”处

删除所有注释

添加行号和文件名标识,以便编译时编译器产生调试用的行号信息

保留所有#pragma编译指令。

编译阶段。将预处理得到的预处理文件进行语法分析,词法分析,语义分析,优化后,生成汇编代码文件(汇编语言源程序)。

汇编阶段。利用汇编程序(汇编器)将汇编语言源程序转换成机器指令序列(机器语言程序)。

链接阶段。将多个可重定位的目标文件.o合并以生成可执行文件,其可以被加载到内存中,由系统执行。

总结

以上就是本文关于Linux下将源文件编译成目标文件的过程解析的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

 类似资料:
  • 编译可调试的目标文件 为了使得编译出来的代码是能够被gdb这样的调试器调试,我们需要在使用gcc编译源文件的时候添加参数:"-g"。这样编译出来的目标文件中才会包含可以用于调试器进行调试的相关符号信息。

  • 问题内容: 我刚刚使用Eclipse编写了一个简单程序,并且想将其编译为可执行文件,但似乎根本找不到如何执行的方法。 问题答案: 你可以通过以下方式将.jar文件转换为.exe: 1- JSmooth .exe包装器: JSmooth是Java可执行包装器。它为Java应用程序创建本机Windows启动器(标准.exe)。由于它能够自行查找任何已安装的Java VM,因此它使Java部署更加流畅和

  • 我刚刚开始使用cxf,所以这可能是新手的错误… 我正在阅读《soa governance in action》一书,并下载了示例项目。 多谢! 编辑:彻底搞糊涂了。这是pom 编辑:我也不清楚我应该如何建立它…?我正在eclipse中作为maven构建运行它,目标是Generate-Sources。似乎产生了源。但我该如何构建整个软件包呢?即使生成了源代码,它也不会编译。?多谢! 编辑:更新的Ma

  • 本文向大家介绍C#实现将javascript文件编译成dll文件的方法,包括了C#实现将javascript文件编译成dll文件的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#实现将javascript文件编译成dll文件的方法。分享给大家供大家参考,具体如下: 第一步:新建项目 添加js文件 写个测试Function (JScript.js) 单击JS文件属性。将 生成操作 改

  • Compiling One Directory # compileall_compile_dir.py import compileall import glob def show(title): print(title) for filename in glob.glob('examples/**', recursi

  • 问题内容: 我正在尝试让一个库在我的c 项目中工作,并且对于不习惯c 的人没有明确的说明 以下链接是我最近来的 它指出以下 还有以下线程指出以下内容 现在从我可以看到的命令是+ ,例如我的文件名是,这是正确的,有人可以澄清一下吗 我目前正在使用以下命令来编译我的文件,但是想包含一个名为.so的文件,例如 问题答案: 现在从我所看到的命令,例如我的文件名是这将是 不,那是不正确的。应该是,即您用来将