《鸟哥的Linux私房菜》读书笔记:软件安装——源代码与Tarball

1.开源的软件安装与升级简介

1.1什么是开放源码、编译程序和可执行文件

  • 可执行文件:经过编译程序变成二进制程序后,机器能识别,可以执行的档案。
  • 开放源码:就是程序代码,写给人类看的程序语言,但机器不能识别,所以无法执行。
  • 编译程序:将程序代码转译成为机器看的懂得语言,就类似翻译者的角色

1.2什么是函数库

  • 函数库:类似子程序的角色,可以被调用来执行的一段功能函数。

1.3什么是make和configure

  • configure:侦测用户操作环境,是否支持软件的运行,侦测完毕生成makefile文件
    • 是否有适合的编译程序可以编译本软件的程序代码
    • 是否已经存在本软件所需要的函数库,或其他需要的相依软件
    • 操作系统平台是否适合本软件,包括 Linux 的核心版本
    • 核心的头文件定义档 (header include) 是否存在 (驱动程序必须要的侦测)。
  • make:make是一个程序,会去找makefile文件,然后执行编译。

1.4什么是Tarball的软件

  • Tarball软件包:将软件的所有源代码文件先以 tar 打包,然后再以压缩技术来压缩,通常最常见的就是以gzip、bzip2来压缩了。里面包含:
    • 源代码文件
    • 侦测程序文件 (可能是configure或config等文件名)
    • 本软件的简易说明和安装说明 (INSTALL或README)

2.使用传统程序语言进行编译的简单范例

2.1主、子程序链接:子程序的编译,生成目标文件

  • 为什么需要目标文件(*.o):我们的源代码问文件有时并非仅只有一个文件,所以我们无法直接进行编译。这个时候就需要先产生目标文件,然后再以连结制作成为 binary 可执行文件。再次编译只需要重新生成改动过的源代码文件的目标文件,不需要编译所有的源代码文件,减少编译所需的时间。

2.2呼叫外部函数库:加入连结的函数库

  • 编译时加入额外函数库连结的方式:gcc xxx.c -lX -L/lib -L/usr/lib
    • -l :是加入某个函数库(library)的意思
    • -X :则是libX.so这个函数库,其中, lib与扩展名(.a 或 .so)不需要写
    • -lX 表示使用 libX.so (或libX.a) 这个函数库的意思,后面的-L表示在后面的路径搜寻libX(预设是放在/lib和/usr/lib里面,所以可以不写,如果不在默认路径,需指出搜索路径)

3用make进行宏编译

3.1make命令的好处

  • 简化编译时所需要下达的指令。
  • 若在编译完成后,修改了某个原代码文件,则make仅会针对被修改了的档案进行编译,其他的object file不会被变更。
  • 最后可以依照相依性来更新 (update) 执行文件。

3.2makefile的基本语法和变量

目标(target): 目标文件1 目标文件2 
<tab> gcc -o 欲建立的执行文件 目标文件1 目标文件2
  • 在makefile当中,#代表批注
  • tab 缩进需要在命令行 (例如 gcc 这个编译程序指令) 的第一个字符
  • 目标 (target)和相依档案(就是目标文件)之间需以“:”隔开
  • make target命令来执行相应的操作

makefile也可以用变量来简化,但语法与shell script不同:

  • 变量和变量内容以“=”隔开,同时两边可以有空格
  • 变量左边不可以有tab缩进
  • 变量和变量内容在“=”两边不能有“:”
  • 在习惯上,变量最好是以大写字母为主
  • 运用变量时,以${变量}或$(变量) 使用
  • 在命令行模式也可以给予变量

因为gcc在编译时,会去读取 CFLAGS 这个环境变量,所以,你可以直接在 shell 定义出这个环境变量,也可以在 makefile 档案里面去定义。环境变量取用的规则:

  • make命令后面加上的环境变量优先
  • makefile里面指定的环境变量第二
  • shell原本具有的环境变量第三

4Tarball 的管理和建议

4.1使用源代码管理软件所需要的基础软件

  • gcc或cc等C语言编译程序 (compiler)
  • make及autoconfig等软件
  • 需要Kernel提供的Library以及相关的Include档案

4.2Tarball安装步骤

  • 取得原始文件:将 tarball 档案在 /usr/local/src 目录下解压缩
  • 取得步骤流程:进入新建立的目录底下,去查阅INSTALL和README等相关文件内容
  • 相依属性软件安装:根据INSTALL/README的内容察看并安装好一些相依的软件(非必要)
  • 建立makefile:以自动侦测程序 (configure\config) 侦测操作环境,并建立 Makefile 这个档案
  • 编译:以make这个程序并使用该目录下的Makefile做为他的参数配置文件,来进行 make (编译或其他) 的操作
  • 安装:以make这个程序,并以Makefile这个参数配置文件,依据 install 这个目标 (target) 的指定来安装到正确的路径

4.3利用 patch 更新源代码

  • 为什么使用patch更新:没有更动过的文件的目标文件 (object file) 不需要重新编译,而且有更动过的文件又可以利用 make 来自动 update (更新),如此一来,我们原先的设定 (makefile档案里面的规则) 将不需要重新改写或侦测

5函数库管理

函数库依照是否被编译到程序内部而分为动态和静态函数库

5.1动态和静态函数库

  • 静态函数库的特色:
    • 扩展名:(扩展名为.a) 这类的函数库通常扩展名为libxxx.a的类型
    • 编译行为: 这类函数库在编译的时候会直接整合到执行程序当中,所以利用静态函数库编译成的档案会比较大一些
    • 独立执行的状态: 这类函数库最大的优点,就是编译成功的可执行文件可以独立执行,而不需要再向外部要求读取函数库的内容。
    • 升级难易度: 虽然执行档可以独立执行,但因为函数库是直接整合到执行文件中, 因此若函数库升级时,整个执行文件必须要重新编译才能将新版的函数库整合到程序当中。也就是说,在升级方面,只要函数库升级了,所有将此函数库纳入的程序都需要重新编译。
  • 动态函数库的特色:
    • 扩展名:(扩展名 .so) 这类函数库通常扩展名为libxxx.so的类型
    • 编译行为:动态函数库与静态函数库的编译行为差异挺大的。与静态函数库被整个加载到程序中不同,动态函数库在编译的时候,在程序里面只有一个“指针 (Pointer)”的位置而已。也就是说,动态函数库的内容并没有被整合到执行文件当中,而是当执行文件要使用到函数库的机制时, 程序才会去读取函数库来使用。由与执行文件当中仅具有指向动态函数库所在的指针而已, 并不包扩函数库的内容,所以他的档案会比较小一点。
    • 独立执行的状态: 这类型的函数库所编译出来的程序不能被独立执行, 因为当我们使用到函数库的机制时,程序才会去读取函数库,所以函数库档案必须要存在才行,而且,函数库的所在目录也不能改变,因为我们的可执行文件里面仅有指针,当要取用该动态函数库时, 程序会主动去某个路径下读取。因此动态函数库不能随意移动或删除,会影响很多依赖的程序软件。
    • 升级难易度: 虽然这类型的执行文件无法独立运作,然而由于是具有指向的功能, 所以,当函数库升级后,执行文件根本不需要进行重新编译的行为,因为执行文件会直接指向新的函数库文件 (前提是函数库新旧版本的文件名相同)

绝大多数的函数库都放在:/usr/lib, /lib 目录下;Linux 系统里面很多的函数库kernel就提供了,其函数库放在 /lib/modules 里面;不同版本核心的函数库差异很大,更换系统版本后可能会导致很多原本可执行的软件无法执行了。

5.2ldconfig与/etc/ld.so.conf

  • 首先,我们必须要在/etc/ld.so.conf**里面写下想要读入高速缓存当中的动态函数库所在的目录**,注意:是目录而不是文件
  • 接下来则是利用 ldconfig 这个执行文件将 /etc/ld.so.conf 的资料读入cache当中
  • 同时也将数据记录一份在 /etc/ld.so.cache 这个文件当中
ldconfig [-p][-C cache][-f conf]
-p:打印/etc/ld.so.cache中所有的函数库
-C:不以默认的/etc/ld.so.cache,而以自定义的文件,作为cache暂存的函数库资料集合文件
-f:不以默认的/etc/ld.so.conf,而以自定义的文件,作为函数库的取得路径集合文件

5.3程序的动态函数库解析:ldd

用ldd命令来分析一个二进制可执行文件中包含哪些动态链接库。ldd [-vdr][filename]

  • -v :列出所有内容信息
  • -d:重新将资料有遗失的 link 点打印出来
  • -r :将 ELF 有关的错误内容打印出来

6.检验软件的正确性

  • md5sum / sha1sum:目前有多种机制可以计算文件的指纹码,我们选择使用较为广泛的MD5和SHA1加密机制来处理。你可以替容易被黑但通常不会变更的文件建立指纹数据库 (就是使用md5sum检查一次,将该档案指纹记录下来,然后常常以shell script的方式由程序自行来检查指纹表是否不同了,若文件是自己变更的,要记得更新指纹表文件,否则检查出文件变更但忘记是自己操作的就囧了~),这样对于文件系统会比较安全。
    md5sum/sha1sum实例
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值