《手把手教你构建自己的 Linux 系统》学习笔记(7)
目录
- tee 命令的缺陷是什么?如何解决这个缺陷?
- /etc/ld.so.conf 文件的作用是什么?
- 动态链接和静态链接有什么不同?
- 动态编译
- 静态编译
- 共享库为什么会有版本?共享库的版本升级原理是怎样的?
tee 命令的缺陷是什么?如何解决这个缺陷?
tee 命令只接收标准输入,而如果明林广化寺用了错破五输出则错误输出的内容无法被 tee 接受到,为了让错误信息也能够被记录,我们将标准错误输出重定向到标准输出中,在命令中使用 2>&1 重定向错误输出。
/etc/ld.so.conf 文件的作用是什么?
他的作用只是用于帮助 ld-linux*.so 在程序运行过程中去搜索其他依赖的共享库,编译和链接的构成中 /etc/ld.so.conf 并不参与。
动态链接和静态链接有什么不同?
程序编译时,可以分成两种,一种是静态编译,一种是动态编译。
动态编译
程序编译的时候仅仅编译程序自身的代码,对于需要使用的各种外部函数采用链接到外部共享库的方式,程序运行期间再从共享函数库中运行其中的函数。
该方式编译的程序在运行时所依赖或者提供函数实现的共享库必须存在,有效,且能够被搜索到。
动态编译对于空间的占用比较阶跃,大量的软件使用了相同的库文件,如果用静态编译则每个程序都需要将库文件编译进自己的程序中,这会占用大量的数据空间。使用动态编译只需要编译进函数实现的链接就行了,运行的时候再从库文件里面提取,有效的节省了存储空间。
采用动态编译时,对函数库进行兼容的更新,不需要重新编译程序就可以使用更新过的功能,如果是不兼容的更新则会导致程序无法正常运行,这时只能通过重新编译程序来恢复正常。
静态编译
静态编译不会受到外部函数库文件变更的影响,因此静态编译非常适合将程序移植到内核兼容的不同系统环境中。
静态编译和动态编译各有优点和缺点,使用哪种方式需要根据实际情况来确定,通常使用动态编译的方式来搭建我们的系统,对于一些非常关键的程序我们不希望他的运行状态受到影响,或者希望该程序能够在比较简单的环境中运行,这就适合采用静态编译的方式。
共享库为什么会有版本?共享库的版本升级原理是怎样的?
Linux 中存在大量的共享库,例如 Zlib 软件包就会产生共享库,提供共享库的软件包进行版本升级,其新版本可能提供了新的功能或者提高了原功能的某些方面,这时有可能需要去升级这些共享库。
这时问题就出现了,已经存在的共享库如果已经被其他程序所链接,并且使用了其中的某些特性,新版本中很可能取消了或者改变了这个特性,替换掉共享库则会导致这些程序出现问题。
为了解决这样的问题,共享库的文件名中会带有版本号,例如 Zlib-1.2.2 所提供的共享库文件名是 libz.so.1.2.2 这样就可以在同一个系统下面存在多个共享库的版本,当 Zlib 发布了 1.2.3 版本只要生成的共享库命名为 libz.so.1.2.3
但是这又产生了另外一个问题,绝大部分的函数库升级是向下兼容的,升级一般会给原来的软件带来某些方面的提升(例如性能),这时我们又希望通过只更新共享库的版本就可以让所有相关的程序都能收益。
我i饿了解决上面的矛盾,在系统中一般对共享库采用多级版本管理的方式,利用版本号的大小进行分层控制,大版本链接到低一级版本的文件上。
下面以 Zlib 为例进行讲解。
安装 Zlib-1.2.2 时产生了 libz.so.1.2.2 文件,这时创建一个 libz.so.1 的链接文件指向 libz.so.1.2.2. 再创建一个 libz.so 的链接文件指向 libz.so.1 关系如下:
libz.so -> libz.so.1 -> libz.so.1.2.2
当再安装 Zlib-1.2.3 时,只要安装上 libz.so.1.2.3 并且将 libz.so.1 链接指向 libz.so.1.2.3 就可以了,关系如下:
libz.so -> libz.so.1 -> libz.so.1.2.3
注意,让 libz.so.1 换了一个指向目标,我猜使用这种方法解决是因为,如果没有 libz.so.1 这种类似快捷方式的存在,会导致很多软件直接就写死了共享库的版本号,这样的话,那些软件就无法利用共享库的升级的新功能。
某程序必须某些程序必须使用 libz.so.1.2.2 共享库的功能时,且不希望函数库发声变更,则只需要在一开始编译这个程序的时候使他链接到文件 libz.so.1.2.2 上即可。该文件不会发声变化,当程序链接到文件 libz.so.1 时,则 Zlib 在大版本为 1 的范围内升级会导致这些程序也进行了升级,这些程序所链接的库已经升级为新的 Zlib 了。
假设 Zlib 将来会出现 2.0 版本,就可能产生 libz.so.2.0.0 和 libz.so.2 的文件,这时链接到在 libz.so.1 的程序不会受到影响,而链接到 libz.so 的程序则可以立即享受到 2.0 版本所带来的好处,当然也同时承担着升级的风险。
主意程序链接到哪一个版本级别的共享库是需要更急实际情况来进行决定的,有程序本身的因素也有共享库本身的因素,不能一概而论,可以充分利用 linux 对于共享库版本管理的灵活性使用最适合的共享库。
《手把手教你构建自己的 Linux 系统》学习笔记(7)的更多相关文章
- 《手把手教你构建自己的 Linux 系统》学习笔记(10)
目录 /etc/fstab 文件的作用是什么? Linux 内核的图形化启动是怎么回事? Linux 系统中的文件名是否以大小写来进行区别? 「GRUB 中无法找到硬盘」怎么解决? 「GRUB 及配置 ...
- 《手把手教你构建自己的 Linux 系统》学习笔记(9)
目录 autoreconf 命令的作用是什么? aclocal automake -a autoconf 一条命令搞完三面三步 既然有其他的「编译控制软件」为何还是使用 make 来进行编译控制? M ...
- 《手把手教你构建自己的 Linux 系统》学习笔记(8)
目录 Binutils 软件包有什么用? make -k 的作用是什么? man-pages 里有几种文档?分别表示什么意思? 如何查询指定目录的 man-pages ? 如何使用 make 命令的同 ...
- 《手把手教你构建自己的 Linux 系统》学习笔记(6)
目录 /dev 目录是干什么的? /proc 和 /sys 目录是干什么的? udev 这个软件是干什么用的? 目录映射是临时性的,还是永久性的? 命令行里大括号 "{}" 的作用 ...
- 《手把手教你构建自己的 Linux 系统》学习笔记(5)
交叉编译是什么? 交叉编译就是在一个系统上,编译生成另外一个系统运行的程序文件. 「硬件体系结构」和「操作系统」的关系是什么? 硬件体系结构也可以称为架构,主要是通过 CPU 的指令集来进行区分的,操 ...
- 《手把手教你构建自己的 Linux 系统》学习笔记(2)
Linux 系统定制原理 虚拟根目录 我们的目标是为了完成目标系统(也就是我们要做的系统),他是一个可以独立运行的系统,不依赖雨主系统和临时系统,根据 Linux 系统的特点它需要存放在根目录下面,但 ...
- 《手把手教你构建自己的 Linux 系统》学习笔记(1)
第二章.基础准备--Linux 系统定制原理 Linux 系统的组成及架构 共享库和静态库 在 Linux 系统中,函数库包含两种形式:共享库和静态库. 共享库 共享库在程序运行时,为其提供所需要的函 ...
- 《手把手教你构建自己的 Linux 系统》学习笔记(4)
汇编链接器(Binutils) 这是一个软件包,这个软件包其实是一个工具集,里面含有了大量的用于汇编程序活着读取二进制文件相关的程序. CC 它是一条命令的别名,这条命令的作用是使用 GCC 的 C ...
- 《手把手教你构建自己的 Linux 系统》学习笔记(3)
需要注意的是,制作操作系统权限全程都要用 root pushd 和 popd 为了方便目录管理,所以出现了这种两个命令,他们的原理就是利用堆栈来实现目录管理. 这两个命令,pushd 负责将指定的目录 ...
随机推荐
- Python使用requests发送post请求的三种方式
1.我们使用postman进行接口测试的时候,发现POST请求方式的编码有3种,具体的编码方式如下: A:application/x-www-form-urlencoded ==最常见的post提交数 ...
- Linux 常用工具openssh之scp
前言 scp命令用于在Linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器,而且scp传输是加密的.可能会稍微影响一下速度.当你服务器硬盘变为只读read ...
- Percona-XtraDB-Cluster-57 安装操作记录
一.PXC集群的一些特性 Percona官网服务器位于境外,访问很困难.本次安装使用的是其官网提供的最新版本5.7.23-31.31.1.el7,当前日期为2018.10.10. PXC集群中,存储引 ...
- Java8新特性一点通 | 回顾字符转日期&JoinArray使用
StringToDate日期转换 Join Array使用 StringToDate日期转换 Convert string to date in ISO8601 format 利用LocalDate. ...
- <状压DP>solution-POJ3311_Hie with the Pie
Hie with the Pie Description The Pizazz Pizzeria prides itself in delivering pizzas to its customers ...
- 一、Django学习之连接与建立数据库
连接MySQL数据库 配置文件 找到DATABASES对应的设置,修改为MySQL的配置即可 DATABASES = { 'default': { 'ENGINE': 'django.db.backe ...
- 我学React Native开发的经历(一) 第一周学习,环境搭建及demo1,一个导航跳转页面
大家好,这是跋涉者,wadereye,说来惭愧, 我是从2017年8月25日左右开始学习React Native的,因为时间不多, 在学习的过程中,感觉资料非常零散,要趟过的坑巨多,遇到的问题也非常多 ...
- ICC教程 - Flow系列 - 概念系列 - ECO (理论+实践+脚本分享)
本文转自:自己的微信公众号<集成电路设计及EDA教程> <ICC教程 - Flow系列 - 概念系列 - ECO (理论+实践+脚本分享)> 这篇推文讲一下数字IC设计中的po ...
- JSP&Servlet学习笔记----第6章
JSP与Servlet是一体两面的关系. JSP最终还是被编译为Servlet. <%@page contentType="text/html;charset=UTF-8" ...
- 关于android 中WebView使用Css
demo private static final String linkCss = "<link rel=\"stylesheet\" href=\"f ...