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

Linux编译过程与交叉编译

在这里插入图片描述

一.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.结束程序执行
在这里插入图片描述

相关文章:

Linux编译过程与交叉编译

一.GCC由来 GCC(GNU编译器套件)是一个自由开源的编程工具集,用于编译和链接C、C和其他编程语言的程序。它由理查德斯托曼(Richard Stallman)和其他自由软件基金会(Free Software Foundation)的…...

MediaPipe+OpenCV 实现实时手势识别(附Python源码)

MediaPipe官网:https://developers.google.com/mediapipe MediaPipe仓库:https://github.com/google/mediapipe 一、MediaPipe介绍 MediaPipe 是一个由 Google 开发的开源跨平台机器学习框架,用于构建视觉和感知应用程序。它提供了一系列预训…...

为什么选择C/C++内存检测工具AddressSanitizer?如何使用AddressSanitizer?

目录 1、C程序中的内存问题 2、AddressSanitizer是什么? 3、AddressSanitizer内存检测原理简述 3.1、内存映射 3.2、插桩 4、为什么选择AddressSanitizer? 4.1、Valgrind介绍 4.2、AddressSanitizer在速度和内存方面为什么明显优于Valgrind 4.3…...

获取vue当前页面url问号后面的参数

除了使用 window.location.search 或 Vue Router 的 $route.query 来获取 URL 问号后面的参数之外,您还可以使用 JavaScript 中的正则表达式来解析 URL 中的参数部分。以下是一个示例: // 获取当前页面的完整 URL const currentURL window.location.hre…...

Linux编程之线程池的设计与实现

Linux编程之线程池的设计与实现(C98) 代码 假设服务器的硬件资源“充裕”,那么提高服务器性能的一个很直接的方法就是空间换时间, 即“浪费”服务器的硬件资源,以换取其运行效率。 提升服务器性能的一个重要方法就是…...

stm32---定时器输入捕获

一、输入捕获介绍 在定时器中断实验章节中我们介绍了通用定时器具有多种功能,输入捕获就是其中一种。 STM32F1除了基本定时器TIM6和TIM7,其他定时器都具有输入捕获功能 。输入捕获可以对输入的信号的上升沿,下降沿或者双边沿进行捕获&#xf…...

打造生产级Llama大模型服务

对于任何想要尝试人工智能或本地LLM,又不想因为意外的云账单或 API 费用而感到震惊的人,我可以告诉你我自己的旅程是如何的,以及如何开始使用廉价的消费级硬件执行Llama2 推理 。 这个项目一直在以非常活跃的速度发展,这使得它非…...

Acwing 828. 模拟栈

Acwing 828. 模拟栈 题目要求思路讲解代码展示 题目要求 思路讲解 栈&#xff1a;先进后出 队列&#xff1a;先进先出 代码展示 #include <iostream>using namespace std;const int N 100010;int m; int stk[N], tt;int main() {cin >> m;while (m -- ){string o…...

初识Docker

文章目录 Docker安装Docker简介1.什么是虚拟化、容器化?2. 为什么需要虚拟化、容器化&#xff1f;3. 虚拟化的实现方式主机虚拟化的实现方式容器虚拟化实现 4. 虚拟机和Docker的区别 Docker安装 基于Centos7进行安装 1.确认系统版本和CPU架构&#xff0c;Centos7的x86_64架构…...

HTTPS Tomcat Servlet 博客系统 软件测试的概念 Linux

第 1 题&#xff08;多选题&#xff09; 题目名称&#xff1a; 以下关于http和https说法正确的是 题目内容&#xff1a; A .http是超文本传输协议 B .https是超文本传输安全协议 C .http是明文传输 D .https是加密传输 第 2 题&#xff08;单选题&#xff09; 题目名称…...

​云南财经大学《乡村振兴战略下传统村落文化旅游设计》许少辉八一著作

​云南财经大学《乡村振兴战略下传统村落文化旅游设计》许少辉八一著作...

shopee——排序模型AUC还能涨吗?

文章目录 CBMRMultiCBMRSample Weight Assignment多任务推荐模型 CBMR MultiCBMR Sample Weight Assignment Click-aware Structure Transfer with Sample Weight Assignment for Post-Click Conversion Rate Estimation 每个用户的top-k 邻居每个商品的top-k 邻居平滑处理并构…...

长城网络靶场第三题

关卡描述&#xff1a;1.oa服务器的内网ip是多少&#xff1f; 先进行ip统计&#xff0c;开始逐渐查看前面几个ip 基本上都是b/s&#xff0c;所以大概率是http&#xff0c;过滤一下ip 第一个ip好像和oa没啥关系 第二个ip一点开就是 oa&#xff0c;应该就是他了。 关卡描述&a…...

Java“牵手”虾皮商品列表页数据采集+虾皮商品价格数据排序,虾皮API接口申请指南

虾皮商城是一个在线电子商务平台&#xff0c;总部设在新加坡&#xff0c;隶属于Sea Limited&#xff08;冬海集团&#xff0c;简称为Sea&#xff09;。虾皮商城于2015年在新加坡成立以来&#xff0c;业务范围辐射新加坡、马来西亚、菲律宾、泰国、越南、巴西等10余个市场1。拥有…...

Pyspark综合案例(pyspark安装和java运行环境配置)

一、RDD对象 PySpark支持多种数据的输入&#xff0c;在输入完成后&#xff0c;都会得到一个&#xff1a;RDD类的对象 RDD全称为&#xff1a;弹性分布式数据集&#xff08;Resilient Distributed Datasets&#xff09; PySpark针对数据的处理&#xff0c;都是以RDD对象作为载…...

虚拟机突然无法访问外部网络的现象集合

现场还原 虚拟机突然无法访问外部网络 ping 8.8.8.8的时候显示网络不可达 ping 8.8.8.8ping www.baidu.com&#xff08;报&#xff1a;未知的名称或服务或请求超时&#xff09; ping www.baidu.comyum操作 也提示错误&#xff1a;为仓库 ‘appstream’ 下载元数据失败 : C…...

国庆中秋特辑(一)浪漫祝福方式 用循环神经网络(RNN)或长短时记忆网络(LSTM)生成祝福诗词

目录 一、使用深度学习中的循环神经网络&#xff08;RNN&#xff09;或长短时记忆网络&#xff08;LSTM&#xff09;生成诗词二、优化&#xff1a;使用双向 LSTM 或 GRU 单元来更好地捕捉上下文信息三、优化&#xff1a;使用生成对抗网络&#xff08;GAN&#xff09;或其他技术…...

【入门篇】ClickHouse 的安装与配置

文章目录 0. 前言ClickHouse的安装1. 添加 ClickHouse 的仓库2. 安装 ClickHouse3. 启动 ClickHouse 服务器4. 使用 ClickHouse 客户端 ClickHouse的配置 1. 详细安装教程1.1. 系统要求1.1. 可用安装包 {#install-from-deb-packages}1.1.1. DEB安装包1.1.1. RPM安装包 {#from-r…...

为了工作刷题

1.同步通信和异步通信有什么区别&#xff1f;UART、SPI和I2C分别属于什么类型的通信方式&#xff1f; 同步通信&#xff1a;在同步通信中&#xff0c;发送方和接收方之间使用共享的时钟信号来同步数据传输。发送方按照时钟信号的边沿&#xff08;上升沿或下降沿&#xff09;将数…...

linux jenkins2.414.1-1.1版本安装

文章目录 前言一、rpm文件下载二、安装jenkins2.1.升级jdk1.82.2安装jenkins2.3 启动服务2.4 使用密码登录2.5 修改插件源2.6 汉化插件安装演示 总结 前言 之前也安装过jenkins&#xff0c;但是那个版本是2.1的&#xff0c;太老了很多插件都不支持&#xff0c;现在安装目前为止…...

OpenLayers 可视化之热力图

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 热力图&#xff08;Heatmap&#xff09;又叫热点图&#xff0c;是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...

Cursor实现用excel数据填充word模版的方法

cursor主页&#xff1a;https://www.cursor.com/ 任务目标&#xff1a;把excel格式的数据里的单元格&#xff0c;按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例&#xff0c;…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘

美国西海岸的夏天&#xff0c;再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至&#xff0c;这不仅是开发者的盛宴&#xff0c;更是全球数亿苹果用户翘首以盼的科技春晚。今年&#xff0c;苹果依旧为我们带来了全家桶式的系统更新&#xff0c;包括 iOS 26、iPadOS 26…...

RocketMQ延迟消息机制

两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数&#xff0c;对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后&#xf…...

(十)学生端搭建

本次旨在将之前的已完成的部分功能进行拼装到学生端&#xff0c;同时完善学生端的构建。本次工作主要包括&#xff1a; 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

Frozen-Flask :将 Flask 应用“冻结”为静态文件

Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是&#xff1a;将一个 Flask Web 应用生成成纯静态 HTML 文件&#xff0c;从而可以部署到静态网站托管服务上&#xff0c;如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

Module Federation 和 Native Federation 的比较

前言 Module Federation 是 Webpack 5 引入的微前端架构方案&#xff0c;允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...

MySQL 8.0 OCP 英文题库解析(十三)

Oracle 为庆祝 MySQL 30 周年&#xff0c;截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始&#xff0c;将英文题库免费公布出来&#xff0c;并进行解析&#xff0c;帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

今日科技热点速览

&#x1f525; 今日科技热点速览 &#x1f3ae; 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售&#xff0c;主打更强图形性能与沉浸式体验&#xff0c;支持多模态交互&#xff0c;受到全球玩家热捧 。 &#x1f916; 人工智能持续突破 DeepSeek-R1&…...

MySQL 部分重点知识篇

一、数据库对象 1. 主键 定义 &#xff1a;主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 &#xff1a;确保数据的完整性&#xff0c;便于数据的查询和管理。 示例 &#xff1a;在学生信息表中&#xff0c;学号可以作为主键&#xff…...