Linux(1)编译链接和gcc

[复制链接]
发表于 2025-9-8 04:22:04 | 显示全部楼层 |阅读模式
1、gcc分布编译链接

(1)预编译
gcc -E main.c -o main.i
(2)编译
gcc -S main.i -o main.s
(3)汇编
gcc -c main.s -o main.o
(4)链接
gcc main.o -o main
实验:./main
或者:全路径/main
2、编译链接过程

从源文件main.c开始——>预编译阶段(重要作用:处理预编译指令 和 删除注释)
——>编译阶段(重要作用:语法词法分析 优化代码 和 符号汇总)
——>汇编阶段(重要作用:翻译成二进制 生成各个段 和 生成符号表)
——>链接阶段(重要作用:归并各个段 符号解析 和 符号重定位)
——>.exe  a.out 

编译链接原理:
main.c通过预编译生成main.i文件
main.i通过编译生成main.s文件
main.s通过汇编生成main.o文件(可重定位的二进制目标文件)
链接阶段就是将全部的.o文件,.a文件(静态库文件),.lib文件,.obj文件链接起来,生成.out文件(ELF格式的可实验文件)(Windows是生成.exe文件)
预编译生成.i文件(第一步),编译生成.s文件(第二步),即编译生成汇编指令 然后接下来 是汇编,对汇编指令进行汇编,生成.o文件(第三步),也就是酿成二进制指令,最后就是链接(第四步)

(1)预编译阶段
a)删除全部的“#define”,并且展开全部的宏定义;
b)处理全部的条件预编译指令,“#if”,“#ifdef”,“#endif”等;
c)处理“#include”预编译指令,将全部被包罗的文件插入到该预编译指令的位置
d)删除全部的注释行
e)添加行号和文件号标识,以便于编译器产生调试用的符号信息及编译时产生编译错误和告诫时表现行号;
f)保留全部的#pragma编译器指令,由于编译器需要使用它们
(2)编译阶段
语法分析,语法分析,语义分析,代码优化,汇总符号
(3)汇编阶段
将汇编指令翻译成二进制格式,生成各个section,生成符号表
(4)链接阶段
1)归并各个section,调解section的起始位移和段大小,归并符号表,进行符号解析,给符号分配虚拟地址;
2)符号重定位,即在使用符号的地方全部更换成符号的虚拟地址;
3、实验

路径+可实验文件名

两步:gcc -c main.c -o main.o 或者 gcc -c main.c
           gcc -o main main.o                     gcc -o main main.c/main.o
一步:gcc -o main main.c


./main



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
继续阅读请点击广告

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

×
登录参与点评抽奖,加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表