软件安装:源码与Tarball

1、什么是源代码、编译程序和可执行文件
1.1、可执行文件
通常具有x权限的文件我们称之为可执行文件,但是Linux真正认识的是二进制文件,虽然shell script也能执行,但是他们只是利用bash shell做一些判断,最终调用的也是二进制程序。
如何判断一个文件是否为二进制文件:
file 文件全路径;
  • 如果是二进制可执行文件,那么会显示执行文件类别(ELF 32-bit LSB executable),同时会说明是否使用动态函数库(uses shared libs);
  • 如果是一般的shell script,那他就会显示(Bourne-Again shell script text executable)

1.2、源代码
使用vim编辑器写出的程序就是源代码

1.3、编译程序
将源代码编译成操作系统看得懂的二进制程序的工具就是编译程序。
gcc 就是一款C语言编译程序C源代码文件以“.c”结尾,编译产生的目标文件以“.o”结尾

2、函数库
函数库分为动态函数库和静态函数库,Linux核心提供了很多核心相关的函数库与外部参数,这些信息大多放置于/usr/include,/lib,/usr/lib里。

3、make与configure
3.1、make
(1)make指令能够使编译过程简化,make的原理:
  • 当执行make时,make会在当时的目录下搜寻Makefile/makefile这个文本文件,而makefile里则记录了源码如何编译的详细信息。
  • make会自动判别源码是否经过变动了,从而自动更新执行档。
(2)makefile如何生成
通常软件开发商会写一支检测程序来检测用户的作业环境,以及该作业环境是否有软件开发商所需要的其他功能,该检测程序检测完毕后,就会主动的建立这个makefile文件。通常makefile的文件名为“configure”或是“config”。
(3)安装gcc
yum groupinstall “Development Tools”

3.2、configure
(1)configure用于检测作业环境,为什么要检测作业环境?
因为不同内核的操作系统,调用函数的方式可能不同,另外软件开发商开发出的软件不仅仅针对Linux,而是针对整个Unix-like,所以必须要检测该操作系统平台是否有提供合适的编译程序。一般检测程序检测的内容如下:
  • 是否有合适的编译器
  • 是否已经存在本软件所需要的函数库或第三方依赖软件
  • 操作系统平台是否适合本软件,包括内核版本
  • 内核的表头定义档(header include)是否存在
(2)由于不同的Linxu发行版函数库存放的位置可能不同,核心的版本也不同,所以同一套软件要在不同的平台上面执行,必须要重复编译,所以才需要源码。

3.3、makefile基本语法
了解makefile的规则是为了以后可以自行修改makefile。
(1)makefile规则如下:
标的(target):目标文件1 目标文件2
<tab> gcc -o 欲建立的执行文件 目标文件1 目标文件2
target 是我们想要建立的信息的意思,类似于命令的选项
<tab> 命令行必须以Tab键开头
(2)makefile中的变量
①定义变量:
变量名 = xxx
②取用变量:
${变量名}
③相关规则:
  • =两边可以有空格,但不能有冒号
  • 变量名左边不能有Tab键
  • 变量名最好大写
  • 使用${}或$()取用变量
  • make取用环境变量的优先级:make指令后面的变量>makefile中定义的变量>shell原本的变量
  • $@:代表目前的标的(target)

4、Tarball
4.1、Tarball由来
(1)我们知道源码其实都是纯文本文件,在网络上传输很费宽带,所以一般将其打包压缩。下载Tarball将其解压缩后,里面的文件通常有:
  • 源代码
  • 检测程序(可能是configure或config)
  • 软件的简易说明或安装说明(INSTALL或README)
(2)Tarball的安装过程
  • 将Tarball由厂商的官网下载下来
  • 将Tarball解压缩,生成很多的原始码文件
  • 开始以gcc进行原始码的编译(会产生目标文件object files)
  • 然后以gcc进行函数库、主、子程序的连接,以形成最终的二进制文件
  • 将上述的二进制文件以及相关配置文件安装到主机上
上面的gcc可以使用make来替代

4.2、Tarball安装
(1)步骤:
  • 取得压缩文件,将文件在/usr/local/src目录下解压缩;
  • 在解压后的目录中查阅INSTALL或者README(重要);
  • 根据install或readme中的内容安装依赖包或第三方软件;
  • 使用软件商提供的configure或config指令检测安装环境,生成makefile;
  • 使用make编译程序
  • 使用make install安装程序
(2)编译先关的配置文件makefile和编译完成的可执行文件都还在源码所在的目录中。
(3)安装完之后,需要手动将安装目录,例如 /usr/local/xxx加入man page的 /etc/man.config中。

4.3、注意事项及预设
(1)安装路径:
  • 一般Linux中的软件大多安装在/usr里面;
  • 用户的软件建议安装在/usr/local目录下;
  • 至于源码,一般都放在/usr/local/src下。
(2)Linux下默认软件安装的几个路径
  • /etc/* 配置文件
  • /usr/lib 函数库
  • /usr/bin 执行档
  • /usr/share/man 联机帮助档
①若以Tarball来安装,因为/usr/local下本来就有那几个目录,所以你的数据就会被放在:
/usr/local/{etc、bin、lib、man}下。
②但是,如果所有的软件都放置在这4个目录下,那么未来想升级或移除的时候,就比较困难。所以一般我们会以软件名为一个目录,放置在/usr/local下,所以调整后的软件数据路径就是这样:
/usr/local/ 软件名/{etc、bin、lib、man}
这样一来,我们想移除某个软件,只要移除这个软件名的目录就可以了。


5、软件的升级
5.1、利用patch更新源码
(1)一般的软件厂商在更新软件源码之后,会同时提供一个补丁文件(patch file),这样做是为了避免下载整个新的源码,整个重新编译,从而节省了网络带宽与时间。
(2)回顾patch语法
patch -p 数字 < patch_file
数字 范围0~
-p 数字就是代表拿掉几个“/”的意思
(3)更新完之后再编译即可

6、函数库管理
6.1、静态函数库
(1)扩展名
静态函数库通常以“.a”为扩展名。
(2)编译行为
这类函数库在编译的时候会直接整合到执行程序当中所以利用静态函数库编译成的档案会比较大一些。
(3)独立执行状态
静态函数库最大的优点,就是编译成功的可执行文件可以独立执行,而不需要再向外部要求读取函数库内容。
(4)升级难易度
因为静态函数库是直接编译到执行档中的,所以若静态函数库要升级,那么整个软件都需要重新编译才行。

6.2、动态函数库
(1)扩展名
动态函数库通常以“.so”为扩展名。
(2)编译行为
动态函数库在编译时并不会把整体编译进执行档中,而是只提供一个指向动态函数库路径的指针,当程序调用到动态函数时,才会去读取动态函数库,所以执行档会比较小一些。
(3)独立执行状态
这种函数库所编译出来的程序不能独立执行,因为当我们使用到函数库机制时,程序才会去读取函数库,并且函数库所在目录不能改变。
(4)升级难易度
因为在执行档中只是保留一个指针,所以动态函数库的升级不影响执行档,软件不需要重新编译。

6.3、函数库存放位置
绝大多数函数库都放置在/usr/lib或/lib目录下,内核提供的函数库放置在/lib/modules下。

6.4、ldconfig与/etc/ld.so.conf
(1)将动态函数库载入缓存
将函数库载入缓存,可以加快函数库的读取速度。
实现步骤:
  • 将要载入缓存的动态函数库所在目录写入/etc/ld.so.conf;
  • 使用ldconfig将/etc/ld.so.conf读入内存;
  • 同时将数据记录一份在/etc/ld.so.cache。
(2)ldconfig用法
ldconfig 【-f conf】 【-C cache】
ldconfig -p
-f 后面接文件名,也就是使用conf作为取得函数库的目录,而不以/etc/ld.so.conf为默认值
-C 后面接文件名,也就是使用cache作为缓存函数库的文件,而不以/etc/ld.so.cache为默认值
-p 列出目前在/etc/ld.so.cache中的函数库信息

6.5、动态函数库解析
(1)查询某个程序所依赖的动态函数库
ldd 【-vdr】 【文件名】
-v 列出所有内容信息
-d 重新将资料有遗失的link点展示出来
-r 将ELF有关的错误内容展示出来

7、验证下载软件的安全性
使用md5sum或sha1sum可以验证从官网下载的软件是否被篡改过
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值