- Linux 系统上真正认识的可执行文件其实是二进制文件 ( binary program )
- shell scripts 只是利用 shell (例如 bash) 这支程序的功能进行一些判断式,而最终执行的除了 bash提供的功能外,它是呼叫一些已经编译好的二进制程序来执行的
- 小结:
- 开放源码:就是程序代码,写给人类看的程序语言,但机器并不认识,所以无法执行
- 编译程序:将程序代码转译成为机器看的懂得语言,就类似翻译者的角色
- 可执行文件:经过编译程序变成二进制程序后,机器看的懂所以可以执行的档案。
- 函式库:就类似子程序的角色,可以被呼叫来执行的一段功能函数。
- 什么是 make 与 configure
- make 是一支程序,会去找 Makefile,Makefile 的规则档案由侦测程序主动建立,通常这支侦测程序的文件名为 configure 或者是 config 。
- 侦测程序会侦测的数据大约有底下这些:
- 是否有适合的编译程序可以编译本软件的程序代码;
- 是否已经存在本软件所需要的函式库,或其他需要的相依软件;
- 操作系统平台是否适合本软件,包括 Linux 的核心版本;
- 核心的表头定义档 (header include) 是否存在 (驱动程序必须要的侦测)。
- 什么是 Tarball 的软件
- Tarball 档案,其实就是将软件的所有原始码档案先以 tar 打包,然后再以压缩技术来压缩。
- Tarball 是一个软件包, 你将他解压缩之后,里面的档案通常就会有:
- 源代码档案;
- 侦测程序档案 (可能是 configure 或 config 等档名);
- 本软件的简易说明与安装说明 (INSTALL 或 README)
- 更新的方法可以分为两大类,分别是:
- 直接以原始码透过编译来安装与升级;
- 直接以编译好的 binary program 来安装与升级。例如yum、APT等。
- Tarball 是如何安装的:
- 将 Tarball 由厂商的网页下载下来;
- 将 Tarball 解开,产生很多的原始码档案;
- 开始以 gcc 进行原始码的编译 (会产生目标文件 object files);
- 然后以 gcc 进行函式库、主、子程序的链接,以形成主要的 binary file;
- 将上述的 binary file 以及相关的配置文件安装至自己的主机上面。
- 3, 4 步骤当中,我们可以透过 make 这个指令的功能来简化他,
- 由于我们的原始码档案有时并非仅只有一个档案,所以我们无法直接进行编译。 这个时候就需要先产生目标文件,然后再以连结制作成为 binary 可执行文件。
- gcc 的简易用法 (编译、参数与链结)
- 仅将原始码编译成为目标文件,并不制作链接等功能:
- [root@www ~]# gcc -c hello.c.
- 在编译的时候,依据作业环境给予优化执行速度
- [root@www ~]# gcc -O hello.c -c
- 在进行 binary file 制作时,将连结的函式库与相关的路径填入
- [root@www ~]# gcc sin.c -lm -L/usr/lib -I/usr/include
- -lm 指的是 libm.so 或 libm.a 这个函式库档案;
- -l :是『加入某个函式库(library)』的意
- m :则是 libm.so 这个函式库,其中, lib 与扩展名(.a 或 .so)不需要写
- -L 后面接的路径是刚刚上面那个函式库的搜寻目录;
- -I 后面接的是原始码内的 include 档案之所在目录。
- -lm 指的是 libm.so 或 libm.a 这个函式库档案;
- [root@www ~]# gcc sin.c -lm -L/usr/lib -I/usr/include
- 将编译的结果输出成某个特定档名
- [root@www ~]# gcc -o hello hello.c
- 在编译的时候,输出较多的讯息说明
- [root@www ~]# gcc -o hello hello.c -Wall
- 仅将原始码编译成为目标文件,并不制作链接等功能:
- 用 make 进行宏编译
- 例: 先创建makefile规则文件
- vim makefile
- main: main.o haha.o sin_value.o cos_value.o
- gcc -o main main.o haha.o sin_value.o cos_value.o -lm
- 执行make程序 make
- make 有这些好处:
- 简化编译时所需要下达的指令;
- 若在编译完成之后,修改了某个原始码档案,则 make 仅会针对被修改了的档案进行编译,其他的 object file 不会被更动;
- 最后可以依照相依性来更新 (update) 执行档。
- 基本的 makefile 规则是这样的:
- 标的(target): 目标文件1 目标文件2
- <tab> gcc -o 欲建立的执行文件 目标文件1 目标文件2
- 『命令行必须要以 tab 按键作为开头』才行
- 例:1. 先编辑 makefile 来建立新的规则,此规则的标的名称为 clean :
- [root@www ~]# vi makefile
- main: main.o haha.o sin_value.o cos_value.o
- gcc -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 的结果:
- [root@www ~]# make clean <==就是这里!透过 make 以 clean 为标的
- rm -rf main main.o haha.o sin_value.o cos_value.o
- makefile 里面就具有至少两个标的,分别是 main 与 clean
- 例: 利用shell script简化makefile
- [root@www ~]# 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}
- 变量的基本语法为:
- 变量与变量内容以『=』隔开,同时两边可以具有空格;
- 变量左边不可以有 <tab> ,例如上面范例的第一行 LIBS 左边不可以是 <tab>;
- 变量与变量内容在『=』两边不能具有『:』
- 在习惯上,变数最好是以『大写字母』为主;
- 运用变量时,以 ${变量} 或 $(变量) 使用;
- 在该 shell 的环境变量是可以被套用的,例如提到的 CFLAGS 这个变数!
- 在指令列模式也可以给予变量
- make 指令列后面加上的环境变量为优先;
- makefile 里面指定的环境变量第二;
- shell 原本具有的环境变量第三。
- $@:代表目前的标的(target)
- Tarball 安装的基本步骤
- 取得原始档:将 tarball 档案在 /usr/local/src 目录下解压缩;
- 取得步骤流程:进入新建立的目录底下,去查阅 INSTALL 与 README 等相关档案内容 (很重要的步骤!);
- 相依属性软件安装:根据 INSTALL/README 的内容察看并安装好一些相依的软件 (非必要);
- 建立 makefile:以自动侦测程序 (configure 或 config) 侦测作业环境,并建立 Makefile 这个档案;
- 编译:以 make 这个程序并使用该目录下的 Makefile 做为他的参数配置文件,来进行 make (编译或其他) 的动作;
- 安装:以 make 这个程序,并以 Makefile 这个参数配置文件,依据 install 这个标的 (target) 的指定来安装到正确的路径!
- 大部分的 tarball 软件之安装的指令下达方式:
- ./configure
- make clean
- make
- make install ,将上一个步骤所编译完成的数据给他安装到预定的目录中
- make distclean ,类似make clean,但同时也将configure生成的文件全部删除掉,包括Makefile
- 大部分的 tarball 软件之安装的指令下达方式:
- 安装的软件放置
- 建议大家将自己安装的软件放置在 /usr/local 下,至于原始码 (Tarball)则建议放置在 /usr/local/src (src 为 source 的缩写)底下啊。
- Linux distribution 默认的安装软件的路径
- /etc/httpd 配置文件
- /usr/lib 函式库
- /usr/bin 执行档
- /usr/share/man 联机帮助档
- 以 tarball 来安装时:
- /usr/local/etc
- /usr/local/bin
- /usr/local/lib
- /usr/local/man
- 如果你在安装的时候选择的是单独的目录:---------方便删除,但指令的路径要加到PATH当中
- /usr/local/apache/etc
- /usr/local/apache/bin
- /usr/local/apache/lib
- /usr/local/apache/man
- 为了方便 Tarball 的管理,通常鸟哥会这样建议使用者:
- 最好将 tarball 的原始数据解压缩到 /usr/local/src 当中;
- 安装时,最好安装到 /usr/local 这个默认路径下;
- 考虑未来的反安装步骤,最好可以将每个软件单独的安装在 /usr/local 底下;
- 为安装到单独目录的软件之 man page 加入 man path 搜寻:
- 如果你安装的软件放置到 /usr/local/software/ ,那么 man page 搜寻的设定中,可能就得要在/etc/man.config 内的 40~50 行左右处,写入如下的一行:MANPATH /usr/local/software/man
- 动态与静态函式库
- 静态函式库的特色:
- 扩展名:(扩展名为 .a),这类的函式库通常扩展名为 libxxx.a 的类型;
- 编译行为:这类函式库在编译的时候会直接整合到执行程序当中,所以利用静态函式库编译成的档案会比较大一些喔;
- 独立执行的状态:这类函式库最大的优点,就是编译成功的可执行文件可以独立执行,而不需要再向外部要求读取函式库的内容 (请参照动态函式库的说明)
- 升级难易度:在升级方面,只要函式库升级了,所有将此函式库纳入的程序都需要重新编译!
- 动态函式库的特色:
- 扩展名:(扩展名为 .so),这类函式库通常扩展名为 libxxx.so 的类型;
- 编译行为:动态函式库在编译的时候,在程序里面只有一个『指向 (Pointer)』的位置而已
- 独立执行的状态:函式库档案『必须要存在』才行,而且,函式库的『所在目录也不能改变』。
- 升级难易度:当函式库升级后,执行档根本不需要进行重新编译的行为,档名相同即可。
- 绝大多数的函式库都放置在:/usr/lib, /lib 目录下!kernel 的函式库放在/lib/modules 里面
- 静态函式库的特色:
- ldconfig 与 /etc/ld.so.conf
- 将常用到的动态函式库先加载内存当中 (快取, cache),增进动态函式库的读取速度!
- 首先,我们必须要在 /etc/ld.so.conf 里面写下『 想要读入高速缓存当中的动态函式库所在的目录』,注意喔, 是目录而不是档案;
- 接下来则是利用 ldconfig 这个执行档将 /etc/ld.so.conf 的资料读入快取当中;
- 同时也将数据记录一份在 /etc/ld.so.cache 这个档案当中吶!
- ldconfig [-f conf] [ -C cache]
- ldconfig [-p]
- -f conf :那个 conf 指的是某个文件名,也就是说,使用 conf 作为 libarary 函式库的取得路径,而不以 /etc/ld.so.conf 为默认值
- -C cache:那个 cache 指的是某个文件名,也就是说,使用 cache 作为快取暂存 的函式库资料, 而不以 /etc/ld.so.cache 为默认值
- -p :列出目前有的所有函式库资料内容 (在 /etc/ld.so.cache 内的资料
- 程序的动态函式库解析: ldd -----------------判断某个可执行的 binary 档案含有什么动态函式库
- ldd [-vdr] [filename]
- -v :列出所有内容信息;
- -d :重新将资料有遗失的 link 点秀出来!
- -r :将 ELF 有关的错诨内容秀出来!
- 例:范例一:找出 /usr/bin/passwd 这个档案的函式库数据
- [root@www ~]# ldd /usr/bin/passwd
- 范例二:找出 /lib/libc.so.6 这个函式的相关其他函式库!
- [root@www ~]# ldd -v /lib/libc.so.6
- ldd [-vdr] [filename]
- 检验软件正确性
- md5sum/sha1sum [-bct] filename
- md5sum/sha1sum [--status|--warn] --check filename
- -b :使用 binary 的读档方式,默认为 Windows/DOS 档案型态的读取方式;
- -c :检验档案指纹;
- -t :以文字型态来读取档案指纹。
- Linux 系统上为你的这些重要的档案进行指纹数据库的建立
- /etc/passwd
- /etc/shadow( 假如你不讥用户改密码了 )
- /etc/group
- /usr/bin/passwd
- /sbin/portmap
- /bin/login ( 这个也很容易被骇! )
- /bin/ls
- /bin/ps
- /usr/bin/top
编译安装报错尝试解决办法:
如果你已经知道你要找什么,你可以让strace只跟踪一些类型的系统调用。例如,你需要看看在configure脚本里面执行的程序,你需要监视的系统调 用就是execve。让strace只记录execve的调用用这个命令:
strace -f -o configure-strace.txt -e execve ./configure