博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
linux 编译程序的四个过程
阅读量:6466 次
发布时间:2019-06-23

本文共 730 字,大约阅读时间需要 2 分钟。

一、预编译 

他的命令是gcc -E main.c -o main.o   假设当前要编译的文件是main.c

1.将所有的#define删除,并展开所有的宏定义; 

2.处理所有的预编译指令,例如:#if,#elif,#else,#endif; 

3.处理#include预编译指令,将被包含的文件插入到预编译指令的位置; 

4.添加行号信息文件名标识,便于调试; 

5.删除所有的注释:

6.保留所有的#pragma编译指令,因为在编写程序的时候,我们经常要用到#pragma指令来设定编译器的状态或者是

指示编译器完成一些特定的动作。 

生成.i文件。

包括去注释 ,宏替换 ,头文件展开,条件编译

经编译后的.i文件不包含任何宏定义,因为所有的宏已经被展开,并且包含的文件已经被插入到.文件中

二、编译:C语言——》汇编

他的命令是:gcc -s main.i -o main.s

1.扫描,语法分析,语义分析,源代码优化,目标代码生成,目标代码优化;

2.生成汇编代码;

3.汇总符号; 

4.生成.s文件

三、汇编:汇编——》二进制 

他的命令是:gcc -c main.s -o main.o

1.根据汇编指令和特定平台,把汇编指令翻译成二进制形式;

2.合并各个section,合并符号表; 

3.生成.o文件

四、链接

1.合并各个.obj文件的section,合并符号表,进行符号解析; 

2.符号地址重定位; 

3.生成可执行文件

也可以从c源代码开始经过预处理,编译,汇编,链接直接输出可执行文件

他的命令是:gcc -c main.s -o main.o

 

转载于:https://www.cnblogs.com/smile-812/p/7723545.html

你可能感兴趣的文章
windows 7/mac编译cocos2d-x-3.2*的android工程报错
查看>>
MYSQL导入导出.sql文件(转)
查看>>
git review报错一例
查看>>
《信息安全系统设计基础》 课程教学
查看>>
Linux平台下使用rman进行oracle数据库迁移
查看>>
全栈工程师学习Linux技术的忠告
查看>>
iOS自定制tabbar与系统的tabbar冲突,造成第一次点击各个item图片更换选中,第二次选中部分item图片不改变...
查看>>
C# Dictionary用法总结
查看>>
SVN服务器使用(二)
查看>>
反射获取内部类以及调用内部类方法
查看>>
C语言 - pthread
查看>>
谈Linq To Sql的优劣--纯个人观点
查看>>
App里面如何正确显示用户头像
查看>>
DATAGUARD维护:从库宕机后如何恢复到管理恢复模式
查看>>
U-BOOT之一:BootLoader 的概念与功能
查看>>
我的路上
查看>>
Velocity处理多余空白和多余空白行问题
查看>>
内容开发平台(PLATFORM)
查看>>
java值传递
查看>>
判断一个数是否为素数的一个讨论(一)
查看>>