Linux源码包的安装与升级

news2024/12/23 14:29:09

文章目录

  • Linux源码包的安装与升级
    • 什么是源代码、编译器与可执行文件
    • 什么是函数库
    • 什么是make与configure
    • 什么是Tarball的软件
    • 如何安装与升级软件

Linux源码包的安装与升级

如果你想在自己的Linux服务器上运行网站,就需要安装一个Web服务器软件,否则无法提供Web服务。所以学会如何安装软件非常重要。

Windows操作系统上安装软件很简单,只需要一直按下一步就可以。但是,因为Windows软件源代码是封闭的,所以无法修改它的功能或添加新功能。这就意味着,如果你的电脑受到病毒或黑客攻击,你只能等待软件开发商提供的修补程序,而不能自己修补。

相比之下,如果你在Linux上安装软件,你可以修改和自定义软件功能,甚至可以修补软件漏洞,因为Linux的软件源代码是开放的。这样可以增加你的电脑安全性,减少受到攻击的风险。

==Linux的优点在于它的软件几乎都是开放源代码的,这意味着每个软件都提供源代码,你可以自己修改它,以适合自己的需求。==开放源代码的好处在于你可以自由定制软件,增加或减少功能,甚至修补漏洞。但是,你需要理解什么是开放源代码,源代码是什么,以及在Linux上安装软件时,安装文件和源代码之间的关系。不同版本的Linux是否可以使用相同的执行文件,还是需要重新转换源代码,这些都是需要了解的概念。下面就以源代码与可执行文件来进行说明

什么是源代码、编译器与可执行文件

在Linux系统中,可执行文件是指二进制程序,比如 /usr/bin/passwd/bin/touch 等文件。这些文件需要具有可执行权限(即有 x permission)才能被执行。与之不同的是,shell脚本是使用 shell 程序(如 bash)的功能进行一些判断,最终还是需要执行一些已经编译好的二进制程序。因此,shell本身也是一个二进制程序。

要判断一个文件是否为二进制程序,可以使用 file 命令来查看。

[root@localhost ~]# file /bin/bash
/bin/bash: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=85e3da5a087950e7aaeb7893c056218a8874d2e5, stripped
# 还有系所提供的/etc/init.d/network
[root@localhost ~]# file /etc/init.d/network 
/etc/init.d/network: Bourne-Again shell script, ASCII text executable

看到了吗?如果一个文件是二进制程序,并且具有可执行权限,那么使用 file 命令时会显示它的执行文件类别(如 ELF 64-bit LSB executable),同时也会显示是否使用动态函数库(shared libs)。如果一个文件只是一般的脚本,那么 file 命令会显示它是文本可执行文件(text executable)等字样。

既然Linux操作系统真正认识的其实是二进制程序,那么我们是如何做出这样的一个二进制程序的呢?制作一个二进制程序的过程分为两步编写源代码和编译源代码。编写源代码时,我们使用的是文本编辑器,比如 vim,来写出一段程序的文字描述;这个文件就是源代码文件,它本质上是一个纯文本文件。接着,我们需要使用编译器来将这个源代码文件编译成操作系统认识的二进制程序。在Linux系统中,最常用的编程语言是C语言,所以我们可以使用标准的C语言编译器——gcc,来将C语言源代码文件编译成可执行的二进制程序。

流程图如下:

image-20230528100942027

在编译过程中,编译器会将源代码文件编译成目标文件(object file),这些目标文件通常以 *.o 的扩展名存储。同时,我们在编写程序时,可能会引用或调用其他外部的子程序或函数,这时候我们需要在编译的过程中将这些函数库加入到我们的程序中。这样,编译器就会将所有的程序代码与函数库链接在一起,生成最终的可执行文件。在C语言中,源代码文件通常以 *.c 作为扩展名,而函数库文件通常以 *.a 或 *.so 的扩展名存储。

  • 开放源代码:就是程序代码,写给人类看的程序语言,但机器并不认识,所以无法执行
  • 编译器:将程序代码转译成为机器看得懂的语言,就类似翻译者的角色
  • 可执行文件:经过编译器变成的二进制程序,机器看得懂所以可以执行

什么是函数库

在前面的流程图中,提到了函数库,那么什么是函数库?函数库是一组编写好的程序代码,可以在其他程序中被调用和重复使用。它们通常被组织成一个或多个文件,以便在需要时链接到程序中。在Linux系统中,PAM模块就是一个函数库,提供了验证用户身份和记录日志等功能,其他程序可以直接调用PAM的函数来实现身份认证,而不需要重新编写认证机制。此外,Linux内核也提供了很多函数库,可以供硬件开发者使用。

函数库又分为动态与静态函数库

image-20230528110537538

如上图,如果需要使用一个函数库里面的函数,就需要在编译程序的时候加入相关的设置,让程序知道去哪里找到这个函数库。在Linux系统中,提供了很多与内核相关的函数库和参数,这些信息对于设计硬件驱动程序非常有用,它们通常被放置在/usr/include、/usr/lib、/usr/lib64这些目录中。

  • 函数库:就类似子程序角色,是可以被调用来执行的一段功能函数

什么是make与configure

在使用类似gcc这样的编译器编译程序时,有多个程序文件需要编译,并且还需要写一个最终的链接程序。对于程序代码比较简短的情况,这并不是很麻烦,但是对于像WWW服务器软件(比如Apache)或者内核这样的大型程序,编译过程非常繁琐,需要写很多编译命令。为了简化这个过程,我们可以使用make命令来自动化编译过程,从而减少编译命令的编写量。

当使用make命令时,它会在当前目录下查找Makefile文件,这个文件记录了源代码如何编译的详细信息。make命令会自动判断源代码是否被修改过,如果有修改,则自动更新执行文件,这使得make成为了软件工程师非常实用的辅助工具。

make是一个程序,会去找Makefile,那么Makefile怎么写?通常软件开发商都会写一个检测程序来检测用户的操作环境,以及该操作环境是否有软件开发商所需要的其他功能,该检测程序检测完毕后,就会主动地建立中Makefile的规则文件,通常这个检测程序的文件名为configure或是config。

为什么要检测环境呢?因为不同版本的内核所使用的系统调用可能不同,每个软件所需要依赖的内核函数库也不同,同时,软件开发商不仅针对Linux开发,还可能针对整个UNIX-like系统进行开发,因此需要检测操作系统平台是否提供了所需要的编译器等工具。一般来说没检测程序会检测的内容大约有下面这些:

  • 是否有适合的编译器可以编译本软件的程序代码
  • 是否已经存在本软件所需要的函数库,或其他需要的依赖文件
  • 操作系统平台是否适合本软件,包括Linux的内核版本
  • 内核的头文件是否存在(驱动程序必须要的检测)

下面的图表明了整个过程中需要完成两个任务:

(1)执行configure来建立Makefile,这个步骤必须成功完成,只有成功之后才能(2)调用make命令进行编译所需的数据。简单来说,configure是在检测和设置编译环境之后生成Makefile,而make则是根据Makefile来编译执行文件。这两个命令在整个编译过程中起到了非常重要的作用。

image-20230528160951900

什么是Tarball的软件

Tarball文件就是将软件的源代码文件使用tar命令打包成一个文件,再使用压缩技术将其压缩。最常见的压缩技术是gzip,因此Tarball文件的扩展名一般为.tar.gz或.tgz。由于利用了tar和gzip的功能,Tarball文件可以将软件的所有源代码文件打包在一起,方便用户进行传输和备份。近来,由于bzip2和xz的压缩率较高,Tarball文件也开始使用这些压缩技术,并相应地更改了扩展名,如.tar.bz2和.tar.xz等。用户在下载Tarball文件后,需要使用tar命令和相应的压缩解压工具进行解压缩,然后按照软件提供的安装说明进行编译和安装。所以说Tarball是一个软件包,你将它解压缩后,里面的文件通常就会有:

  • 源代码文件
  • 检测程序文件(可能是configure或config等文件)
  • 本软件的建议说明与安装说明(README 或 INSTALL)

如何安装与升级软件

使用源代码编译安装:有些软件可能没有官方的软件包,只提供源代码,可以通过下载源代码并进行编译安装来安装软件,繁琐时间很漫长。

直接以编译好的二进制程序来安装与升级:这样做的好处就是省略了检测与编译等繁杂的过程。

那么源码包如何安装呢?基本流程是这样的

image-20230528172053446

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

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

相关文章

测试工程师 | 测试基础知识点速查

文章目录 1. 测试介绍2. 测试的分类2.1 按照测试阶段划分(4种)2.2 按照代码可见度划分(3种)2.3 是否运行代码(2种)2.4 是否按照自动化(2种)2.5 其它测试(4种)…

深入篇【C++】CC++内存管理:new/delete底层原理剖析+思维导图总结

深入篇【C】C&C内存管理:new/delete底层原理剖析思维导图总结 Ⅰ.C/C内存分布Ⅱ.C的内存管理Ⅲ.C的内存管理①.new/delete操作内置类型总结: ②.new/delete操作自定义类型总结: ③.operator new与operator delete总结: ④.new/delete底层…

【C++String类使用】万字详解保姆级教学,手把手教你使用string类。

string类的使用 什么是string类&#xff1f;string构造string();string (const char* s);string (const string& str);string (const string& str, size_t pos, size_t len npos);string (const char* s, size_t n);string (size_t n, char c);template < class In…

《The Element of Style》阅读笔记 —— 章节 III A Few Matters of Form

前言&#xff1a;本篇为书籍《The Element of Style》第三章的阅读笔记。 本书电子版链接&#xff1a;http://www.jlakes.org/ch/web/The-elements-of-style.pdf 章节 I Elementary Rules of Usage 阅读笔记&#xff1a;链接章节 II Elementary Principles of Composition 阅读…

JavaScript进阶之路(一)初学者的开始

一&#xff1a;写在前面的问题和话 一个javascript初学者的进阶之路&#xff01; 背景&#xff1a;3年后端&#xff08;ASP.NET&#xff09;工作经验&#xff0c;javascript水平一般般&#xff0c;前端水平一般般。学习资料&#xff1a;犀牛书。 如有误导&#xff0c;或者错…

Git日常使用技巧 - 笔记

Git日常使用技巧 - 笔记 Git是目前世界上最先进的分布式版本控制系统 学习资料 廖雪峰 学习视频 https://www.bilibili.com/video/BV1pX4y1S7Dq/?spm_id_from333.337.search-card.all.click&vd_source2ac127043ccd79c92d5b966fd4a54cd7 Git 命令在线练习工具 https://l…

多线程 -- Thread类的基本用法

本篇重点 什么是变量捕获?? 有关线程的操作 线程创建线程中断线程等待线程休眠获取线程实例目录 1. 线程创建2. 线程中断变量捕获 线程的六种状态NEW 状态TERMNATED 状态RUNNABLE 就绪状态TIMED_WAITING 状态 1. 线程创建 关于线程的创建看上篇博客, 里面为线程的创建提供…

数据库事务到底是什么?

目录 场景&#xff08;两个用户之间进行转账操作&#xff09;&#xff1a; 需要的操作步骤&#xff1a; 事务 事务的四大特性&#xff1a; 一、原子性 &#xff08;1&#xff09;什么是回滚操作 &#xff08;2&#xff09;数据库恢复操作&#xff0c;如何知道数据恢复如初…

C++ Stack&queue&deque

C Stack&#xff06;queue&#xff06;deque &#x1f4df;作者主页&#xff1a;慢热的陕西人 &#x1f334;专栏链接&#xff1a;C &#x1f4e3;欢迎各位大佬&#x1f44d;点赞&#x1f525;关注&#x1f693;收藏&#xff0c;&#x1f349;留言 本博客主要内容主要讲解了栈和…

如何在华为OD机试中获得满分?Java实现【字符串通配符】一文详解!

✅创作者&#xff1a;陈书予 &#x1f389;个人主页&#xff1a;陈书予的个人主页 &#x1f341;陈书予的个人社区&#xff0c;欢迎你的加入: 陈书予的社区 &#x1f31f;专栏地址: Java华为OD机试真题&#xff08;2022&2023) 文章目录 1、题目描述2、输入描述3、输出描述…

Rust 笔记:Rust 语言中应用正则表达式

Rust 笔记 Rust 语言中应用正则表达式 作者&#xff1a;李俊才 &#xff08;jcLee95&#xff09;&#xff1a;https://blog.csdn.net/qq_28550263?spm1001.2101.3001.5343 邮箱 &#xff1a;291148484163.com 本文地址&#xff1a;https://blog.csdn.net/qq_28550263/article/…

【Linux】线程详解之线程互斥与同步

文章目录 Linux线程互斥一、进程线程间的互斥相关概念1.临界资源和临界区2.互斥和原子性 二、互斥量mutex1.抢票程序是否引入互斥量现象观察2.抢票程序原理分析3.互斥量的接口4. 加锁后的程序5.互斥量原理探究 可重入VS线程安全一、概念1.线程安全2.重入 二、常见的线程不安全的…

【P37】JMeter 仅一次控制器(Once Only Controller)

文章目录 一、仅一次控制器&#xff08;Once Only Controller&#xff09;参数说明二、测试计划设计2.1、测试计划一2.1、测试计划二 一、仅一次控制器&#xff08;Once Only Controller&#xff09;参数说明 可以让控制器内部的逻辑只执行一次&#xff1b;单次的范围是针对某…

Spring Authorization Server 系列(一)环境搭建

Spring Authorization Server 中的scope参数解析 前提依赖版本问题确定Spring Boot 版本确定 Spring Authorization Server 版本最终的依赖 第一个 Spring Authorization Server Demo 前提 由于 Spring 最新的 OAuth2 解决方案 已经由 Spring Security 下的 OAuth2 模块独立出…

从零开始学习JavaScript:轻松掌握编程语言的核心技能①

从零开始学习JavaScript&#xff1a;轻松掌握编程语言的核心技能 一&#xff0c;JavaScript 简介为什么学习 JavaScript?JavaScript 用法 二&#xff0c;JavaScript 输出JavaScript 显示数据JavaScript&#xff1a;直接写入 HTML 输出流 三&#xff0c;JavaScript 语法JavaScr…

VS2022发布独立部署的.net程序

.net core支持依赖框架部署和独立部署两种方式&#xff0c;之前学习时是在VSCode中使用dotnet命令发布的。但是在VS2022中却不知道该如何设置。以获取PDF文件使用字体的项目为例&#xff0c;VS2022中默认编译的是依赖框架部署方式&#xff08;编译的结果如下图所示&#xff09;…

Android进阶 View事件体系(三):典型的滑动冲突情况和解决策略

Android进阶 View事件体系&#xff08;三&#xff09;&#xff1a;典型的滑动冲突情况和解决策略 内容概要 本篇文章为总结View事件体系的第三篇文章&#xff0c;前两篇文章的在这里&#xff1a; Android进阶 View事件体系&#xff08;一&#xff09;&#xff1a;概要介绍和实…

Oracle——数据操纵DML(一)

STU1 1、不指定字段的整行插入 在STU1中新增一名同学的基本信息&#xff0c;SQL如下&#xff1a; INSERT INTO test.stu1 VALUES(0001,牛牛,男,24,to_date(1988-05-25,YYYY-MM-DD),12外语)格式如下&#xff1a; INSERT INTO 表名 VALUES(值1,值2,...,值n)对于CHAR或VARCHAR等…

sql-labs SQL注入平台——第二关Less-2 GET - Error based - Intiger based (基于错误的GET整型注入)

Less-2 GET - Error based - Intiger based (基于错误的GET整型注入) 一、先确认漏洞是否存在 &#xff08;1&#xff09;查询 id1返回查询结果正常 &#xff08;2&#xff09;查询 id1’返回查询结果报错&#xff0c;可能存在SQL注入 &#xff08;3&#xff09;查询 id1 …

路径规划算法:基于帝国主义竞争优化的路径规划算法- 附代码

路径规划算法&#xff1a;基于帝国主义竞争优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于帝国主义竞争优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用…