当前位置: 首页 > news >正文

巨鹿网站建设网络公司中国万网域名注册服务内容

巨鹿网站建设网络公司,中国万网域名注册服务内容,手机网站底部广告代码,上饶网站开发【BASH】回顾与知识点梳理 三十九 三十九. make、tarball、函数库及软件校验39.1 用 make 进行宏编译为什么要用 makemakefile 的基本语法与变量 39.2 Tarball 的管理与建议使用原始码管理软件所需要的基础软件Tarball 安装的基本步骤一般 Tarball 软件安装的建议事项 (如何移除… 【BASH】回顾与知识点梳理 三十九 三十九. make、tarball、函数库及软件校验39.1 用 make 进行宏编译为什么要用 makemakefile 的基本语法与变量 39.2 Tarball 的管理与建议使用原始码管理软件所需要的基础软件Tarball 安装的基本步骤一般 Tarball 软件安装的建议事项 (如何移除升级)一个简单的范例、利用 ntp 来示范利用 patch 更新原始码 39.3 函式库管理动态与静态函式库ldconfig 与 /etc/ld.so.conf程序的动态函式库解析 ldd 39.4 检验软件正确性 该系列目录 -- 【BASH】回顾与知识点梳理目录 三十九. make、tarball、函数库及软件校验 39.1 用 make 进行宏编译 在本章一开始我们提到过 make 的功能是可以简化编译过程里面所下达的指令同时还具有很多很方便的功能那么底下咱们就来试看看使用 make 简化下达编译指令的流程吧 为什么要用 make 先来想象一个案例假设我的执行档里面包含了四个原始码文件分别是 main.c haha.c sin_value.c cos_value.c 这四个文件这四个文件的目的是 main.c 主要的目的是让用户输入角度数据与呼叫其他三支子程序haha.c 输出一堆有的没有的讯息而已sin_value.c 计算使用者输入的角度(360) sin 数值cos_value.c 计算使用者输入的角度(360) cos 数值。 这四个文件目前已无法找到了所以笔者记录下鸟哥的执行过程 由于这四个文件里面包含了相关性并且还用到数学函式在里面所以如果你想要让这个程序可以跑 那么就需要这样编译 # 1. 先进行目标文件的编译最终会有四个 *.o 的档名出现 [rootstudy ~]# gcc -c main.c [rootstudy ~]# gcc -c haha.c [rootstudy ~]# gcc -c sin_value.c [rootstudy ~]# gcc -c cos_value.c # 2. 再进行连结成为执行档并加入 libm 的数学函式以产生 main 执行档 [rootstudy ~]# gcc -o main main.o haha.o sin_value.o cos_value.o -lm # 3. 本程序的执行结果必须输入姓名、360 度角的角度值来计算 [rootstudy ~]# ./main Please input your name: VBird 这里先输入名字 Please enter the degree angle (ex 90): 30 输入以 360 度角为主的角度 Hi, Dear VBird, nice to meet you. 这三行为输出的结果喔 The Sin is: 0.50 The Cos is: 0.87编译的过程需要进行好多动作啊而且如果要重新编译则上述的流程得要重新来一遍光是找出这些指令就够烦人的了 如果可以的话能不能一个步骤就给他完成上面所有的动作呢那就利用make 这个工具吧 先试看看在这个目录下建立一个名为 makefile 的文件内容如下 # 1. 先编辑 makefile 这个规则文件内容只要作出 main 这个执行档 [rootstudy ~]# vim makefile main: main.o haha.o sin_value.o cos_value.ogcc -o main main.o haha.o sin_value.o cos_value.o -lm # 注意第二行的 gcc 之前是 tab 按键产生的空格喔# 2. 尝试使用 makefile 制订的规则进行编译的行为 [rootstudy ~]# rm -f main *.o 先将之前的目标文件去除 [rootstudy ~]# make cc -c -o main.o main.c cc -c -o haha.o haha.c cc -c -o sin_value.o sin_value.c cc -c -o cos_value.o cos_value.c gcc -o main main.o haha.o sin_value.o cos_value.o -lm # 此时 make 会去读取 makefile 的内容并根据内容直接去给他编译相关的文件啰# 3. 在不删除任何文件的情况下重新执行一次编译的动作 [rootstudy ~]# make make: main is up to date. # 看到了吧是否很方便呢只会进行更新 (update) 的动作而已。或许你会说『如果我建立一个 shell script 来将上面的所有动作都集结在一起不是具有同样的效果吗』呵呵 效果当然不一样以上面的测试为例我们仅写出 main 需要的目标文件结果 make 会主动的去判断每个目标文件相关的原始码文件并直接予以编译最后再直接进行连结的动作 真的是很方便啊此外如果我们更动过某些原始码文件则 make 也可以主动的判断哪一个原始码与相关的目标文件文件有更新过 并仅更新该文件如此一来将可大大的节省很多编译的时间呢要知道某些程序在进行编译的行为时会消耗很多的 CPU 资源呢所以说 make 有这些好处 简化编译时所需要下达的指令若在编译完成之后修改了某个原始码文件则 make 仅会针对被修改了的文件进行编译其他的 object file 不会被更动最后可以依照相依性来更新 (update) 执行档。 既然 make 有这么多的优点那么我们当然就得好好的了解一下 make 这个令人关心的家伙啦而make 里面最需要注意的大概就是那个规则文件也就是 makefile 这个文件的语法啦所以底下我们就针对 makefile 的语法来加以介绍啰。 makefile 的基本语法与变量 make 的语法可是相当的多而复杂的有兴趣的话可以到 GNU 去查阅相关的说明鸟哥这里仅列出一些基本的规则重点在于让读者们未来在接触原始码时不会太紧张啊 好了基本的makefile 规则是这样的 目标(target): 目标文件 1 目标文件 2 tab gcc -o 欲建立的执行文件 目标文件 1 目标文件 2那个目标 (target) 就是我们想要建立的信息而目标文件就是具有相关性的 object files 那建立执行文件的语法就是以tab按键开头的那一行特别给他留意喔『命令行必须要以 tab 按键作为开头』才行他的规则基本上是这样的 在 makefile 当中的 # 代表批注tab 需要在命令行 (例如 gcc 这个编译程序指令) 的第一个字符目标 (target) 与相依文件(就是目标文件)之间需以『:』隔开。 同样的我们以刚刚上一个小节的范例进一步说明如果我想要有两个以上的执行动作时 例如下达一个指令就直接清除掉所有的目标文件与执行文件该如何制作呢 # 1. 先编辑 makefile 来建立新的规则此规则的目标名称为 clean [rootstudy ~]# vi makefile main: main.o haha.o sin_value.o cos_value.ogcc -o main main.o haha.o sin_value.o cos_value.o -lm clean:rm -f main main.o haha.o sin_value.o cos_value.o # 2. 以新的目标 (clean) 测试看看执行 make 的结果 [rootstudy ~]# make clean 就是这里透过 make 以 clean 为目标 rm -rf main main.o haha.o sin_value.o cos_value.o如此一来我们的 makefile 里面就具有至少两个目标分别是 main 与 clean 如果我们想要建立main 的话输入『make main』如果想要清除有的没的输入『make clean』即可啊而如果想要先清除目标文件再编译 main 这个程序的话就可以这样输入『make clean main』如下所示 [rootstudy ~]# make clean main rm -rf main main.o haha.o sin_value.o cos_value.o cc -c -o main.o main.c cc -c -o haha.o haha.c cc -c -o sin_value.o sin_value.c cc -c -o cos_value.o cos_value.c gcc -o main main.o haha.o sin_value.o cos_value.o -lm这样就很清楚了吧但是你是否会觉得咦 makefile 里面怎么重复的数据这么多啊没错所以我们可以再藉由 shell script 那时学到的『变数』来更简化 makefile 喔 [rootstudy ~]# vi makefile LIBS -lm OBJS main.o haha.o sin_value.o cos_value.o main: ${OBJS}gcc -o main ${OBJS} ${LIBS} clean:rm -f main ${OBJS}与 bash shell script 的语法有点不太相同变量的基本语法为 变量与变量内容以『』隔开同时两边可以具有空格变量左边不可以有 tab 例如上面范例的第一行 LIBS 左边不可以是 tab变量与变量内容在『』两边不能具有『:』在习惯上变数最好是以『大写字母』为主运用变量时以 ${变量} 或 $(变量) 使用在该 shell 的环境变量是可以被套用的例如提到的 CFLAGS 这个变数在指令列模式也可以给予变量。 由于 gcc 在进行编译的行为时会主动的去读取 CFLAGS 这个环境变量所以你可以直接在 shell 定义出这个环境变量也可以在 makefile 文件里面去定义更可以在指令列当中给予这个咚咚呢例如 [rootstudy ~]# CFLAGS-Wall make clean main # 这个动作在上 make 进行编译时会去取用 CFLAGS 的变量内容也可以这样 [rootstudy ~]# vi makefile LIBS -lm OBJS main.o haha.o sin_value.o cos_value.o CFLAGS -Wall main: ${OBJS} gcc -o main ${OBJS} ${LIBS} clean: rm -f main ${OBJS}咦我可以利用指令列进行环境变量的输入也可以在文件内直接指定环境变量那万一这个CFLAGS 的内容在指令列与 makefile 里面并不相同时以那个方式输入的为主呵呵问了个好问题啊 环境变量取用的规则是这样的 make 指令列后面加上的环境变量为优先makefile 里面指定的环境变量第二shell 原本具有的环境变量第三。 此外还有一些特殊的变量需要了解的喔 $代表目前的目标(target) 所以我也可以将 makefile 改成 [rootstudy ~]# vi makefile LIBS -lm OBJS main.o haha.o sin_value.o cos_value.o CFLAGS -Wall main: ${OBJS}gcc -o $ ${OBJS} ${LIBS} 那个 $ 就是 main clean:rm -f main ${OBJS}39.2 Tarball 的管理与建议 Tarball 的安装是可以跨平台的因为 C 语言的程序代码在各个平台上面是可以共通的 只是需要的编译程序可能并不相同而已。例如 Linux 上面用 gcc 而 Windows 上面也有相关的 C 编译程序啊所以呢同样的一组原始码既可以在 CentOS Linux 上面编译也可以在 SuSE Linux 上面编译当然也可以在大部分的 Unix 平台上面编译成功的 使用原始码管理软件所需要的基础软件 从原始码的说明我们晓得要制作一个 binary program 需要很多咚咚的呢这包括底下这些基础的软件 gcc 或 cc 等 C 语言编译程序 (compiler) 没有编译程序怎么进行编译的动作所以 C compiler 是一定要有的。不过 Linux 上面有众多的编译程序其中当然以 GNU 的 gcc 是首选的自由软件编译程序啰事实上很多在 Linux 平台上面发展的软件的原始码原本就是以 gcc 为底来设计的呢。make 及 autoconfig 等软件 一般来说以 Tarball 方式释出的软件当中为了简化编译的流程通常都是配合前几个小节提到的 make 这个指令来依据目标文件的相依性而进行编译。但是我们也知道说 make 需要makefile 这个文件的规则那由于不同的系统里面可能具有的基础软件环境并不相同 所以就需要侦测用户的作业环境好自行建立一个 makefile 文件。这个自行侦测的小程序也必须要藉由autoconfig 这个相关的软件来辅助才行。需要 Kernel 提供的 Library 以及相关的 Include 文件 很多的软件在发展的时候都是直接取用系统核心提供的函式库与 include 文件的这样才可以与这个操作系统兼容啊尤其是在『驱动程序方面的模块 』例如网络卡、声卡、USB 等驱动程序在安装的时候常常是需要核心提供的相关信息的。在 Red Hat 的系统当中 (包含Fedora/CentOS 等系列) 这个核心相关的功能通常都是被包含在 kernel-source 或 kernel-header 这些软件名称当中所以记得要安装这些软件喔 如果你希望未来可以自行安装一些以Tarball 方式释出的软件时记得请自行挑选想要安装的软件名称喔例如在 CentOS 或者是 Red Hat 当中记得选择 Development Tools 以及 Kernel Source Development 等相关字眼的软件群集呢。 在 CentOS 当中如果你已经有网络可以连上 Internet 的话那么就可以使用下一章会谈到的 yum 啰 透过 yum 的软件群组安装功能你可以这样做 如果是要安装 gcc 等软件开发工具请使用『 yum groupinstall “Development Tools” 』若待安装的软件需要图形接口支持一般还需要『 yum groupinstall “X Software Development” 』若安装的软件较旧可能需要『 yum groupinstall “Legacy Software Development” 』 Tarball 安装的基本步骤 整个安装的基础动作大多是这样的 取得原始档将 tarball 文件在 /usr/local/src 目录下解压缩取得步骤流程进入新建立的目录底下去查阅 INSTALL 与 README 等相关文件内容 (很重要的步骤)相依属性软件安装根据 INSTALL/README 的内容察看并安装好一些相依的软件 (非必要)建立 makefile以自动侦测程序 (configure 或 config) 侦测作业环境并建立 Makefile 这个文件编译以 make 这个程序并使用该目录下的 Makefile 做为他的参数配置文件来进行 make (编译或其他) 的动作安装以 make 这个程序并以 Makefile 这个参数配置文件依据 install 这个目标 (target) 的指定来安装到正确的路径 我们底下约略提一下大部分的 tarball 软件之安装的指令下达方式 ./configure 这个步骤就是在建立 Makefile 这个文件啰通常程序开发者会写一支 scripts 来检查你的 Linux 系统、相关的软件属性等等这个步骤相当的重要 因为未来你的安装信息都是这一步骤内完成的另外这个步骤的相关信息应该要参考一下该目录下的 README 或 INSTALL 相关的文件make clean make 会读取 Makefile 中关于 clean 的工作。这个步骤不一定会有但是希望执行一下因为他可以去除目标文件因为谁也不确定原始码里面到底有没有包含上次编译过的目标文件 (*.o) 存在所以当然还是清除一下比较妥当的。 至少等一下新编译出来的执行档我们可以确定是使用自己的机器所编译完成的嘛make make 会依据 Makefile 当中的预设工作进行编译的行为编译的工作主要是进行 gcc 来将原始码编译成为可以被执行的 object files 但是这些 object files 通常还需要一些函式库之类的 link 后才能产生一个完整的执行档使用 make 就是要将原始码编译成为可以被执行的可执行文件而这个可执行文件会放置在目前所在的目录之下 尚未被安装到预定安装的目录中make install 通常这就是最后的安装步骤了make 会依据 Makefile 这个文件里面关于 install 的项目将上一个步骤所编译完成的数据给他安装到预定的目录中就完成安装啦 请注意上面的步骤是一步一步来进行的而其中只要一个步骤无法成功那么后续的步骤就完全没有办法进行的 一般 Tarball 软件安装的建议事项 (如何移除升级) 通常我们会建议大家将自己安装的软件放置在 /usr/local 下至于原始码 (Tarball)则建议放置在 /usr/local/src (src 为 source 的缩写)底下啊。 再来让我们先来看一看 Linux distribution 默认的安装软件的路径会用到哪些我们以 apache 这个软件来说明的话 /etc/httpd/usr/lib/usr/bin/usr/share/man 我们会发现软件的内容大致上是摆在 etc, lib, bin, man 等目录当中分别代表『配置文件、函式库、执行档、联机帮助档』。 那么你是以 tarball 来安装时呢如果是放在预设的 /usr/local 里面由于 /usr/local 原本就默认这几个目录了所以你的数据就会被放在 /usr/local/etc/usr/local/bin/usr/local/lib/usr/local/man 但是如果你每个软件都选择在这个默认的路径下安装的话 那么所有的软件的文件都将放置在这四个目录当中因此如果你都安装在这个目录下的话 那么未来再想要升级或移除的时候就会比较难以追查文件的来源啰 而如果你在安装的时候选择的是单独的目录例如我将 apache 安装在/usr/local/apache 当中那么你的文件目录就会变成 /usr/local/apache/etc/usr/local/apache/bin/usr/local/apache/lib/usr/local/apache/man 呵呵单一软件的文件都在同一个目录之下那么要移除该软件就简单的多了 只要将该目录移除即可视为该软件已经被移除啰以上面为例我想要移除 apache 只要下达『rm -rf /usr/local/apache』就算移除这个软件啦当然啰实际安装的时候还是得视该软件的 Makefile 里头的 install 信息才能知道到底他的安装情况为何的。因为例如 sendmail 的安装就很麻烦… 由于 Tarball 在升级与安装上面具有这些特色亦即 Tarball 在反安装上面具有比较高的难度 (如果你没有好好规划的话)所以为了方便 Tarball 的管理通常鸟哥会这样建议使用者 最好将 tarball 的原始数据解压缩到 /usr/local/src 当中安装时最好安装到/usr/local这个默认路径下考虑未来的反安装步骤最好可以将每个软件单独的安装在 /usr/local 底下为安装到单独目录的软件之 man page 加入 man path 搜寻 如果你安装的软件放置到 /usr/local/software/ 那么 man page 搜寻的设定中可能就得要在/etc/man_db.conf 内的 40~50 行左右处写入如下的一行 MANPATH_MAP /usr/local/software/bin /usr/local/software/man 这样才可以使用 man 来查询该软件的在线文件啰 时至今日老实说真的不太需要有 tarball 的安装了CentOS/Fedora 有个 RPM 补遗计划就是俗称的 EPEL 计划相关网址说明如下https://fedoraproject.org/wiki/EPEL一般学界会用到的软件都在里头 除非你要用的软件是专属软件 (要钱的) 或者是比较冷门的件否则都有好心的网友帮我们打包好了啦 ^_^ 一个简单的范例、利用 ntp 来示范 假设我对这个软件的要求是这样的 假设 ntp-4...tar.gz 这个文件放置在 /root 这个目录下 原始码请解开在 /usr/local/src 底下 我要安装到 /usr/local/ntp 这个目录中 解压缩下载的 tarball 并参阅 README/INSTALL 文件 [rootstudy ~]# cd /usr/local/src 切换目录 [rootstudy src]# tar -zxvf /root/ntp-4.2.8p3.tar.gz 解压缩到此目录 ntp-4.2.8p3/ 会建立这个目录喔 ntp-4.2.8p3/CommitLog ....(底下省略).... [rootstudy src]# cd ntp-4.2.8p3 [rootstudy ntp-4.2.8p3]# vi INSTALL 记得 README 也要看一下 # 特别看一下 28 行到 54 行之间的安装简介可以了解如何安装的流程喔检查 configure 支持参数并实际建置 makefile 规则文件 [rootstudy ntp*]# ./configure --help | more 查询可用的参数有哪些--prefixPREFIX install architecture-independent files in PREFIX--enable-all-clocks include all suitable non-PARSE clocks:--enable-parse-clocks - include all suitable PARSE clocks: # 上面列出的是比较重要的或者是你可能需要的参数功能 [rootstudy ntp*]# ./configure --prefix/usr/local/ntp \--enable-all-clocks --enable-parse-clocks 开始建立 makefile checking for a BSD-compatible install... /usr/bin/install -c checking whether build environment is sane... yes ....(中间省略).... checking for gcc... gcc 也有找到 gcc 编译程序了 ....(中间省略).... config.status: creating Makefile 现在知道这个重要性了吧 config.status: creating config.h config.status: creating evconfig-private.h config.status: executing depfiles commands config.status: executing libtool commands一般来说 configure 设定参数较重要的就是那个--prefix/path了–prefix 后面接的路径就是『这个软件未来要安装到那个目录去』如果你没有指定 --prefix/path 这个参数通常预设参数就是/usr/local 至于其他的参数意义就得要参考 ./configure --help 了 这个动作完成之后会产生 makefile 或 Makefile 这个文件。当然啦这个侦测检查的过程会显示在屏幕上特别留意关于 gcc 的检查还有最重要的是最后需要成功的建立起 Makefile 才行 最后开始编译与安装噜 [rootstudy ntp*]# make clean; make [rootstudy ntp*]# make check [rootstudy ntp*]# make install # 将数据给他安装在 /usr/local/ntp 底下利用 patch 更新原始码 事实上当我们发现一些软件的漏洞通常是某一段程序代码写的不好所致。因此 所谓的『更新原始码』常常是只有更改部分文件的小部分内容而已。既然如此的话 那么我们是否可以就那些被更动的文件来进行修改就可以咯也就是说 旧版本到新版本间没有更动过的文件就不要理他仅将有修订过的文件部分来处理即可。 测试旧版程序的功能 [rootstudy ~]# tar -zxvf main-0.1.tgz [rootstudy ~]# cd main-0.1 [rootstudy main-0.1]# make clean main [rootstudy main-0.1]# ./main version 0.1 Please input your name: VBird Please enter the degree angle (ex 90): 45 Hi, Dear VBird, nice to meet you. The Sin is: 0.71 The Cos is: 0.71与之前的结果非常类似只是鸟哥将 Makefile 直接给您了但如果你下达 make install 时系统会告知没有 install 的 target 啊而且版本是 0.1 也告知了。那么如何更新到 0.2 版呢透过这个patch 文件吧这个文件的内容有点像这样 查阅 patch file 内容 [rootstudy main-0.1]# vim ~/main_0.1_to_0.2.patch diff -Naur main-0.1/cos_value.c main-0.2/cos_value.c # --- main-0.1/cos_value.c 2015-09-04 14:46:59.200444001 0800main-0.2/cos_value.c 2015-09-04 14:47:10.215444000 0800-7,5 7,5 {float value; ....(底下省略)....上面表格内有#的部分那代表使用 diff 去比较时被比较的两个文件所在路径这个路径非常的重要喔 因为 patch 的基本语法如下 patch -p 数字 patch_file 特别留意那个『 -p 数字』那是与 patch_file 里面列出的文件名有关的信息。假如在 patch_file 第一行写的是这样 *** /home/guest/example/expatch.old 那么当我下达『 patch -p0 patch_file 』时则更新的文件是『 /home/guest/example/expatch.old 』如果『 patch -p1 patch_file』则更新的文件为『home/guest/example/expatch.old』如果『patch -p4 patch_file』则更新『expatch.old』也就是说 **-pxx 那个 xx 代表『拿掉几个斜线(/)』**的意思这样可以理解了吗 好了根据刚刚上头的资料我们可以发现比较的文件是在 main-0.1/xxx 与main-0.2/xxx 所以说如果你是在 main-0.1 底下并且想要处理更新时就得要拿掉一个目录 (因为并没有 main-0.2 的目录存在 我们是在当前的目录进行更新的)因此使用的是 -p1 才对喔所以 更新原始码并且重新编译程序 [rootstudy main-0.1]# patch -p1 ../main_0.1_to_0.2.patch patching file cos_value.c patching file main.c patching file Makefile patching file sin_value.c # 请注意鸟哥目前所在目录是在 main-0.1 底下喔注意与 patch 文件的相对路径 # 虽然有五个文件但其实只有四个文件有修改过喔上面显示有改过的文件 [rootstudy main-0.1]# make clean main [rootstudy main-0.1]# ./main version 0.2 Please input your name: VBird Please enter the degree angle (ex 90): 45 Hi, Dear VBird, nice to meet you. The sin(45.000000) is: 0.71 The cos(45.000000) is: 0.71 # 你可以发现输出的结果中版本变了输出信息多了括号 () 喔 [rootstudy main-0.1]# make install 将他安装到 /usr/local/bin 给大家用 cp -a main /usr/local/bin [rootstudy main-0.1]# main 直接输入指令可执行 [rootstudy main-0.1]# make uninstall 移除此软件 rm -f /usr/local/bin/main很有趣的练习吧所以你只要下载 patch file 就能够对你的软件原始码更新了只不过更新了原始码并非软件就更新你还是得要将该软件进行编译后才会是最终正确的软件喔 因为 patch 的功能主要仅只是更新原始码文件而已切记切记此外如果你 patch 错误呢没关系的我们的 patch 是可以还原的啊透过『 patch -R ../main_0.1_to_0.2.patch 』就可以还原啦很有趣吧 39.3 函式库管理 在我们的 Linux 操作系统当中函式库是很重要的一个项目。 因为很多的软件之间都会互相取用彼此提供的函式库来进行特殊功能的运作 例如很多需要验证身份的程序都习惯利用 PAM 这个模块提供的验证机制来实作而很多网络联机机制则习惯利用 SSL 函式库来进行联机加密的机制。所以说函式库的利用是很重要的。不过 函式库又依照是否被编译到程序内部而分为动态与静态函式库这两者之间有何差异哪一种函式库比较好 底下我们就来谈一谈先 动态与静态函式库 函式库的类型有哪些依据函式库被使用的类型而分为两大类分别是静态(Static) 与动态 (Dynamic) 函式库两类。底下我们来谈一谈这两种类行的函式库吧 静态函式库的特色 扩展名(扩展名为 .a) 这类的函式库通常扩展名为 libxxx.a 的类型编译行为 这类函式库在编译的时候会直接整合到执行程序当中所以利用静态函式库编译成的文件会比较大一些喔独立执行的状态 这类函式库最大的优点就是编译成功的可执行文件可以独立执行而不需要再向外部要求读取函式库的内容 (请参照动态函式库的说明)。升级难易度 虽然执行档可以独立执行但因为函式库是直接整合到执行档中 因此若函式库升级时整个执行档必须要重新编译才能将新版的函式库整合到程序当中。 也就是说在升级方面只要函式库升级了所有将此函式库纳入的程序都需要重新编译 动态函式库的特色 扩展名(扩展名为 .so) 这类函式库通常扩展名为 libxxx.so 的类型编译行为 动态函式库与静态函式库的编译行为差异挺大的。 与静态函式库被整个捉到程序中不同的动态函式库在编译的时候在程序里面只有一个『指向 (Pointer)』的位置而已。也就是说动态函式库的内容并没有被整合到执行档当中而是当执行档要使用到函式库的机制时 程序才会去读取函式库来使用。由于执行文件当中仅具有指向动态函式库所在的指标而已 并不包含函式库的内容所以他的文件会比较小一点。独立执行的状态 这类型的函式库所编译出来的程序不能被独立执行 因为当我们使用到函式库的机制时程序才会去读取函式库所以函式库文件『必须要存在』才行而且函式库的『所在目录也不能改变』因为我们的可执行文件里面仅有『指标』亦即当要取用该动态函式库时 程序会主动去某个路径下读取呵呵所以动态函式库可不能随意移动或删除会影响很多相依的程序软件喔升级难易度 虽然这类型的执行档无法独立运作然而由于是具有指向的功能 所以当函式库升级后执行档根本不需要进行重新编译的行为因为执行档会直接指向新的函式库文件 (前提是函式库新旧版本的档名相同喔)。 目前的 Linux distribution 比较倾向于使用动态函式库因为如同上面提到的最重要的一点 就是函式库的升级方便由于 Linux 系统里面的软件相依性太复杂了如果使用太多的静态函式库那么升级某一个函式库时 都会对整个系统造成很大的冲击因为其他相依的执行档也要同时重新编译啊 这个时候动态函式库可就有用多了因为只要动态函式库升级就好其他的软件根本无须变动。 那么这些函式库放置在哪里呢绝大多数的函式库都放置在/lib64, /lib 目录下 此外Linux 系统里面很多的函式库其实 kernel 就提供了那么 kernel 的函式库放在哪里呵呵就是在 /lib/modules 里面啦里面的数据可多着呢不过要注意的是 不同版本的核心提供的函式库差异性是挺大的所以 kernel 2.4.xx 版本的系统不要想将核心换成 2.6.xx 喔 很容易由于函式库的不同而导致很多原本可以执行的软件无法顺利运作呢 ldconfig 与 /etc/ld.so.conf 在了解了动态与静态函式库也知道我们目前的 Linux 大多是将函式库做成动态函式库之后再来要知道的就是那有没有办法增加函式库的读取效能 我们知道内存的访问速度是硬盘的好几倍所以如果我们将常用到的动态函式库先加载内存当中 (快取, cache)如此一来当软件要取用动态函式库时就不需要从头由硬盘里面读出啰 这样不就可以增进动态函式库的读取速度没错是这样的这个时候就需要 ldconfig 与 /etc/ld.so.conf 的协助了。 如何将动态函式库加载高速缓存当中呢 首先我们必须要在 /etc/ld.so.conf 里面写下『 想要读入高速缓存当中的动态函式库所在的目录』注意喔 是目录而不是文件接下来则是利用 ldconfig 这个执行档将 /etc/ld.so.conf 的资料读入快取当中同时也将数据记录一份在 /etc/ld.so.cache 这个文件当中吶 事实上 ldconfig 还可以用来判断动态函式库的链接信息呢赶紧利用 CentOS 来测试看看。假设妳想要将目前你系统下的 mariadb 函式库加入到快取当中时可以这样做 [rootstudy ~]# ldconfig [-f conf] [ -C cache] [rootstudy ~]# ldconfig [-p] 选项与参数 -f conf 那个 conf 指的是某个文件名也就是说使用 conf 作为 libarary 函式库的取得路径而不以 /etc/ld.so.conf 为默认值 -C cache那个 cache 指的是某个文件名也就是说使用 cache 作为快取暂存的函式库资料而不以 /etc/ld.so.cache 为默认值 -p 列出目前有的所有函式库资料内容 (在 /etc/ld.so.cache 内的资料)# 范例一假设我的 Mariadb 数据库函式库在 /usr/lib64/mysql 当中如何读进 cache [rootstudy ~]# vim /etc/ld.so.conf.d/vbird.conf /usr/lib64/mysql 这一行新增的啦 [rootstudy ~]# ldconfig 画面上不会显示任何的信息不要太紧张正常的 [rootstudy ~]# ldconfig -p 924 libs found in cache /etc/ld.so.cachep11-kit-trust.so (libc6,x86-64) /lib64/p11-kit-trust.solibzapojit-0.0.so.0 (libc6,x86-64) /lib64/libzapojit-0.0.so.0 ....(底下省略).... # 函式库名称 该函式库实际路径透过上面的动作我们可以将 Mariadb 的相关函式库给他读入快取当中这样可以加快函式库读取的效率呢 在某些时候你可能会自行加入某些 Tarball 安装的动态函式库而你想要让这些动态函式库的相关连结可以被读入到快取当中 这个时候你可以将动态函式库所在的目录名称写入/etc/ld.so.conf.d/yourfile.conf 当中然后执行 ldconfig 就可以啦 程序的动态函式库解析 ldd 说了这么多那么我如何判断某个可执行的 binary 文件含有什么动态函式库呢很简单利用 ldd 就可以晓得了例如我想要知道 /usr/bin/passwd 这个程序含有的动态函式库有哪些可以这样做 [rootstudy ~]# ldd [-vdr] [filename] 选项与参数 -v 列出所有内容信息 -d 重新将资料有遗失的 link 点秀出来 -r 将 ELF 有关的错误内容秀出来# 范例一找出 /usr/bin/passwd 这个文件的函式库数据 [rootstudy ~]# ldd /usr/bin/passwd ....(前面省略)....libpam.so.0 /lib64/libpam.so.0 (0x00007f5e683dd000) PAM 模块libpam_misc.so.0 /lib64/libpam_misc.so.0 (0x00007f5e681d8000)libaudit.so.1 /lib64/libaudit.so.1 (0x00007f5e67fb1000) SELinuxlibselinux.so.1 /lib64/libselinux.so.1 (0x00007f5e67d8c000) SELinux ....(底下省略).... # 我们前言的部分不是一直提到 passwd 有使用到 pam 的模块吗怎么知道 # 利用 ldd 察看一下这个文件看到 libpam.so 了吧这就是 pam 提供的函式库# 范例二找出 /lib64/libc.so.6 这个函式的相关其他函式库 [rootstudy ~]# ldd -v /lib64/libc.so.6/lib64/ld-linux-x86-64.so.2 (0x00007f7acc68f000)linux-vdso.so.1 (0x00007fffa975b000)Version information: 使用 -v 选项增加显示其他版本信息/lib64/libc.so.6:ld-linux-x86-64.so.2 (GLIBC_2.3) /lib64/ld-linux-x86-64.so.2ld-linux-x86-64.so.2 (GLIBC_PRIVATE) /lib64/ld-linux-x86-64.so.239.4 检验软件正确性 目前有多种机制可以计算文件的指纹码我们选择使用较为广泛的 MD5, SHA1 或 SHA256 加密机制来处理 [rootstudy ~]# md5sum/sha1sum/sha256sum [-bct] filename [rootstudy ~]# md5sum/sha1sum/sha256sum [--status|--warn] --check filename 选项与参数 -b 使用 binary 的读档方式默认为 Windows/DOS 文件型态的读取方式 -c 检验文件指纹 -t 以文字型态来读取文件指纹。# 范例一将刚刚的文件下载后测试看看指纹码 [rootstudy ~]# md5sum ntp-4.2.8p3.tar.gz b98b0cbb72f6df04608e1dd5f313808b ntp-4.2.8p3.tar.gz # 看显示的编码是否与上面相同呢赶紧测试看看一般而言每个系统里面的文件内容大概都不相同例如你的系统中的 /etc/passwd 这个登入信息文件与我的一定不一样因为我们的用户与密码、 Shell 及家目录等大概都不相同所以由 md5sum 这个文件指纹分析程序所自行计算出来的指纹表当然就不相同啰 好了那么如何应用这个东西呢基本上你必须要在你的 Linux 系统上为你的这些重要的文件进行指纹数据库的建立 (好像在做户口调查)将底下这些文件建立数据库 /etc/passwd/etc/shadow (假如你不让用户改密码了)/etc/group/usr/bin/passwd/sbin/rpcbind/bin/login (这个也很容易被骇)/bin/ls/bin/ps/bin/top 这几个文件最容易被修改了因为很多木马程序执行的时候还是会有所谓的『执行序, PID』为了怕被 root 追查出来所以他们都会修改这些检查排程的文件如果你可以替这些文件建立指纹数据库 (就是使用 md5sum 检查一次将该文件指纹记录下来然后常常以 shell script 的方式由程序自行来检查指纹表是否不同了)那么对于文件系统会比较安全啦 该系列目录 -- 【BASH】回顾与知识点梳理目录
http://www.tj-hxxt.cn/news/232150.html

相关文章:

  • 织梦网站被做跳转网站主机ip查询
  • 加人引流加人网站怎么做黄冈网站制作
  • 网站建设自查情况报告莘庄做网站
  • js判断是手机还是电脑访问网站垂直电商平台有哪些?
  • 宣传式网站网页设计培训传智教育
  • 嘉兴城乡建设网站做报纸版式的网站
  • 呼和浩特做网站的朝阳网站建设 慈云寺
  • 湘潭找工作网站个人的网站建设的目的
  • 哪家成都公司做网站网页游戏平台排名前10名
  • 网站建设和网站开发的区别深圳手机网站公司
  • 网站添加属性物流网站的功能与特色
  • 网络营销做得好的产品什么网站做优化最好?
  • 做网站的联系方式免费培训机构
  • 淘宝客网站WordPress最新注册公司流程及费用
  • 网站设计网页首页介绍如何搭建微信公众号平台
  • 直播网站可以做毕设吗网页模板网站有那些
  • 沧州做网站哪家好网页设计ppt模板
  • 东莞整站排名苏州品牌网站建设
  • 织梦网站后台模板wordpress移动
  • pdf怎么做电子书下载网站买了域名怎么做网站
  • 中国工商银行网站建设WordPress勾选评论
  • 哈尔滨房地产型网站建设资源共享课程网站开发毕业设计
  • 兰州展柜公司网站建设邯郸市网站建设多少钱
  • 滴滴网站建设流程seo快排优化
  • 漳州市建设网站网店代运营具体做什么
  • 企业网站建设中有哪几个重要点青岛网站建设大全
  • 网站建设要不要学编码WordPress人物插件
  • 西安建网站哪家好企业网页如何制作
  • 网站建设的开发方式和费用wordpress导航字体大小
  • wordpress怎样更改文章阅读次数哈尔滨百度推广排名优化