概念
真正可以执行的是二进制文件(shell脚本仍是通过调用二进制文件来执行的),可以利用flie命令来查看是否是二进制文件;
通过编译+链接函数库来形成目标文件--如gcc的一些命令
Tarball软件包
其实是一个压缩包,通常用tar打包再压缩,解压后一般有如下文件:
源代码文件
检测程序文件(如configure)
本软件的简易说明或安装说明
流程:
将Tarball 由厂商的网页下载下来;
将Tarball 解开,产生很多的原始码档案;
开始以gcc 进行原始码的编译(会产生目标档object files);
然后以gcc 进行函式库、主、副程式的连结,以形成主要的binary file;
将上述的binary file 以及相关的设定档安装至自己的主机上面。
管理
- 取得原始文件:将 tarball 文件在 /usr/local/src 目录下解压缩;
- 取得步骤流程:进入新建立的目录底下,去查阅INSTALL与README等相关档案内容(很重要的步骤! );
- 依赖属性软件安装:根据INSTALL/README的内容察看并安装好一些相依的软件(非必要);
- 创建 makefile:以自动检测程序 (configure 或 config) 检测作业环境,并建立 Makefile 这个文件;
- 编译:以 make 这个程序并使用该目录下的 Makefile 做为他的参数设定文件,来进行 make (编译或其他) 的动作;
- 安装:以 make 这个程序,并以 Makefile 这个参数配置文件,依据 install 这个标的 (target) 的指定来安装到正确的路径!
-
安装命令流程
- ./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 的项目,将上一个步骤所编译完成的资料给他安装到预定的目录中,就完成安装啦!
注意:需要按顺序完成,不然下面步骤不能生效
-
安装目录指定
etc, lib, bin, man 等目录当中,分别代表'设定文件、函式库、执行文件、线上说明文件
我们一般安装在 /usr/local/ 里,方便管理
目录安装管理分为两种:
1安装默认目录里 /usr/local/etc... {
路径会在PATH内,所以可以直接使用软件名调用,man之类的也可以直接查到
}
2 安装软件单独目录/usr/local/软件名/etc...{
必须手动写入PATH内,不然只能使用绝对路径调用
删除时 直接删除软件名目录即可,方便
}
===
最好将 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
利用patch 更新源代码
需要有开发商发布的patch文件 加上make工具更新编译 来完成局部更新
patch -p数字 < patch_file
# 数字表示 patch文件第一行中,斜杠字段的第几栏 p0就表示第一栏
注意: 你还是得要将该软件进行编译后,才会是最终正确的软件喔! 因为 patch 的功能主要仅只是更新源代码文件而已
gcc编译与链接
gcc fileName1
##直接一步到位 编译+链接 ---但不能一次编译连接多个源文件
-c 源文件
##仅编译 产生.o 目标文件
-o 目标文件名 ...
##如无-o 则默认产生 a.out
make与 configure
列如:如果有多个源文件,必须要先分别-c编译 再一起链接一起来很麻烦
make是个程序,会自动判断源代码是否更新来简化编译(链接)过程;
执行make时,会在当前文件夹寻找makefile这个规则文件---通常开发商会写一个检测程序configu来检测用户环境自动产生makefile文件;
makefile语法
方法标识符 : filename1 filename2
gcc -o 最终的目标文件名 filename1 filename2 ##一定要加个tab来空格
例如:
[root@study ~]# 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}
$@代表当前的方法标识符
[root@study ~]# 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里的标识符内容
⚠️
与bash shell script的语法有点不太相同,变数的基本语法为:
- 变量与变量内容以『=』隔开,同时两边可以具有空格;
- 变量左边不可以有<tab> ,例如上面范例的第一行LIBS 左边不可以是<tab>;
- 变量与变量内容在『=』两边不能具有『:』;
- 在习惯上,变量最好是以『大写字母』为主;
- 运用变量时,以${变量} 或$(变量) 使用;
- 在该shell 的环境变量是可以被套用的,例如提到的CFLAGS 这个变量!
- 在指令列模式也可以给予变数。
-
环境变量CFLAGS
gcc编译时会自动去读取这个变量的内容;--可以再bash环境里,编译命令行中,makefile文件内指定;
优先顺序:
- make 指令列后面加上的环境变数为优先;
- makefile 里面指定的环境变数第二;
- shell 原本具有的环境变数第三。
-
函数库管理
基本上都放在/lib64 ,/lib目录中
静态/动态函数库
静态:libXXX.a --在编译时会直接整合在源文件中,所以体积较大
动态: libxxx.so-- 只是在源文件中存放一个指针,使用时才会去读取函数库;{
虽然无法独立运行,但升级函数库时不用重新编译源文件;
}
优先加载入内存中
流程:
- 首先,我们必须要在 /etc/ld.so.conf 里面写下『 想要读入快取内存当中的动态函式库所在的目录』
- 接下来则是利用 ldconfig 这个执行程序 将 /etc/ld.so.conf 的数据读入内存当中;
- 同时也将资料记录一份在 /etc/ld.so.cache 这个档案当中呐!
-
[root@study ~]# ldconfig [-f conf] [ -C cache]
[root@study ~]# 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
用来查看 依赖函数库之间的相关性
[root@study ~]# ldd [-vdr] [filename]
选项与参数:
-v :列出所有内容资讯;
-d :重新将资料有遗失的 link 点秀出来!
-r :将 ELF 有关的错误内容秀出来!
校验软件源代码的正确性
源代码可能遭遇修改,有风险;
可以利用MD5, SHA1 或 SHA256 加密机制来处理,获得一个唯一计算码,比较两次码值,若不一样则表示被修改过;
[root@study ~]# md5sum/sha1sum/sha256sum [-bct] filename
[root@study ~]# md5sum/sha1sum/sha256sum [--status|--warn] --check filename
选项与参数:
-b :使用 binary 的读档方式,预设为 Windows/DOS 档案型态的读取方式;
-c :检验档案指纹;
-t :以文字型态来读取档案指纹。