软件相关概念
ABI
ABI即Application Binary Interface
windows与Linux不兼容
ELF(Executable and Linkable Format)
PE(Portable Executable)
库级别的虚拟化:
Linux:WINE
Windows:Cygwin
API
API即Application Programming Interface ,API可以在各种不同的操作系统上实现给应用程序提供完全相同的接口,而它们本身在这些系统上的实现却可能迥异,主流的操作系统有两种,一种是Windows系统,另一种时Linux系统,由于操作系统的不同,API又分为Windows API和Linux API.在Windows平台开发出来的软件在Linux上无法运行,在Linux上开发出来的软件在windows上无法运行,这就导致了软件移植困难,POSIX标准出现就是为了解决这一问题.
POSIX:Portable Operating System Interface 可移植操作系统接口,定义了操作系统应该为应用程序提供的接口标准,是IEEE为要各种UNIX操作系统上运行的软件而定义的一系列API标准的总称,Linux和windows都要实现基本的POSIX标准,程序就在源代码级别可移植了.
开发语言
系统级开发
汇编语言
C
C++
应用级开发
java
python
go
php
Perl
C语言程序实现过程
C程序源代码->预处理->编译->汇编->链接
预处理(Pre-Processing)
编译(Compiling)
汇编(Assembling)
链接(Linking)
gcc编译过程范例:
#分步骤编译执行
gcc -E hello.c -o hello.i 对hello.c文件进行预处理,生成了hello.i文件
gcc -S hello.i -o hello.s 对预处理文件进行编译,生成汇编文件
gcc -C hello.s -o hello.o 对汇编文件进行编译,生成目标文件
gcc hello.o -o hello 对目标文件进行链接,生成可执行文件
#一步实现编译过程
gcc hello.c -o hello 直接编译链接成可执行目标文件
软件模块的静态和动态链接
链接主要是把各模块之间相引用的部分处理好,使得各个模块之间能正确的衔接,分为静态和动态链接
静态链接
把程序对应的依赖库复制一份到包
生成模块文件libxxx.a
嵌入程序包
升级难,需重新编译
占用较多空间,迁移容易
动态链接
只把以来加做一个动态链接
生成模块文件libxxx.so
链接指向
占用较少空间,升级方便
模块(库)文件
查看二进制程序所以来的库文件
ldd /PATH/TO/BINARY_FILE
示例:
[root@localhost ~]# ldd /bin/ls
linux-vdso.so.1 => (0x00007fffcbff7000)
libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f9c08395000)
libcap.so.2 => /lib64/libcap.so.2 (0x00007f9c08190000)
libacl.so.1 => /lib64/libacl.so.1 (0x00007f9c07f87000)
libc.so.6 => /lib64/libc.so.6 (0x00007f9c07bb9000)
libpcre.so.1 => /lib64/libpcre.so.1 (0x00007f9c07957000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f9c07753000)
/lib64/ld-linux-x86-64.so.2 (0x00007f9c085bc000)
libattr.so.1 => /lib64/libattr.so.1 (0x00007f9c0754e000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f9c07332000)
软件包和软件包管理器
挂载iso镜像文件
yum -y install autofs;systemclt enable --now autofs
示例:
[root@localhost ~]# cd /misc/cd
[root@localhost cd]# ls
CentOS_BuildTag EFI EULA GPL images isolinux LiveOS Packages repodata RPM-GPG-KEY-CentOS-7 RPM-GPG-KEY-CentOS-Testing-7 TRANS.TBL
程序包管理器
软件包管理功能:
将编译好的应用程序的各组成文件打包一个或几个程序包文件,利用包管理器可以方便快捷地实现程序包的安装,卸载,查询升级和校验等管理操作
主流程序包管理器:
redhat:rpm文件,rpm包管理器
debain:deb文件,dpkg包管理器
包命名
源代码打包文件命名:
name-VERSION.tar.gz|bz2|xz
VSRSION:major.minor.release
rpm包命名方式:
name-VERSION-release.arch.rpm
VERSION:major.minor.release
常见arch:
x86:i386,i486,i586,i686
x86_64:x64,x86_64,amd64
powerpc:ppc
跟平台无关:noarch
范例:
abrt-addon-ccpp-2.1.11-60.el7.centos.x86_64.rpm
abrt-addon-kerneloops-2.1.11-60.el7.centos.x86_64.rpm
adwaita-qt5-1.0-1.el7.i686.rpm
adwaita-qt5-1.0-1.el7.x86_64.rpm
adwaita-qt-common-1.0-1.el7.x86_64.rpm
aether-1.13.1-13.el7.noarch.rpm
范例:统计rpm的架构类型及相应包数量
[root@localhost Packages]# pwd
/misc/cd/Packages
[root@localhost Packages]# ls *.rpm | grep -Eo '[^.]+\.rpm$' | grep -Eo '^[^.]+' | sort | uniq -c
2268 i686
3154 noarch
4650 x86_64
分类和拆包
软件包为了管理和使用的便利,会将一个大的软件分类,放在不同的子包中
包的分类:
Application-VERSION-ARCH.rpm:主包
Application-devel-VERSION-ARCH.rpm:开发子包
Application-utils-VERSION-ARCH.rpm:其他子包
Application-libs-VERSION-ARCH.rpm:其他子包
包的依赖
软件包之间可能存在依赖关系,甚至循环依赖。即:A包依赖B包,B包依赖C包,C包依赖A包.
安装软件时,会因为缺少依赖的包,而导致安装失败.
解决依赖包管理工具:
yum:rpm包管理器的前端工具
dnf:Fedora 18+ rpm包管理器前端管理工具,Centos8版代替yum
apt:deb包前端管理工具
zypper:suse上的rpm包管理工具
包管理器相关文件
1.包文件组成(每个包独有)
包内的文件
元数据:如,包的名称,版本,依赖性,描述等
可能会有包安装或卸载时的运行脚本
2.数据库(公共)
程序包名称及版本
依赖关系
功能说明
包安装后生成的各文件路径及校验码信息