ABI:Application Binary Interface。应用程序的二进制接口。windows和Linux的二进制格式不一样(ABI标准不同)
ELF (Executable and Linkable Format) --- Linux格式
PE (Portable Executable)--- Windows格式
API:Application Programming Interface。应用程序开发接口。(开发者使用第三方的模块直接调用对应API接口)
windows的API和linux的API无法相互运行。
POSIX:Portable Operating System Interface 可移植操作系统接口。是一种接口的标准。(定义库的开发标准)降低了不同平台迁移的标准。
Linux中的程序大部分都是C语言开发的
C 程序源代码 --> 预处理 --> 编译 --> 汇编 --> 链接
预处理: 预处理(宏定义、注释、加入include包含的文件等)生成 .i结尾的文本文件。
编译:生成汇编代码(汇编语言贴近机器语言) ,生成 .s结尾的汇编文本文件
汇编:将上面的文本文件转换成二进制(机器指令)文本文件。 .o (object -- 对象文件)结尾的二进制文本文件
链接:把别的一些.o文件链接在一起形成一个统一的文件。
实现这个过程所用到的工具:gcc
范例: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 直接编译链接成可执行目标文件
链接:程序用到的第三方模块库和程序链接在一起。
库:libary --- lib
程序文件和第三方库形成一个文件。运行程序的时候需要把库和程序文件都加载到内存中了。
只把依赖加做一个动态链接,生成二进制程序文件的时候这个文件里面只有它自己的程序,没有库相关的程序。
例如: lss /usr/bin/ls
库文件很重要,破坏了库文件相关程序(命令)无法正常运行
管理及查看本机装载的库文件
配置文件:
缓存文件:
源代码直接编译安装很繁琐。为了减少使用开源软件的难度。一些开源公司把程序预先编译完成并且把相关的文件打成一个包,成为一个独立的包文件。
源码编译生成二进制文件+相关的文件(配置文件、文档文档文件等、脚本文件等) = 包文件
刚开始只提供.tar.gz的方式打包源码文件。需要用户手动编译,后来debian诞生的时候,一个叫做dpkg的管理工具出现。它可以管理deb后缀的‘包’文件 (pkg -- package)
再后来redhat开发了自己的rpm包管理器。
查看包种有哪些文件的方法:cpio命令
name-VERSION.tar.gz|bz2|xz
程序名-版本号
name-VERSION-release.arch.rpm
软件名-版本号-打包相关信息-cpu架构
linux种为了更好的选择包,就把大的软件拆开了。--- 避免只想使用一个功能,但是被迫把所有功能都装上了。
比如:httpd这个软件就把他拆成了很多个小包
软件包之间可能存在依赖关系。
用来管理包文件的。
将编译好的应用程序进行打包,实现程序的安装、卸载等功能。
redhat: rpm包管理器,管理rpm文件 --- rpm:redhat package manager
debian:dpkg包管理器,管理deb文件
例:查看rpm包中存在那些文件:
#使用rpm2cpio转化为cpio流,然后使用cpio查看:
rpm2cpio file.rpm | cpio -tv
利用这个数据库就可以知道系统已经安装的rpm包和里面包含的文件、属性。
安装和卸载软件都会首先检查这个数据库。
1.系统光盘或官网
2.第三方组织
3.软件官方站点
4.自己制作
安装的时候要写软件包的路径
-h:显示进度
-v:显示安装过程
--nodeps:忽略依赖关系
--test:测试安装
--force: 强制安装
-a:所有包
-f:查看指定的文件由哪个程序包安装生成
-c:查询程序的配置文件
-l:查看指定的程序包安装后生成的所有文件
例如:
rpm -ql 软件名 --- 查看已经装好的包里面包含的文件分别放在那些目录下。
rpm -qf file --- 查询磁盘上的文件来自于那个包
注意:当包卸载时,对应的配置文件不会删除, 以FILENAME.rpmsave形式保留
卸载只需要写软件的名称
--nodeps:强制删除
rpm包安装生成的信息都放在:/var/lib/rpm 这个文件中
重建数据库:rpm {--initdb|--rebuilddb}
initdb: 初始化,如果事先不存在数据库,则新建之,否则,不执行任何操作
rebuilddb:重建已安装的包头的数据库索引目录
参与评论