2.开始编译与测试执行
# gcc hello.c
# ll hello.c a.out
----此时会产生a.out(如果没有加上任何参数,则执行档被自动设定为a.out)这个文件
# ./a.out
----执行
# gcc -c hello.c
----目标文件以源码文件名命名
# ll hello*
----查看编译执行情况
# gcc -o hello hello.o
----将目标文件进一步包装成为可执行文件,命名为hello
# ./hello
2.2主、子程序的编译
注意:如果更新了某个部分主需要再单独重新编译,然后重新包装成可执行文件
范例一:
1.编写主子程序
# vim thanks.c
# include<stdio.h>
int main(void)
{
printf(Hello world\n");
thanks_20();
----呼叫子程序
}
# vim thanks_2.c
# include <stdio.h>
void thanks_2(void)
{
printf("Thank you \n");
}
2.将原始码便已成为可执行文件
# gcc -c thanks.c thanks_2.c
# ll thanks*
----查看编译结果
# gcc -o thanks thanks.o thanks_2.o
----封装成可执行文件
# ll thanks*
----最终产生thanks这个可执行文件
3.执行这个可执行文件
# ./thanks
案例二:gcc更丰富的功能
# gcc -O -c thanks.c thanks_2.c
-----O为产生优化的参数
# gcc -Wall -c thanks.c thanks_2.c
---- -Wall会产生更详细的的编译过程信息
2.3呼叫外部函式库:加入连结的函式库
案例三:计算出sin(3.14),计算机使用弧度而不是角度
# vim sin.c
# include<stdio.h>
----/usr/include/,include默认去寻找的位置,可以编译时指定
int
main(void)
{
float value;
value=sin(3.14/2);
printf("%f\n",value);
}
# gcc
sin.c ----由于没有加入libm.so这个函式库,编译失败
# gcc sin.c -lm -L/lib -L/usr/bin
----编译时加入额外函式库连接的方式(在/lib和/usr/bin下寻找libm.so这个函式库)
#./a.out
----尝试执行新档案
案例四:自定义include的档案的位置
# gcc sin.c -lm -I/usr/include
2.4gcc的简易用法(编译、参数与链接)
# gcc -c hello.c
----会产生hello.o这个档案,但是并不会产生binary执行档
# gcc -O hello.c -c
----会自动产生hello.o这个档案,并根据作业环境给予优化执行速度
# gcc sin.c -lm -L/usr/lib -I/usr/include
---在binary file制作时,将连结的函式库和相关的路径填入
# gcc -o hello hello.c -Wall
----将编译的结果输出成某个档名,加入-Wall后编译会变得比较严谨
3. 用make进行宏编译【1-8】
3.1为什么要用make
案例一:展示不用make解决一个相对复杂的编辑过程【1-7】
1.先进性目标文件的编译,最终会有4个*.o的档名出现
# gcc -c main.c
# gcc -c haha.c
# gcc -c sin_value.c
# gcc -c cos_value.c
2.在进行连接成为执行档,并加入libm的数学函数,以产生main执行档
# gcc -o main main.o haha.o sin_value.o
cos_value.o -lm -L/usr/lib -L/lib
3.本程序的输出结果,必需输入姓名、360度角的角度值来计算
# ./main
案例二:用make完成案例一
1.先编辑makefile这个规则文件
# vim makefile
main:main.o haha.o sin_value.o
cos_value.o
----仅给出目标文件,make会自动寻找原始码文件进行编译
gcc
-o main.o haha.o sin_value.o cos_value.o -lm
----进行连结这一行最前面是一个【tab】
2.尝试使用makefile指定的规则完成编译
# rm -f main *.o
----将案例一编译完成的各种文件删除
# make ----
根据当前目录下的makefile编译成相关的档案
# make
----在不删除任何档案的情况下重新执行一次make,发现会对档案进行更新(主动判断哪一个原始码相对目标文件更新过并进行更新)
3.2makefile的基本语法变量【1-9】
target:目标文件1 目标文件2
【tab】gcc -o 欲建立的执行文件 目标文件1 目标文件2
案例一:在makefile中执行两个以上动作
1.在makefile中建立新的规则,此规则的标的(target)名称为clean
# vim makefile
main:main.o haha.o sin_value.o
cos_value.o
----仅给出目标文件,make会自动寻找原始码文件进行编译
gcc
-o main.o haha.o sin_value.o cos_value.o -lm
----进行连结这一行最前面是一个【tab】
clean:
rm -f main main.o haha.o sin_value.o
cos_value.o -lm
or(简化)【1-10,14】
LIBS=-lm
OBJS=main.o haha.o sin_value.o cos_value.o
CFLAGS=-Wall
main:${OBJS}
gcc -o $@ ${OBJS} ${LIBS}
clean:
rm -f ${OBJS}
2.测试clean这个标的
# make clean
3.先清除目标再编译
# make clean main
----先清除之前的所有编译好的东西,然后重新编译成可执行文件
4. Tarball的管理与建议
注意:原始码的好处在于实现理论上的跨平台
4.1使用原始码管理软件所需要的基础软件【1-11】
gcc或cc:编译器
make和autoconfig:简化编译的程序和辅助侦测建立makefie的软件
kernel提供的library及相关的include档案:kernel-source或kernel-header
一些然间集群:kernel source development或development
too;s
# yum groupinstall "Development Tools"
----安装gcc等软件开发工具
# yum groupinstall "x Software
Development"
# yum groupinstall "Legacy Software
Development" ----如果软件较旧安装这个
4.2Tarball安装的基本步骤【1-12】
1.解压缩到/usr/local/src
----释出的软件会被安装在/usr下,用户自行安装的软件建议安装在/usr/local,原始码在/usr/local/src下,man
page在/usr/local/man
2.安装
# ./configure
----检查系统、相关软件属性,产生安装信息,建立makefile
# make clean
----将可能存在的目标文件(*.o)清除掉,确保目标文件是在自己的系统上编译的
# make
----依据makefile的预设工作将原始码进行编译,并进一步连接成为可执行文件,这个可执行文件会被放置在当前目录下,尚未被安装到预定目录中
# make install
----将编译完成的东西安装到正确的路径
3.手动将这个软件的man page写入到/etc/man.config
# vim /etc/man.config
MANPATH /usr/local/software/man
----在40-50行左右
4.3一般Tarball软件安装的基本事项(移除升级)
4.3.1安装目录
1.系统默认(以apache为例)
/etc/httpd
----配置文件
/usr/lib
----函式库
/usr/bin
----执行档
/usr/share/bin
----联机帮助档
2.预设用tarball安装到/usr/local(难以管理)
/usr/local/etc
----配置文件
/usr/local/lib
----函式库
/usr/local/bin
----执行档
/usr/local/man
----联机帮助档
3.规定一个特定的目录(以apache为例)
/usr/local/apache/etc
----配置文件
/usr/local/apache/lib
----函式库
/usr/local/apache/bin
----执行档
/usr/local/apache/man
----联机帮助档
注:卸载时只需要# rm
-rf /usr/local/apache(参照makefile里面的install信息了解安装位置)
4.3.2安装规范(安装指导)【1-13】
4.4一个简单的范例、利用ntp来示范
注意:下载压缩包到/root,原始码解压到/usr/local/src,安装到/usr/local/ntp
1.下载到/root,并参阅README/INSTALL
2.解压缩下载的tarball,并参阅README/INSTALL档案
# cd /usr/local/src
----切换到这个目录
# tar -zxvf
/root/ntp-4.2.4p7.tar.gz
----解压缩到当前目录(会建立/usr/local/ntp-4.2.4p7)
#
cd ntp-4.2.4p7
# vim INSTALL
----特别是安装简介的部分,README也要看一看
3.检查configure支持参数,并实际建置makefile规则文件
# ./config --help | more
----查看可用的参数有哪些
# ./config
--prefix=/usr/local/ntp --enable-all-clocks --enable-parse-clocks
----指定安装路径,开始建置makefile
4.开始编译与安装
# make clean ;make
# make check
# make install
4.5利用patch更新原始码
注:
1.如果patch失败可以还原;
2.只有确实有对应新旧版本的patch
file的情况下才可以用patch来进行更新,如果版本相差很多可以下载连续释出的patch fil依序更新
# patch -R < ../main_0.1_to_0.2.patch
案例:测试旧版的功能,然后将旧版升级为新版
1.测试旧版的功能
# tar -zxvf main-0.1.tgz
----解压缩旧版的原始码和编译好的目标文件以及可执行文件
# cd main-0.1
----该目录下还有之前做好的makefile
# make clean main
----清除目标文件,并执行可执行文件(0.1版本的)
2.下载patch file并测试其内容
# vim ~/main_0.1_to_0.2.patch
----查看用来升级的patch文件
diff
-Naur main-0.1/cos_value.c main-0.2/cos_value.c
...
3.更新原始码,并且重新编译程序
# patch -p1 < ../main_0.1_to_0.2.patch
----
进行原始码更新的动作,main_0.1_to_0.2.patch中第一行中最后一个字串指定的路径: main-0.2/cos_value.c,-p1将其变为cos_value.c,因为我们要在当前目录(main-0.1)下进行更新,当前目录下就有cos_value.c
# make clean main
----删除目标文件和可执行文件并执行main这个target(利用原来的makefile重新编译成为执行程序)
# ./main
----执行下看看已经升级的程序
4.重新安装(/usr/local/bin)
# make install
----安装到/usr/local/bin,这个路径在PATH中
# make uninstall
----移除这个软件
5.函式库管理
5.1动态与静态函式库
1.静态函式库
扩展名:libxxx.a
编译行为:整合到执行程序当中(造成程序偏大)
独立执行的状态:独立
升级难易度:难(函式库升级的话,程序需要重新编译)
2.动态函式库(目前主流)
扩展名:libxxx.so
编译行为:编译时不整合到程序中,运行时动态读取函式库
独立执行状态:不独立
升级难易程度:易
5.2idconfig与/etc/ld.so.conf
ldconfig
将常用的动态函数库加载到内存的指令(还可以用来判断动态链接库的连接信息)【1-15】
/etc/ld.so.conf
默认记录想要读入内存的动态函式库所在的目录
/etc/ld.so.cache
默认缓存成这个文件
案例一:载入mysql的动态函式库(/usr/lib/mysql文件夹中)
# vim /etc/ld.so.conf
---- 设置想要缓存的都动态链接库
include
ld.so.conf.d/*.conf
/usr/lib/mysql ----新增这一行
# ldconfig
----加入到内存
# ldconfig -p
----查看/etc/ld.so.cache缓存文件中的动态链接库(函式库名称=》该函式库实际路径)
5.3程序的动态函式库解析:ldd
ldd 查看某个可执行文件的动态链接库【1-16】
案例一:找出/usr/bin/passwd这个档案的动态链接库
# ldd /usr/bin/passwd
----其中有libpam.so,这就是提供pam验证的动态链接库
案例二:找出/lib/libc.so.6这个函式的其它 相关函式库
# ldd -v /lib/libc.so.6
---- -v可以让我们获得额外的信息,比如这个函式库来自哪一个软件
6. 检验软件的正确性
6.1md5sum/sha1ssum【1-117,1-17】
7.重点回顾【1-18】
8.课后练习
情景模拟:对重要档案建立指纹码,并每日对比此重要工作
1.将/etc{passwd,shadow,group}以及系统上面所有的SUID/SGID档案建立档案列表
# ll /etc/{passwd.shadow,group} >
miportant.file
# find /bin /sbin /usr/bin -perm +6000
>> important.file
2.建立md5.checkfile.sh这个脚本来产生指纹码到finger1.file,并设定
# vim md5.checkfile.sh
#!/bin/bash
for filename in
$(cat important.file)
do
md5sum
$filename >> finger1.file
----将加密的字串放在finger1.file
done
# sh md5.checkfile.sh
----执行这个进行md5加密的脚本
# chattr +i finger1.file
3.执行完上面的脚本后继续完善脚本,除了能够建立finger1.file还可以通过一样的机制建立finger_ner.file,然后比较这两个档案,如果有变化发邮件警告root
# vim md5.checkfile.sh
#!/bin/bash
#1.$1(执行脚本时后面第一个指令参数)如果是new
if
[ "$1" == "new" ];then