linux build文件,从源代码到可执行文件——编译全过程解析
程序的生命周期从一个高级C语言程序开始,这种形式能够被人读懂,却不能被机器读懂,为了在系统上运行这个程序,该源程序需要被其他程序转化为一系列低级机器语言指令,然后将这些指令按照可执行目标程序的格式打包并以二进制磁盘文件形式存储起来。
在Linux系统下,可用以下指令完成源程序到目标程序的转化:
gcc -o hello hello.c main.c
gcc 编译器驱动程序读取源文件hello.c和main.c,经过预处理、编译、汇编、链接(分别使用预处理器、编译器、汇编器、链接器,这四个程序构成了编译系统)四个步骤,将其翻译成可执行目标程序hello。如下图所示:
运行以下命令: » gcc –help
如下图所示,分别对应上图四个阶段:
1.示例程序
//main.c #include void hello();
int main()
{
hello();
return 0;
}
//hello.c #include void hello()
{
printf("Hello world\n");
}
2.预处理
预处理器(CPP)根据源程序中以字符”#”开头的命令,修改源程序,得到另一个源程序,常以.i作为文件扩展名。修改主要包括#include、#define和条件编译三个方面。
可执行以下命令查看程序变化:
gcc -o main.i -E main.c gcc -o hello.i -E hello.c
查看hello.i,如下图所示(main.i类似):
从上图可以看出,预处理只是对源文件进行了扩展,得到的仍然是C语言源程序。
3. 编译
编译器(CCL)将经过预处理器处理得到的文本文件hello.i和main.i翻译成hello.s与main.s,其中包含了汇编语言程序,汇编语言程序以一种标准的文本格式确切描述一条低级机器语言指令。
运行以下命令进行编译:
gcc -S main.i hello.i
查看main.s和hello.s:
//main.s
.file "main.c"
.text
.globl main
.type main, @function
main:
.LFB0:
.cfi_startproc
pushl %ebp
.cfi_def_cfa_offset 8
.cfi_offset 5, -8
movl %esp, %ebp
.cfi_def_cfa_register 5
andl $-16, %esp
call hello
movl $0, %eax
leave
.cfi_restore 5
.cfi_def_cfa 4, 4
ret
.cfi_endproc
.LFE0:
.size main, .-main
.ident "GCC: (Ubuntu/Linaro 4.8.1-10ubuntu8) 4.8.1"
.section .note.GNU-stack,"",@progbits
//hello.s
.file "hello.c"
.section .rodata
.LC0:
.string "Hello world"
.text
.globl hello
.type hello, @function
hello:
.LFB0:
.cfi_startproc
pushl %ebp
.cfi_def_cfa_offset 8
.cfi_offset 5, -8
movl %esp, %ebp
.cfi_def_cfa_register 5
subl $24, %esp
movl $.LC0, (%esp)
call puts
leave
.cfi_restore 5
.cfi_def_cfa 4, 4
ret
.cfi_endproc
.LFE0:
.size hello, .-hello
.ident "GCC: (Ubuntu/Linaro 4.8.1-10ubuntu8) 4.8.1"
.section .note.GNU-stack,"",@progbits
4.汇编
汇编器(AS)将hello.s和main.s翻译成机器语言指令,并打包成可重定位目标程序,一般以.o为文件扩展名。可重定位目标程序是二进制文件,它的字节编码是机器语言指令而不是字符。
运行以下指令可得到重定位目标程序main.o和hello.o:
gcc -c main.s hello.s
用文本编辑器打开main.o和hello.o发现文件是乱码,因为此时已经是二进制文件。
5.链接
链接程序(LD)将main.o和hello.o以及一些其他必要的目标文件组合起来,创建可执行目标文件。
gcc -o hello main.o hello.o
得到可执行程序hello.
在终端运行./hello,程序加载并运行。
linux build文件,从源代码到可执行文件——编译全过程解析相关推荐
- linux apr文件解压失败,Apache编译安装提示configure: error: APR not found错误解决方法...
在配置Apache的时候,出现configure: error: APR not found错误 原因是缺少一些依赖包,安装这些依赖包就行了 下载依赖包,注意我这里下载的与参考链接上的有些不同,安装上 ...
- 【ubuntu(Linux)安装Vs code并配置c++编译及cmake多文件编译】
目录标题 VS code配置c++编译环境 1. Linux系统安装 2. 在Ubuntu中安装VS code 2.1. 首先下载对应系统的VS code安装包 2.2. 安装VS code 3. 在 ...
- 从C源代码到可执行文件的四个过程:预处理、编译、汇编、链接
从C源代码到可执行文件的四个过程:预处理.编译.汇编.链接 总览 我们将在Linux操作系统中,以C语言的Hello World程序为例,用gcc编译器分步执行这四个步骤. 我们有再熟悉不过的Hell ...
- linux系统怎么查找 文件是否存在,在Linux上,如何知道一个可执行文件是否包含调试信息呢?...
请教,在Linux上,如何知道一个可执行文件是否包含调试信息呢?我的意思是是否该文件是使用如gcc -g 这样的参数编译的. 2楼 发表于 2008-12-3 15:44 nm -a binary_f ...
- build文件_把编译时间加入到目标文件
出处:https://www.cnblogs.com/pingwen/p/8183728.html 1.问题背景:如何保证发布出去的bin文件是最终测试通过的版本? 一般的来讲,代码到了测试后期,ma ...
- Linux C文件编译
设置编辑器 1.TAB键设置为4空格. 首先用vim打开/etc/vim/vimrc文件,这里面发现root用户才能修改vimrc文件,所以用sudo命令暂时切换到root用户. 在vimrc文件最后 ...
- ESP32开发 3.bat批处理文件,批量删除编译后的build文件夹,方便Git上传分享
前言 每次执行 idf.py build 后,编译器都会在工程目录下新建一个build目录,用于存放编译中间及生成的文件,文件非常多体积非常大,通常一个工程的build约有130MB左右.而这个文 ...
- 如何编译Linux内核文件
如何编译Linux内核文件 参考:朱有鹏Uboot的全集 前言:我们的Linux内核文件动则数万个文件,很多个子文件夹,当然是使用Makefile管理了,但是是不是真的仅仅只是make一下就可以了呢? ...
- Linux库文件使用与编译
介绍在Linux下使用静态库.共享库.动态库的方法. Linux库文件 静态库 在Linux中,以.a为后缀,如libtest.a 直接拷贝函数到二进制映像文件 只需要运行二进制文件,可以直接运行 共 ...
最新文章
- 【CSS3教程】CSS3基础常用技巧实例集合
- hmm 求隐藏序列_统计学习方法--HMM回顾
- NSFetchedResultsController和UITableView显示CoreData的数据时用relationship分组的方法
- 2021考研报考人数377万,读研VS工作,哪个更值得?
- c++ 为什么要按它们声明的顺序初始化成员变量?
- python基础(十三)
- ElasticSearch的Object数据类型
- 【洛谷P4706】取石子
- 树莓派python蓝牙_怎样通过蓝牙仅使用Android手机为树莓派配置Wi-Fi网络
- visio英文版下载与安装教程
- 零基础学习嵌入式:嵌入式linux视频教程免费分享
- python基础教程菜鸟教程-python菜鸟教程官网
- 安装ie11提示计算机安装了更新的版本,离线安装IE11浏览器提示quot;获取更新quot;解决方法 - 191路由网...
- Qt5-将手机上B站下载的视频提取到到电脑上并批量移动到指定文件夹和重命名
- 目前可用的微博秀的嵌入方法大全(亲测2019年2月仍有效) 1
- 麻了,别再为难软件测试员了
- vPro里面的v代表什么意思?
- 父爱动画代码python_python表白实现代码(可视化与动画版)
- 2020年某计算机菜鸡的中九保研之旅(武大、华科、北理、西交、中山)
- 罗永浩微博发声,锤子或再出新一代坚果手机?
热门文章
- Bmob关联Android,Android如何使用Bmob后端云实现失物招领功能
- 第一款个人应用——《不做手机控》——终于上线啦!
- 产品需求文档(PRD)写作(一) 写前准备(信息结构图)
- 日巡千店,数字化远程巡店打造高效运营模式
- vue + elementui table 列内容相同 自动合并单元格 完整代码
- eax, ebx, ecx, edx, esi, edi, ebp, esp
- 免费wiki系统php,HDWiki
- matlab在大气科学,MATLAB入门在大气科学中的应用学术沙龙活动圆满成功
- 基于二极管的温度检测电路
- 5 开源Math.NET基础数学类库使用 C#解析Delimited Formats数据格式