Linux--编译链接的过程

news2024/11/19 5:40:36


一.gcc,g++,gdb安装

命令行写gcc,g++,gdb根据提示安装:

sudo apt install gcc/g++/gdb


二.gcc分布编译链接

编译链接的过程:(面试过程一个大的问题)

(1)预编译:
gcc -E main.c -o main.i 用gcc预编译main.c输出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


3.编译链接过程★★★

编译链接原理:
1.预编译:main.c通过预编译生成main.i文件
2.编译:main.i通过编译生成main.s文件
3.汇编:main.s通过汇编生成main.o文件(可重定位的二进制目标文件)
4.链接:链接阶段就是将所有的.o文件, .a文件(静态库文件), .lib文件, .obj文件链接起来,生成.out文件(ELF格式的可执行文件) (Windows是生成.exe文件)
预编译生成.i文件(第一步),编译生成.s文件(第二步),即编译生成汇编指令,然后接下来
**当然就是汇编了,对汇编指令进行汇编,生成.o文件(第(3)步),即变成二进制指令(第(3)
步),最后就是链接了(第四步)**


参考书目及拓展:程序员的自我修养     2.1章  37页

(1)预编译阶段
a)删除所有的"#define",并且展开所有的宏定义;
b)处理所有的条件预编译指令,"#if","#ifdef","#endif"等;
c)处理"#include"预编译指令,将被包含的文件插入到该预编译指令的位置;
d)删除所有的注释;

e)添加行号和文件名标识,以便于编译器产生调试用的符号信息及编译时产生编译错
误和警告时显示行号;
f)保留所有的#pragma编译器指令,因为编译器需要使用它们;

(2)编译阶段
词法分析,语法分析,语义分析,代码优化,汇总符号

(3)汇编阶段:
将汇编指令翻译成二进制格式,生成各个section,生成符号表.
(4)链接阶段
1)合并各个section,调整section的起始位移和段大小,合并符号表,进行符号解析,给符号分配虚拟地址;
2)符号重定位,即在使用符号的地方全部替换成符号的虚拟地址;


4.执行

一步:gcc -o main main.c (用的最多,记住) 输出的是main ,编译的是main.c

举个例子: 运行helloworld


Linux系统下的helloworld运行完毕!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1507707.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java学习笔记(10)

学生管理系统项目 package exercise;import java.util.ArrayList; import java.util.Scanner;public class StudentProgramme {public static void main(String[] args) {ArrayList<Student> studentArrayList new ArrayList<>();Student newStudent new Student…

Linux——文件标识符

目录 一、文件基础 二、常见的C语言文件接口 三、系统文件接口 四、理解语言与系统文件操作的关系 五、如何理解一切皆文件 六、文件标识符再理解 一、文件基础 一个空文件&#xff0c;也会占用磁盘空间&#xff0c;这是因为文件不仅仅有存放在里面的内容&#xff0c;还…

医学图像分析算法的原理

医学图像分析算法的实现原理涉及数据准备、特征提取、模型选择与训练、模型评估与优化以及部署与应用等多个步骤和技术。通过这些步骤&#xff0c;可以利用机器学习和深度学习技术来帮助医生更准确、更高效地进行医学图像诊断和分析。北京木奇移动技术有限公司&#xff0c;专业…

LeetCode 1315.祖父节点值为偶数的节点和

给你一棵二叉树&#xff0c;请你返回满足以下条件的所有节点的值之和&#xff1a; 该节点的祖父节点的值为偶数。&#xff08;一个节点的祖父节点是指该节点的父节点的父节点。&#xff09; 如果不存在祖父节点值为偶数的节点&#xff0c;那么返回 0 。 示例&#xff1a; 输入…

面试官:MySQL的七种日志

哪七种日志日志&#xff1f; 错误日志&#xff08;error log&#xff09; error log主要记录MySQL在启动、关闭或者运行过程中的错误信息&#xff0c;在MySQL的配置文件my.cnf中&#xff0c; 可以通过log-error/var/log/mysqld.log 执行mysql错误日志的位置。 慢查询日志&a…

重读 Java 设计模式: 解析单例模式,保证唯一实例的创建与应用

本周工作太忙了&#xff0c;变成了加班狗&#xff0c;下班回来也没时间写&#xff0c;只能利用周末时间写了&#x1f62d;。 好了&#xff0c;言归正传&#xff0c;本次我们先来介绍下设计模式中创建型模式-单例模式。 一、引言 单例模式是设计模式中最简单但又最常用的一种模…

【图论】 【割点】 【双连通分类】LCP 54. 夺回据点

本文涉及知识点 图论 割点 双连通分类 割点原理及封装好的割点类 LeetCode LCP 54. 夺回据点 魔物了占领若干据点&#xff0c;这些据点被若干条道路相连接&#xff0c;roads[i] [x, y] 表示编号 x、y 的两个据点通过一条道路连接。 现在勇者要将按照以下原则将这些据点逐一…

Docker容器Docker桌面配置镜像加速

打开Docker Desktop应用程序&#xff0c;点击设置 具体配置如下&#xff1a; {"builder": {"gc": {"defaultKeepStorage": "20GB","enabled": true}},"experimental": false,"features": {"buil…

基于java的足球联赛管理系统(程序+数据库+文档)

** &#x1f345;点赞收藏关注 → 私信领取本源代码、数据库&#x1f345; 本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目&#xff0c;希望你能有所收获&#xff0c;少走一些弯路。&#x1f345;关注我不迷路&#x1f345;** 一、研究背景…

【数据库】软件测试之MySQL数据库练习题目

有表如下&#xff1a; Student 学生表 SC 成绩表 Course 课程表 Teacher 老师表 每个学生可以学习多门课程&#xff0c;每一个课程都有得分&#xff0c;每一门课程都有老师来教&#xff0c;一个老师可以教多个学生 1、查询姓‘朱’的学生名单 select * from Student whe…

「CISP题库精讲」CISP题库习题解析精讲20道

前言 本篇主要对CISP教材第九章《计算环境安全》的一些习题进行讲解&#xff0c;包括20道题&#xff0c;这里只是部分习题&#xff0c;针对第九章可能会多写几章的内容&#xff0c;如果我发布的这些习题里面没有你想找的那道题&#xff0c;你也可以直接私信我&#xff0c;我加…

趣学前端 | Taro迁移完成之后,总结了一些踩坑经验

背景 四月份的时候&#xff0c;尝试将老的移动端项目改造成多端。因为老项目使用的React框架&#xff0c;综合考量&#xff0c;保障当前业务开发的进度同时&#xff0c;进行项目迁移&#xff0c;所以最后选择了Taro框架。迁移成本会低一些&#xff0c;上手快一些。 上个月&am…

新书速览|Vue.js 3.x+Element Plus从入门到精通(视频教学版)

详解Vue.jsElement Plus框架各组件的用法&#xff0c;实战网上商城系统和图书借阅系统开发 本书内容 《Vue.js 3.xElement Plus从入门到精通&#xff1a;视频教学版》通过对Vue.js&#xff08;简称Vue&#xff09;的示例和综合案例的介绍与演练&#xff0c;使读者快速掌握Vue.j…

【掌握版本控制:Git 入门与实践指南】配置详解|理解本地仓库结构

&#x1f3ac;慕斯主页&#xff1a;修仙—别有洞天 ♈️今日夜电波&#xff1a;泥中に咲く—ウォルピスカーター 0:34━━━━━━️&#x1f49f;──────── 4:46 &#x1f504; ◀️ ⏸ ▶…

excel批量数据导入时用poi将数据转化成指定实体工具类

1.实现目标 excel进行批量数据导入时&#xff0c;将批量数据转化成指定的实体集合用于数据操作&#xff0c;实现思路&#xff1a;使用注解将属性与表格中的标题进行同名绑定来赋值。 2.代码实现 2.1 目录截图如下 2.2 代码实现 package poi.constants;/*** description: 用…

力扣--动态规划/回溯算法131.分割回文串

思路分析&#xff1a; 动态规划 (DP)&#xff1a; 使用动态规划数组 dp&#xff0c;其中 dp[i][j] 表示从字符串 s[i] 到 s[j] 是否为回文子串。预处理动态规划数组&#xff1a; 从字符串末尾开始&#xff0c;遍历每个字符组合&#xff0c;判断是否为回文子串&#xff0c;填充…

像SpringBoot一样使用Flask - 2.静态资源访问及模版

一、安装并导入 render_template 功能&#xff1a;渲染/加载模板&#xff0c;一般是html页面 参数&#xff1a;函数的第一个参数是模板的文件名&#xff0c;必填&#xff0c;后面的参数都是键值对&#xff0c;表示模板中变量对应的值&#xff0c;非必填 (不填界面也不会展示成变…

使用express+nginx+pm2+postman实现推送zip包自动更新前端网页

1.nginx配置将80端口代理到项目的3000端口 server {listen 80; #监听的端口server_name localhost; #监听的域名#charset koi8-r;#access_log logs/host.access.log main;location / {#root html;#index index.html index.html;proxy_pass http://127.0.0.1:3000; #转…

Android App冷启动耗时优化

Android应用启动过程 Android应用启动过程&#xff0c;主要包含app::onCreate及执行前的Application阶段及Activity::onCreate执行之后的Activity阶段&#xff0c;以及两个阶段之间的间隙handleMessage阶段和最终页面渲染上屏完成前数据加载阶段四个区间组成。 具体来看&#x…

如何提高内存和cpu使用率呢?-Linux类资源

最近公司项目上线时&#xff0c;红蓝线巡检时&#xff0c;部分服务器因配置高但使用率低而需要降级。 为了避免降级&#xff0c;如何增加内存和CPU使用率&#xff1f; 这可以通过脚本来实现。 当前服务器操作系统版本&#xff1a;-7_5。 连接服务器后&#xff0c;登录账号。 …