Linux编译过程与交叉编译

news2024/10/5 19:18:17

在这里插入图片描述

一.GCC由来

GCC(GNU编译器套件)是一个自由开源的编程工具集,用于编译和链接C、C++和其他编程语言的程序。它由理查德·斯托曼(Richard Stallman)和其他自由软件基金会(Free Software Foundation)的成员开发,旨在创造一个与UNIX操作系统兼容的编译器。

GCC最初的开发始于1984年,当时理查德·斯托曼创建了GNU项目,这个项目的目标是提供一个自由的UNIX操作系统。为了实现这个目标,他意识到需要一个高质量的编译器。

GCC最初是以C语言编写的,用于编译C程序。随着时间的推移,它逐渐发展成一个支持更多编程语言的工具集,包括C++、Objective-C、Fortran、Ada和其他语言。GCC的设计注重可移植性和扩展性,使其能够在各种不同的操作系统和硬件平台上工作。

GCC在自由软件社区中取得了巨大的成功,并成为许多开源项目的标准编译器。它在许多操作系统中被广泛使用,包括GNU/Linux、FreeBSD、Solaris和Mac OS X等。GCC的开发和维护仍然活跃,不断更新和改进以适应新的编程语言和技术。

二.POSIX接口

POSIX(Portable Operating System Interface,可移植操作系统接口)是一套定义了操作系统接口标准的规范集合,旨在促进不同操作系统之间的可移植性和互操作性。

POSIX接口最初由IEEE组织提出,并在1988年被标准化为IEEE标准1003。它的设计目标是为UNIX及其类似系统(如Linux、BSD等)提供一个一致的接口标准,使得在这些系统上编写的程序能够在不同系统中无需修改地移植。

POSIX接口涵盖了许多方面,包括文件操作、进程管理、线程、信号处理、输入输出、网络编程等。它定义了许多函数调用、数据类型和系统常量,程序员可以使用这些接口来编写可移植的系统软件。

通过遵循POSIX接口,开发人员可以使他们的程序能够在不同的POSIX兼容操作系统上运行,而不需要进行很多的修改。这为软件开发和移植提供了更大的灵活性和效率。

需要注意的是,虽然POSIX接口主要针对UNIX相关系统,但也有其他操作系统(如Windows)提供了POSIX兼容层,以便与POSIX软件进行互操作。这样一来,使用POSIX接口编写的程序可以在更广泛的平台上运行。

三.GCC编译工具链

GCC(GNU编译器套件)和Binutils都是开源软件工具,常常一起使用来进行软件开发。下面分别介绍一下它们:

  1. GCC(GNU编译器套件):GCC是一款功能丰富、高度可配置的编译器。它支持多种编程语言,包括C、C++、Objective-C、Fortran、Ada等。GCC的主要组成部分是编译器前端、编译器后端和代码优化器。

    • 编译器前端:负责解析源代码、进行语法分析和生成中间表示形式(如抽象语法树),并进行语义分析和类型检查。
    • 编译器后端:将中间表示形式转换为目标机器的汇编代码。
    • 代码优化器:负责对生成的汇编代码进行优化,以提高程序的性能和效率。

    GCC还内置了预处理器、汇编器和链接器等工具,它们可以一起构成完整的编译工具链。

  2. Binutils:Binutils是一组用于处理二进制文件的工具集。它包含了一些常用的工具,如汇编器(as)、链接器(ld)、库管理器(ar)、调试器(gdb)等等。

    • 汇编器(as):将汇编代码翻译成机器代码。
    • 链接器(ld):将多个目标文件和库文件链接在一起,生成可执行文件或共享库文件。
    • 库管理器(ar):用于创建、操作和管理静态库文件。
    • 调试器(gdb):用于调试程序,支持断点设置、变量查看、堆栈跟踪等调试功能。

Binutils和GCC一起使用,可以完成整个软件开发的生命周期,从编译到链接,再到调试和优化。它们是GNU项目的一部分,旨在提供开源的、高质量的工具,促进自由软件的开发和可移植性。

四.什么是交叉编译

交叉编译(Cross-compilation)是指在一个操作系统或架构上开发和编译程序,但目标平台是不同于开发平台的操作系统或架构。

通常情况下,编译器会将源代码翻译成目标平台的机器代码,生成可在该平台上执行的可执行文件。但当开发平台与目标平台不同时,编译器需要具备交叉编译的能力,即可以生成适用于目标平台的可执行文件。

交叉编译在嵌入式系统和跨平台开发中非常常见。例如,要在开发平台为x86的PC上编译运行在ARM处理器上的嵌入式系统的应用程序,就需要进行交叉编译。在这种情况下,开发者需要使用能够生成ARM架构的目标文件的交叉编译器。

交叉编译的过程包括以下步骤:

  1. 配置交叉编译环境:首先需要获取适用于目标平台的交叉编译工具链,包括交叉编译器、交叉汇编器、交叉链接器等。这些工具链会针对目标平台进行配置,以便生成适用于目标系统的可执行文件。

  2. 编写源代码:使用开发平台上的文本编辑器或集成开发环境(IDE)编写源代码。

  3. 交叉编译:使用交叉编译器对源代码进行编译,生成适用于目标平台的目标文件。

  4. 链接:使用交叉链接器将目标文件与所需的库文件链接在一起,生成最终的可执行文件。

通过交叉编译,开发者可以在更便捷的开发环境下进行跨平台的开发和测试。这种方式可以提高开发效率,减少在不同平台上的编译时间,并且使得嵌入式系统的开发更加灵活和可靠。

五.裸机和Linux程序执行过程
================()

裸机

在这里插入图片描述

Linux程序执行

在这里插入图片描述

1.预处理,编译,汇编,链接形成可执行文件
在这里插入图片描述

2.通过shell命令(./textname)运行程序,创建进程实体。
在这里插入图片描述

3.动态链接(可没有),通过C库找到-start(程序入口),初始化程序执行环境。
在这里插入图片描述

4.执行men函数
在这里插入图片描述

5.结束程序执行
在这里插入图片描述

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

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

相关文章

leetcode229. 多数元素 II(java)

多数元素 II 题目描述Hash表记录 题目描述 难度 - 中等 leetcode229. 多数元素 II 给定一个大小为 n 的整数数组,找出其中所有出现超过 ⌊ n/3 ⌋ 次的元素。 示例 1: 输入:nums [3,2,3] 输出:[3] 示例 2: 输入&#…

LeetCode 1584. 连接所有点的最小费用【最小生成树】

本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章…

竞赛 基于机器视觉的行人口罩佩戴检测

简介 2020新冠爆发以来,疫情牵动着全国人民的心,一线医护工作者在最前线抗击疫情的同时,我们也可以看到很多科技行业和人工智能领域的从业者,也在贡献着他们的力量。近些天来,旷视、商汤、海康、百度都多家科技公司研…

使用电力系统稳定器 (PSS) 和静态 VAR 补偿器 (SVC) 提高瞬态稳定性(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

fastjson远程命令执行

fastjson远程代码执行 漏洞原因:fastjson在对json字符串反序列化的时候,会读取到type的内容,将json内容反序列化为java对象并调用这个类的setter方法。 1、搭建rmi服务 直接利用jndi-exploit工具 2、抓包改为POST。开启nc监听、发包 PO…

Python 函数的定义

视频版教程 Python3零基础7天入门实战视频教程 函数 函数是执行特定任务的一段代码,程序通过将一段代码定义成函数,并为该函数指定一个函数名,这样即可在需要的时候多次调用这段代码。 比如我们前面学到的range()函数,就是系统…

js dispatchEvent派发自定义事件

低版本IE浏览器不兼容 dispatchEvent使用 在标准浏览器提供了元素触发自定义事件的方法 element.dispatchEvent(),就是说,我们可以不用在DOM上点击按钮触发事件,在代码里通过 dispatchEvent()就能触发事件。如下&…

【Shiro】入门概述

1.是什么 Apache Shiro 是一个功能强大且易于使用的 Java 安全(权限)框架。Shiro 可以完 成:认证、授权、加密、会话管理、与 Web 集成、缓存 等。借助 Shiro 您可以快速轻松 地保护任何应用程序——从最小的移动应用程序到最大的 Web 和企业应用程序。 官网&…

使用 React Native 针对 Android 进行开发

🎬 岸边的风:个人主页 🔥 个人专栏 :《 VUE 》 《 javaScript 》 ⛺️ 生活的理想,就是为了理想的生活 ! 目录 概述 通过安装所需工具开始使用 React Native 创建新的 React Native 项目 本指南将有助于开始使用 Windows 上的…

【操作系统】聊聊进程间通信方式

作为操作系统软件治理的核心 进程,那么进程间通信的方式就非常重要,常见的比如管道、消息队列、共享内存、信号量、信号、Socket等。本篇主要简单介绍下 我们知道每个进程都有自己独立的用户空间,而内核空间是共享的。 管道 ps -ef | gre…

大数据与云计算——让我们进入数字化的新纪元

当谈论大数据和云计算时,我们进入了一个数字化时代的新纪元。这两个领域在科技和商业领域都有着深远的影响,改变了我们如何处理和存储数据,以及如何进行计算和分析。本文将探讨大数据和云计算的基本概念,它们的关系以及它们在不同…

YOLO Magic - 强化YOLOv5的视觉任务框架

YOLO Magic🚀 - 强化YOLOv5的视觉任务框架 YOLO Magic🪄是一个基于Ultralytics YOLOv5 v7.0 版本的扩展,旨在为视觉任务提供更强大的功能和更简单的操作。它在YOLOv5的基础上引入了丰富的网络模块,并提供了直观易用的Web操作界面&…

mysql如何实现根据经纬度判断某一个坐标是否在一个多边形区域范围内

要根据经纬度判断一个坐标是否在一个多边形区域内,MySQL提供了几种函数来处理地理空间数据,其中包括用于处理多边形区域的函数。 1.创建一个包含多边形区域的表: 首先,创建一个表来存储多边形区域。可以使用ST_GeomFromText函数将…

Java集合之LinedList

LinedList类实现了List接口,他提供了(双向的)链表数据结构 在该链表中的每一个元素除了存储本身的内容之外还存储指向前一个元素的指针和指向后一个元素的指针,下图展示了一个包含三个元素的双向链表,每个链表都有一个…

C#使用DirectX SDK 加载.x三维模型

最近因为项目要做显示一个三维模型,所以研究了下如何在Winform中加载并显示三维模型。在Windows平台巨硬公司提供了DirectX SDK用于渲染图形,参考了几篇文章做了个demo记录下,以便日后温习只用。这个SDK涉及到了计算机图形学的一些基础知识&a…

听GPT 讲Istio源代码--operator

File: istio/istioctl/pkg/waypoint/waypoint.go 在Istio项目中,istio/istioctl/pkg/waypoint/waypoint.go文件是istioctl的源代码之一,用于管理Istio的路由规则。 revision变量用于指定Istio的版本号,例如可以值 v1.2.3。这个版本号用于检索…

openGauss学习笔记-71 openGauss 数据库管理-创建和管理普通表-删除表中数据

文章目录 openGauss学习笔记-71 openGauss 数据库管理-创建和管理普通表-删除表中数据 openGauss学习笔记-71 openGauss 数据库管理-创建和管理普通表-删除表中数据 在使用表的过程中,可能会需要删除已过期的数据,删除数据必须从表中整行的删除。 SQL不…

arcgis拓扑检查实现多个矢量数据之间消除重叠区域

目录 环境介绍: 操作任务: 步骤: 1、数据库和文件结构准备 2、建立拓扑规则 3、一直下一页默认参数后,进行拓扑检查 4、打开TP_CK_Topology,会自动带出拓扑要素,红色区域为拓扑错误的地方&#xff1…

Python 魔法方法

视频版教程 Python3零基础7天入门实战视频教程 Python的魔法方法,也称为特殊方法或双下划线方法,是一种特殊的方法,用于在类中实现一些特殊的功能。这些方法的名称始终以双下划线开头和结尾,例如__init__,repr&#x…

NV040D语音芯片丨助力空气净化器语音功能

空气净化器通过过滤网和电子静电等技术,可以清除室内空气中的有害物质,如灰尘、花粉、细菌、甲醛等,达到净化空气的目标,让人们呼吸到更加清新的空气,保护人体健康。在空气净化器中加入九芯语音芯片的提醒功能&#xf…