[Linux调查局] 编译过程

news2024/11/22 20:25:23

编译过程

  • 引子
  • 编译阶段
    • 预处理
    • 汇编
    • 编译
    • 链接
  • 链接详解
  • release && debug

引子

一个程序的编译分为4个部分:

  1. 预处理
    1. 头文件的展开
    2. 条件编译
    3. 宏的展开
    4. 去掉注释
  2. 编译
    生成汇编
  3. 汇编
    生成计算机认识的机器指令, 即二进制文件
  4. 链接
    将程序和 链接

🗨️这里有一个疑问: 在汇编阶段, 已经生成了机器指令. 按理说, 应该就可以结束了, 那为什么还要连链接?

  • 首先, 先明确, 链接阶段是和 做链接.
    那么, 库又是什么?
    库是各种方法的实现方式, 而我们熟知的 头文件是各种方法的声明.
    那么, 方法又是什么?
    比较常见的, 如: printf, cout, cin … …, 这些我们常常会用到的方法, 就会将它写入库中
    在后面的学习中, 我们还知道链接是分 动态链接静态链接的, 它们又有什么区别呢? 咋们后面再说

编译阶段

预处理

gcc -E 源文件 -o 目标文件

  1. -E 是gcc关于预处理的选项, 后面的文件是 源文件
  2. -o 后面是生成的目标文件. 一般预处理的文件后缀是 .i


3. 在预处理过程中是平替过去的, 所以不会有语法检查
4. 条件编译其实在日常生活中是非常常见的. 比如: 拿视频的普通用户 和 VIP用户来说, 其实就是利用条件编译 将VIP用户的部分功能 剪枝 掉, 才有的普通用户的功能, 那么这样就只用维护一段代码就可以了.

汇编

gcc -S 预处理文件/源文件 -o 目标文件

  1. -S 是gcc关于汇编的选项, 后面跟的是 源文件
  2. -o 后面跟的是 目标文件. 一般汇编的目标文件的后缀是 .s

编译

gcc -c 源文件/汇编文件 -o 目标文件

  1. -c 是gcc关于编译的选项, 后面跟的是 源文件

  2. -o 后面跟的是 目标文件. 一般汇编的目标文件的后缀是 .o

  3. 生成的是机器可识别指令, 即二进制文件

  4. 假如 目标文件是 test.o, 我们管 test.o 也叫作 可重定位目标二进制文件, 简称 目标文件. 目标文件不能单独运行, 要通过和 进行链接才能运行👇👇👇

🗨️有人便会说 权限不够导致的

  • 文件的执行权限是 x, 那我们就给 test.o 文件加入 x 权限👇👇👇

    权限是能不能做, 但是你即使可以做, 但是有些人就是不让你做这件事情! 社会就是如此的残酷

链接

gcc 源文件 -o 目标文件

  1. 链接没有选项
  2. -o 后面跟目标文件

总结:
1 . 链接阶段没有选项, 前面的选项依次是ESc
2. 链接阶段没有强调后缀名, 前面的后缀名依次是 iso

🗨️这些选项 ESc 有什么功能啊?

  • 首先, 我们发现 链接阶段 , gcc 源文件 -o 目标文件 是 直接编译完成的
    其次, 我们发现, 在我们加入了这些选项之后, gcc好像是遇到了什么阻碍, 翻译到那里就停止了.
    由此, 我们便可得出结论:
  • -E :告诉gcc翻译到预处理就停止翻译
  • -S : 告诉gcc翻译到汇编就停止翻译
  • -c : 告诉gcc翻译到编译就停止翻译

链接详解

通过前面的学习, 我们知道了编译的各个阶段以及各个阶段编译器做的事情.
可重定位目标二进制文件不能单独运行, 必须和 链接了才能运行.
库是各种方法的实现形式, 头文件的各种方法的声明.

🗨️那么, Linux下库在哪里, 长什么样子?

  • 在这里, 科普一下:
  1. Windows下是有静态库(.lib) 和 动态库(.dll)的,
    Linux下也是有静态库(.a) 和 动态库(.so) 的.
  2. Linux下库的 命名规则 — — libname.xxx(后缀), 所以我们查C语言的库就是 libc.so 或 libc.
  3. Linux下库的路径 — — /usr/lib/... ...


我们发现, Linux下C语言库默认是有动态库的, 但是没有静态库, 我们也可以这样理解 C语言的标准库就是动态库, 默认的链接方式是动态链接
由此出现几个问题:

  1. C语言静态库如何安装?

sudo yum -y install glibc-static — — 安装C语言的静态库
sudo yum -y install libstdc+±static — — 安装C++的静态库

  1. 如何使用静态链接?

gcc 源文件 -o 目标文件 -static

  1. 为什么C语言库默认是动态库呢?
    使用静态库进行的链接是 静态链接, 使用动态库进行的链接是 动态链接
    两种链接方式的区别:

    1. 动态链接 — — 通过C语言编译器将源文件所需要的动态库的链接告知 可执行程序
    2. 静态链接 — — 将源文件所需要的静态库拷贝到可执行程序中.

    通过比较两种链接方式, 我们可以得知: 通过动态链接方式, 最后生成的可执行程序的大小 要 小于 通过静态链接方式生成的可执行文件的大小⇒ 这样可以有效地节省空间(磁盘空间, 内存空间, 网络空间等等)👇👇👇

  2. 一个可执行文件是单纯动态链接还是静态链接还是动静态混合链接?
    在没有静态库的情况下, 那就是动态链接喽
    在有静态链接的情况下:

    1. 加-static, 那就是强制使用静态链接
    2. 没加-static, 那就是动静态混合链接

file 可执行文件 — — 查看此可执行文件的链接方式

ldd 可执行文件 — — 查看此可执行文件所依赖的动态库

release && debug

在VS上, 默认生成的可执行文件是 debug版本,
而在Linux上, 默认生成的可执行文件是 release版本.
如果要变成debug版本, 那要在编译的时候加 -g

🗨️何为debug版本?

  • debug版本就是在可执行文件中 添加调试信息
    添加, 添加 ⇒ 那就意味着, 最后生成的可执行文件的空间要变大👇👇👇

debug版本 是我们之后学习的 gdb调试 的基础.


弟子曰:有所忿懥,如何?
阳明曰:只是个物来顺应,不要着一分意思,便心体廓然大公,得其本体之正了。
译文:
弟子问:情绪不好,愤怒怨恨怎么办?
先生说:顺其自然,不要沾上主观意气,就能保持本心的平静。
愤怒的情绪很正常,每个人都会有。
但是如果任由自己发泄情绪,往往会造成不可挽回的伤害。
王阳明给出的方法是:戒掉主观,人尽量不要把自己代入。
用旁观者的角度,来看待这个问题,人的情绪就会减弱很多。
苏轼有云:
不识庐山真面目,只缘身在此山中。
学会旁观,让自己跳出来,人生才能不被情绪控制,不被愠怒左右。

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

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

相关文章

《Reinforcement Learning: An Introduction》第8章笔记

文章目录 Chapter 8 Planning and Learning with Tabular Methods8.1 Models and Planning8.2 Dyna: Integrated Planning, Acting, and Learning8.3 When the Models Is Wrong8.4 Prioritized Sweeping8.5 Expected vs. Sample Updates8.6 Trajectory Sampling8.7 Real-time D…

南京大学【软件分析】13 Static Analysis for Security

文章目录 1. Information Flow Security2. Confidentiality and Integrity3. Explicit Flows and Covert/Hidden Channels4. Taint Analysis污点分析案例 1. Information Flow Security 引起安全问题最主要的两大原因是:injection errors(2013-2019排名…

Disucz插件-免费最全Disucz插件大全

在网络世界里,拥有一个活跃并充满吸引力的社区论坛是许多网站管理员和品牌经营者的梦想。然而,要让一个论坛充满活力、吸引大量用户,需要大量的内容。这就是为什么许多人转向Disucz插件的原因。Disucz插件不仅可以帮助您创建一个互动性强大的…

数据响应式原理

面试题:请阐述vue2响应式原理 vue官方阐述:https://cn.vuejs.org/v2/guide/reactivity.html 响应式数据的最终目标,是当对象本身或对象属性发生变化时,将会运行一些函数,最常见的就是render函数。 在具体实现上&#x…

基于SpringBoot的飘香水果购物网站

目录 前言 一、技术栈 二、系统功能介绍 水果信息管理 减积分管理 会员购买订单管理 首页 水果 购买水果订单管理 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 随着信息互联网购物的飞速发展,一般企业都去创建属于自己的电商平台以及购物…

crypto:大帝的密码武器

题目 下载zip之后可得到提示文本 结合题目名和文本提示可知&#xff0c;为凯撒密码 利用脚本&#xff0c;爆破位移的位数 str1 FRPHEVGL str2 str1.lower() num 1 for i in range(26):print("{:<2d}".format(num),end )for j in str2:if(ord(j)num > or…

【QT开发(6)】0926-QT 中加入 fastDDS 通信库的程序使用说明

在智能驾驶中&#xff0c;DDS有可能被广泛使用&#xff0c;因此推出这篇说明教程。 1、基于【QT开发&#xff08;5&#xff09;】教程的项目文档进行开发 2、安装DDS 查看《【eProsima Fast DDS&#xff08;1&#xff09;】安装eProsima Fast DDS》 至少安装: foonathan_m…

idea Springboot 高校科研资源共享系统VS开发mysql数据库web结构java编程计算机网页源码maven项目

一、源码特点 springboot 高校科研资源共享系统是一套完善的信息系统&#xff0c;结合springboot框架和bootstrap完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用springboot框架&#xff08;MVC模式开发&#xff09;&#xff0c; 系统具有完整的源代码和数据…

spring源码解析——IOC-开启 bean 的加载

概述 前面我们已经分析了spring对于xml配置文件的解析&#xff0c;将分析的信息组装成 BeanDefinition&#xff0c;并将其保存注册到相应的 BeanDefinitionRegistry 中。至此&#xff0c;Spring IOC 的初始化工作完成。接下来我们将对bean的加载进行探索。 BeanFactory 当我…

WinPcap4.1.3安装失败解决方法,A newer version of winpcap...

WinPcap4.1.3安装失败解决方法&#xff0c;A newer version of winpcap… 如图所示&#xff0c;提示本地安装有更高版本的WinPcap时&#xff0c;按如下操作即可解决。 找到相应文件&#xff0c;扩展名修改成如下&#xff1a; C:\Windows\SysWOW64 的wpcap.dll改成 wpcap.dll.…

微服务治理:构建强大、健壮的分布式系统

文章目录 什么是微服务治理&#xff1f;微服务治理的挑战1. 服务注册和发现2. 负载均衡3. 故障处理4. 安全性5. 监控和日志记录 构建强大的微服务治理1. 服务网格2. 服务注册和发现3. 负载均衡4. 故障处理5. 安全性6. 监控和日志记录 微服务治理的未来 &#x1f389;欢迎来到架…

ACGAN

CGAN通过在生成器和判别器中均使用标签信息进行训练&#xff0c;不仅能产生特定标签的数据&#xff0c;还能够提高生成数据的质量&#xff1b;SGAN&#xff08;Semi-Supervised GAN)通过使判别器/分类器重建标签信息来提高生成数据的质量。既然这两种思路都可以提高生成数据的质…

Oracle - 多区间按权重取值逻辑

啰嗦: 其实很早就遇到过类似问题&#xff0c;也设想过&#xff0c;不过一致没实际业务需求&#xff0c;也就耽搁了&#xff1b;最近有业务提到了&#xff0c;和同事讨论&#xff0c;各有想法&#xff0c;所以先把逻辑整理出来&#xff0c;希望有更好更优的解决方案&#xff1b;…

传统遗产与技术相遇,古彝文的数字化与保护

古彝文是中国彝族的传统文字&#xff0c;具有悠久的历史和文化价值。然而&#xff0c;由于古彝文的形状复杂且没有标准化的字符集&#xff0c;对其进行文字识别一直是一项具有挑战性的任务。本文介绍了古彝文合合信息的文字识别技术&#xff0c;旨在提高古彝文的自动识别准确性…

linux 和 windows的換行符不兼容問題

linux 和 windows的換行符&#xff1a; 1.vim 模式下&#xff0c;執行命令&#xff1a; :set ffunix idea中設置code style

从零手搓一个【消息队列】项目设计、需求分析、模块划分、目录结构

文章目录 一、需求分析1, 项目简介2, BrokerServer 核心概念3, BrokerServer 提供的核心 API4, 交换机类型5, 持久化存储6, 网络通信7, TCP 连接的复用8, 需求分析小结 二、模块划分三、目录结构 提示&#xff1a;是正在努力进步的小菜鸟一只&#xff0c;如有大佬发现文章欠佳之…

Linux账户组管理及权限练习

1.使用id命令查看root账户信息 [rootserver ~]# id root 用户id0(root) 组id0(root) 组0(root) 2.使用id命令查看自己的普通账户信息 [rootserver ~]# id kxy 用户id1000(kxy) 组id1000(kxy) 组1000(kxy),10(wheel) 3.新建账户test1&#xff0c;并查看账户信息&#xff1a; [ro…

安装python扩展库

博主&#xff1a;命运之光 专栏&#xff1a;Python程序设计 Python扩展库安装 Python提供了丰富的标准库&#xff08;不需要安装&#xff09; &#xff0c;还支持大量的第三方扩展库&#xff0c;它们数量众多、功能强大、涉及面广、使用方便&#xff0c;得到各行业领域工程师的…

千问的大模型KnowHow

卷友们好&#xff0c;我是rumor。 通义千问昨天放出了14b参数的模型&#xff0c;还有一份比较详尽的技术报告&#xff0c;包含作者们训练8个模型的宝贵经验。 同时他们开源的13B比起开源的SOTA也有不少提升&#xff1a; 今天我们就来一起白嫖&#xff0c;更多细节请移步原文&am…

Mybatis 日志(Apache Commons Logging)

之前我们介绍了使用JDK Log打印Mybatis运行时的日志&#xff1b;本篇我们介绍使用Apache Commons Logging打印Mybatis运行时的日志。 如何您对Mybatis中使用JDK Log不太了解&#xff0c;可以参考&#xff1a; Mybatis 日志(JDK Log)https://blog.csdn.net/m1729339749/articl…