当前位置: 首页 > news >正文

Linux(1)编译链接和gcc

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


相关文章:

  • 动态域名服务ddns怎么设置?如何使用路由器动态域名解析让外网访问内网?
  • Vitrualbox完美显示系统界面(只需三步)
  • 【源码+文档+调试讲解】党员之家服务系统小程序1
  • 数据治理域——日志数据采集设计
  • k8s之k8s集群部署
  • 【漫话机器学习系列】257.填补缺失值(Imputing Missing Values)
  • 【LeetCode 热题 100】二叉树的最大深度 / 翻转二叉树 / 二叉树的直径 / 验证二叉搜索树
  • 机器学习——聚类算法练习题
  • 我们该如何使用DeepSeek帮我们减负?
  • flowable
  • 芦康沙妥珠单抗说明书摘要
  • MUSE Pi Pro 编译kernel内核及创建自动化脚本进行环境配置
  • Azure 应用的托管身份与服务主体
  • STM32 启动文件分析
  • Linux架构篇、第五章git2.49.0部署与使用
  • Unity3d 打包安卓平台(Android apk)报错Gradle build failed解决方法
  • 2. 盒模型/布局模块 - 响应式产品展示页_案例:电商产品网格布局
  • JavaScript编译原理
  • 数据结构(七)——图
  • Kingston FURY全新推出高性能PCIe 5.0 NVMe固态硬盘
  • 刘永明|在从普及到提高中发展新大众文艺
  • 尊严的代价:新加坡福利体系下的价值困境
  • “无锡景・江南韵”:中国评弹艺术在尼日利亚收获众多粉丝
  • 马上评丨75万采购300元设备,仅仅终止采购还不够
  • 全国层面首次!《防震减灾基本知识与技能大纲》发布
  • 18世纪“精于剪切、复制、粘贴”的美国新闻界