现代计算机世界里面有很多的包管理器,例如 Ubuntu 的 apt 跟 dpkg, Centos 的 yum,Fedora 的 dnf。
甚至,Windows应用商店,Apple Store,安卓应用市场,应用宝,都是包管理器。
这些包管理器,在云端都有一个庞大的软件仓库。仓库里面有支持各种 CPU 架构的软件。
仓库里面的软件都是可运行文件,静态库或者动态库,这些都是二进制的字节码,没有源代码。二进制文件,只有两个重点。
1,里面的字节码是哪种CPU指令集的。
2,文件格式是哪种,ELF 还是 PE 还是其他。
这里面没有涉及到 编译,链接的东西,因为软件仓库的东西是别人已经编译链接好的了。
通常一个完善的软件,会提供多个版本来支持不同的 CPU 指令集,例如 ARM 指令集的发一个版本,x86 指令集的发一个版本。
而文件格式是 操作系统如何 加载 (loader) 这个文件定义出来的,例如 Windows 的 exe 文件是 PE格式,Linux 的可执行文件是 ELF 格式。
而包管理器干的活,就是判断你当前的环境是什么 CPU 指令集的,当前是什么操作系统,下载相应的压缩包,然后解压放到本地的各个默认目录,例如 /etc ,/usr/lib ,/usr/bin,等等。
这与我们在 windows 下一个 exe 然后指定他的安装目录不同,包管理器是有默认目录的。所以包管理器是一种统一管理软件的方式。
由于云端仓库有非常多的软件,通常比较好的平台都会有分析软件,分析出这些安装包有无危害代码。
参考资料:
1,《怎么理解ubuntu中的软件包管理器apt和dpkg》
2,《Linux 包管理基础:apt、yum、dnf 和 pkg》