【php精品源码栏目提醒】:文章导读:在新的一年中,各位网友都进入紧张的学习或是工作阶段。
网学会员整理了php精品源码-【精品】0520source_code_and_tarball - 其它资料的相关内容供大家参考,祝大家在新的一年里工作和学习顺利!
鸟哥的 Linux 私房菜 -- 原始码与 Tarball 套件管员 Page 1 of 21 鸟哥的 Linux 私房菜 为取得较佳浏览结果,请爱用 firefox 浏览本网页 原始码与 Tarball 套件管员 换解析为 800x600 最近新日期:2005/10/01 我们在 Linux 是麼 一文当中,提到 GNU 与 GPL 还有开放
源码等咚咚,过,前面都还没有提到真正的开放
源码是 麼的讯息!在这一章当中,我们将藉由 Linux 作业系统面的执档,解麼是可执的程式,以及了解麼是 编译器。
另外,与程式息息相关的函式库 library 的资讯也需要了解一番!过, 在这个章节当中,鸟哥并是要您成 为一个开放
源码的程式设计师, 而是希望您可以了解如何将开放
源码的程式设计、加入函式库的原、透过编译而成为 可以执 的 binary file ,最后该执档可被我们所使用的一过程! 了解上面的咚咚有麼好处呢?!因为在 Linux 的世界面,我们常常需要自安装套件在自己的 Linux 系统上面,所以 如果您有简单的程式编译概,那麼将很容进套件的安装, 甚至在发生套件编译过程中的错误时,您也可以自作 一些简的修订呢!而最传统的套件安装过程, 自然就是由原始码编译而的罗!所以,在这我们将介绍最原始的套 件管方式:使用 Tarball 安装与升级管我们的套件喔! 1. 前言: 1.1 麼是开放
源码、编译器与可执档? 1.2 麼是函式库? 1.3 麼是 make 与 configure ? 1.4 麼是 Tarball 的套件? 1.5 如何安装与升级套件? 2. 一个简单的范: 2.1 印出 Hello World 2.2 副程式的编译 2.3 加入结的函式库 2.4 gcc 的用法 3. make 的简用法: 3.1 为麼要用 make ? 3.2 make 的基本语法与变 4. Tarball 的管与建议: 4.1 使用原始码管套件所需要的基础套件 4.2 Tarball 安装的基本步骤 4.3 一般 Tarball 套件安装的建议事项 如何移除?升级? 4.4 一个简单的范、用 ntp 示范 4.5 用 patch 新原始码 5. 函式库管: 5.1 动态与静态函式库 5.2 ldconfig 与 /etc/ld.so.conf ldd 6. 检验套件软体的正确性: 6.1 md5sum 7. 重点回顾 8. 考资源 9. 课后习 10. 针对本文的建议:http://phorum.vbird.org/viewtopic.phpt23892 前言 如果鸟哥想要在我的 Linux 伺服器上面跑网页伺服器 WWW server 这项服务,那麼我应该要做些麼事 呢?呵呵!当然就一定需要『 安装网页伺服器的套件』罗! 如果鸟哥的伺服器上面没有这个套件的话, 那当然也就无法启用 WWW 的服务啦!所以啦,想要在您的 Linux 上面进一些有的没的功能,学会 『如何安装套件』是很重要的一个课题!http://linux.vbird.org/linux_basic/0520source_code_and_tarball.
php 18/4/2009鸟哥的 Linux 私房菜 -- 原始码与 Tarball 套件管员 Page 2 of 21 咦!安装套件有麼难的?在 Windows 作业系统上面安装套件时,是只要一直给他按 『下一步』就可 以安装妥当吗?话是这样没错啦,过,也由於如此,所以在 Windows 系统上面的软体都是一模一 样的,也就是,您『 无法修改该软体的原始程式码』,因此, 万一您想要增加或者减少该软体的某些 功能时,呵呵!大概只能求助於当初发该软体套件的厂商! 或许你会:『唉呦!我过是一般人,会用到多余的功能,所以太可能会动到程式码的部分 吧!?』 如果您这麼想的话,很抱歉~是有问题的!怎麼呢? 像目前网上面的病毒、黑客软体、臭 虫程式等等,都可能对您的主机上面的某些软体造成影响 这是因为软体开发者在写作之初可能并没有想 到某些
问题所致! ,导致主机的当机或者是其他资损毁等等的伤害。
如果您可以藉由安全资讯单位所 提供的修订方式进修改, 那麼您将可以很快速的自修补好该软体的,而必一定要等到套件开 发商提供修补的程式包哩!要知道, 提早补是很重要的一件事。
这样可以了解 Linux 的优点吗?!没错!因为 Linux 上面的套件几乎都是经过 GPL 的授权,所以每个 套件几乎均提供原始程式码, 并且您可以自修改该程式码,以符合您个人的需求呢!很棒吧!这就是 开放
源码 Open source 的优点罗!过,到底麼是开放
源码?这些程式码是麼咚咚?又 Linux 上面可 以执的相关套件档案与开放
源码之间是如何转换的?同版本的 Linux 之间能能使用同一个执档? 或者是该执档需要由原始程式码的部分重新进转换? 这些都是需要厘清观的。
底下我们先就原始 程式码与可执档进明。
麼是开放
源码、 编译器与可执档? 在讨程式码是麼之前,我们先谈一下麼是可执档?我们过,在 Linux 系统上面,一个 档案能能被执看的是有没有可执的那个权限 具有 x per
mission ,过,Linux 系统上真正认 的可执档其实是二进位档案 binary file ,如 /usr/bin/passwd /bin/touch 这些个档案即为 binary 的可 执档案! 或许您会,咦! shell scripts 是也可以执吗?!其实 shell scripts 只是用 shell 如 bash 这支 程式的功能进一些判断式,而最终执的除 bash 提供的功能外,仍是呼叫一些已经编译好的 binary 档案执的呢! bash 本身就是 binary file 喔! 那麼我怎麼知道一个档案是否为 binary 呢?! 还记得我们在 Linux 档案与目管 面提到的 file 这个指的功能吗?!对啦!用他就是!我们 现在测试一下: 先以系统的档案测试看看: rootlinux file /bin/bash /bin/bash: ELF 32-bit LSB executable Intel 80386 version 1 SYSV for GNU/Linux 2.2.5 dynamically linked uses shared libs stripped 如果是系统提供的 /etc/init.d/syslog 呢? rootlinux file /etc/init.d/syslog /etc/init.d/syslog: Bourne-Again shell script text executable 看到吧!如果是 binary file 而且是可以执的时候,他就会显示执档别 ELF 32-bit LSB executable ,同时会明是否使用动态函式库 shared libs ,而如果是一般的 script ,那他就会显示出 text executables 之的字样! Tips: 事实上,syslog 的资显示出 Bourne-Again ... 那一,是因为您的 scripts 上面第一 有宣告 /bin/bash 的缘故,如果您将 script 的第一拿掉,呵呵!那麼 管 /etc/init.d/syslog 的权限为何,他其实显示的是 ASCII 文字档的资讯喔! 既然 Linux 作业系统真正认的其实是 binary file ,那麼我们是如何做出这样的一支 binary 的程式 呢?!首先,我们必须要写程式,用麼东西写程式?就是一般的文书处器啊!我都喜欢使用 vi 进程式的撰写,写完的程式就是所谓的原始程式码罗! 这个程式码档案其实就是一般的纯文字 档 text file 。
在完成这个原始码档案的编写之后,再就是要将这个档案『 编译』成为作业系统看 的懂得 binary file 罗!而要编译自然就需要『编译器』动作, 经过编译器的编译之后,就会产生一 支可以执的 binary file 罗。
举个子,在 Linux 上面最标准的程式语言为 C ,所以我使用 C 的语法进原始程式码的书写, 写完之后,以 Linux 上标准的 C 语言编译器 gcc 这支程式编译,就可以制作一支可以执的 binary file 罗。
整个的程有点像这样:http://linux.vbird.org/linux_basic/0520source_code_and_tarball.
php 18/4/2009鸟哥的 Linux 私房菜 -- 原始码与 Tarball 套件管员 Page 3 of 21 图一、简的 gcc 编译程 事实上,在编译的过程当中,还会产生所谓的目标档 Object file ,这些档案是以 .o 的副档名样式存 在的!至於 C 语言的原始码档案通常以 .c 作为副档名。
此外,有的时候,我们会在程式当中『引 用、呼叫』 其他的外部副程式,或者是用其他套件提供的『函功能』, 这个时候,我们就必须 要在编译的过程当中,将该函式库给他加进去,如此一, 编译器就可以将所有的程式码与函式库 作一个结 Link 以产生正确的执档罗。
麼是函式库? 在前一小节的图一示意图中,在编译的过程面有提到函式库。
好啦, 那麼麼是函式库呢?先举 个子,我们的 Linux
系统上,系统通常已经提供一个可以进身份验证的模组,称为 PAM , 这个 PAM 提供的功能可以让很多的程式在被执的时候,除可以验证使用者登入的资讯外, 还可 以将身份确认的资记在登档 log file 请查阅后续的 认登档 一文 面,以方系统管员 的追踪! 既然有这麼好用的功能,那如果我要编写具有身份认证功能的程式时, 直接引用该 PAM 的功能就好 啦,如此一,我就需要重新
设计认证机制罗!也就是, 只要在我写的程式码面,设定去呼 叫 PAM 的函式功能,呵呵!我的程式就可以用 Linux 原本就有的身份认证的程序咯!除此之外, 其实我们的 Linux 核心 kernel 也提供相当多的函式库给硬体开发者用喔。
函式库又分为动态与静态函式库,这个咚咚的分别我们在后面的章节再加以明。
这我们以一 个简单的程图,示意一支有呼叫外部函式库的程式的执情况。
图二、程式引用函式库的示意图 很简单的示意图啊!_!而如果要在程式面加入引用的函式库,就需要如图一所示, 亦即在编译 的过程当中,就需要加入函式库的相关设定罗。
事实上, Linux 的核心提供很多的核心相关函式库与外部, 这些核心功能在设计硬体的驱动程式 的时候是相当有用的资讯,这些核心相关资讯大多放置在 /usr/include /lib /usr/lib 面哩!我们在本章 的后续小节再探讨。
麼是 make 与 configure ? 事实上,使用似 gcc 的编译器进编译的过程并简单, 因为除每个主程式与副程式均需要写http://linux.vbird.org/linux_basic/0520source_code_and_tarball.
php 18/4/2009鸟哥的 Linux 私房菜 -- 原始码与 Tarball 套件管员 Page 4 of 21 上一笔编译过程的指外,还需要写上最终的结
程序。
程式码小的时候还好,如果是似 WWW 伺服器软体 如 Apache ,或者是似核心的原始码,动则百 MBytes 的资,呵呵!指会写 到疯掉~这个时候,我们就可以使用 make 这个指的相关功能进编译过程的指简化! 当执 make 时,make 会在当时的目下搜寻 Makefile or makefile 这个文字档,而 Makefile 面则 记原始码如何编译的详细资讯! make 会自动的判别原始码是否经过变动,而自动新执 档,是软体工程师相当好用的一个辅助工具呢! 咦!make 是一支程式,会去找 Makefile ,那 Makefile 怎麼写?呵呵! 通常软体开发商都会写一支侦 测程式侦测使用者的
作业环境, 以及该作业环境是否有软体开发商所需要的其他功能,该侦测程 式侦测完毕后,就会主动的建这个 Makefile 的规则档案啦!通常这支侦测程式的档名为 configure 或 者是 config 。
咦!?那为麼要侦测作业环境呢?!在 麼是 Linux 那个章节当中, 是有提到 Linux 过就是一 个核心吗?!是这样没错啦!但是您必须要了解的是, 某些软体套件需要一些相关的套件辅助,并 且,某些驱动程式则是适用在同的核心系统 因为核心提供的函式库可能并相同,如 kernel 2.4.xx 与 kernel 2.6.xx 就太一样! ,并且每个 Linux distribution 所提供的函式库名称与径可能也 太一样,所以,在 Fedora Core 4 上面可以执的一个 binary file ,直接复制到 SuSE 平台上,可 得可以顺执 事实上,是太可能可以执啦!_ 。
所以啦,原始码写出之后,需要针对 同的作业环境进编译的为呐!这个时候就很需要 configure 以及 make 的功能啊! 详细的 make 用法与 Makefile 规则,在后续的小节面再探讨罗! 麼是 Tarball 的套件 ? 从前面几个小节的明看,我们知道所谓的原始程式码,其实就是一些写满程式码的纯文字档 案。
那我们从前面的 档案的压缩与打包 章节当中,也了解纯文字档其实是很费硬碟空间的一种 档案格式! 想一想,一个核心的原始码档案大约要 200300 MB 以上,如果每个人都去下载这样的一 个核心档案, 呵呵!那麼网频宽被吃的死翘翘才怪呢! 所以啦,如果能够将这些原始码透过档 案的打包与压缩技术将档案的与容减小, 但让使用者容下载,套件开发商的网站频宽 也能够节很多很多啊!这就是 Tarball 档案的由罗! 所谓的 Tarball 档案,其实就是将套件的所有原始码档案先以 tar 打包,然后再以压缩技术
压缩,通 常最常的就是以 gzip 压缩。
因为用 tar 与 gzip 的功能,所以 tarball 档案一般的副档名就会 写成 .tar.gz 或者是简写为 .tgz 罗!也就是, Tarball 套件解压缩之后,面的档案通常就会有: 原始程式码档案; 侦测程式档案 可能是 configure 或 config 等档名 ; 本套件的简明与安装明 INSTALL 或 README 。
其中最重要的是那个 INSTALL 或者是 README 这个档案,通常您只要能够考这个档案,呵 呵! Tarball 套件的安装是很简单的啦!我们在后面的章节会再继续介绍 Tarball 这个玩意儿。
如何安装与升级套件 将原始码作一个简单的介绍,也知道系统其实认的可执档是 binary file 之后,好,得要聊 一聊,那麼怎麼安装与升级一个 Tarball 的套件?为麼要安装一个新的套件呢?当然是因为我们的 主机上面没有该套件罗!那麼, 为何要升级呢?!原因可能有底下这些: 需要新的功能,但旧有主机的旧版套件并没有,所以需要升级到新版的套件; 旧版本的套件上面可能有安全上的顾虑,所以需要新到新版的套件; 旧版的套件执效能彰,或者执的能能让管者满足。
在上面的需求当中,尤其需要注意的是第二点,当一个套件有安全上的顾虑时,千万要怀疑, 赶 紧新套件吧!否则造成网危机,那可是闹著玩的!那麼新的方法有哪些呢? 基本上新的 方法可以分为大,分别是: 直接以原始码透过编译安装与升级; 直接以编译好的 binary file 安装与升级。
上面第一点很简单,就是直接以 Tarball 在自己的机器上面进侦测、编译、 安装与设定等等动作http://linux.vbird.org/linux_basic/0520source_code_and_tarball.
php 18/4/2009鸟哥的 Linux 私房菜 -- 原始码与 Tarball 套件管员 Page 5 of 21 升级就是。
过,这样的动作虽然让使用者在安装过程当中具有很高的弹性, 但毕竟是比较麻烦 一点,如果 Linux distribution 厂商能够针对自己的作业平台先进编译等过程,再将编译好的 binary file 释出的话,那由於我的系统与该 Linux distribution 的环境是相同的,所以他所释出的 binary file 就 可以在我的机器上面直接安装啦!侦测与编译等等繁杂的过程呢! 目前很多 binary file 升级的机制呢,包括有 Red Hat 系统 含 Fedora 系 发展的 RPM 与 up2date yum 等线上新模式;Mandrake 的 urpmi 套件新方式; Debian 使用的 dpkg ; Sun Unix 使用的 pkg ,以 及目前很的 apt 线上新模式等等, 以使用,目前最传统的是以 Tarball 直接进编译的安 装与升级,而另一个则是以 RPM 相关的机制进安装与升级罗!本章节主要针对 Tarball ,至於 RPM 则待下个章节再介绍呢! 好,那麼一个套件的 Tarball 是如何安装的呢?基本程是这样的啦: 1. 将 Tarball 由厂商的网页下载下; 2. 将 Tarball 解开,产生很多的原始码档案; 3. 开始以 gcc 进原始码的编译 会产生目标档 object files ; 4. 然后以 gcc 进函式库、主、副程式的结,以形成主要的 binary file; 5. 将上述的 binary file 以及相关的设定档安装至自己的主机上面。
上面第 3 4 步骤当中,我们可以透过 make 这个指的功能简化他, 所以整个步骤其实是很简单的 啦!只过您就得需要至少有 gcc 以及 make 这个套件在您的 Linux 系统面才喔! 详细的过程 以及需要的套件我们在后面的章节继续介绍的啦! 一个简单的范: 经过上面的介绍之后,您应该比较清楚的知道原始码、编译器、函式库与执档之间的相关性。
过,详细的程可能还是很清楚,所以,在这我们以一个简单的程式范明整个编译的过程 喔!赶紧进入 Linux 系统,实地的操作一下底下的范呢! 印出 Hello World 我们以 Linux 上面最常的 C 语言撰写第一支程式!第一支程式最常作的就是..... 在萤幕上面印出 『Hello World!』的字样~当然, 这我们是以简单的 C 语言撰写,如果您对於 C 有兴趣的话, 那麼请自购买相关的书籍喔! _好,罗唆,刻编辑第一支程式吧! 请先确认您的 Linux 系统面已经安装 gcc 喔!如果尚未安装 gcc 的话,请先考下一节的 RPM 安装法,先安装好 gcc 之后,再回阅本章 1. 先编辑原始码: root
linux vi hello.c lt注意一下, C 语言用 .c 的副档名 include ltstdio.hgt int mainvoid printfquotHello Worldnquot 上面是 C 语言的语法,那个第一的 并是注解喔!如果您担心 输入错误,请到底下的结下载这个档案: http://linux.vbird.org/linux_basic/0520source/hello.c 2. 开始将原始码编译成为可执的 binary file : rootlinux gcc hello.c 这个时候,在本目下会产生一个名为 a.out 的执档! 在预设的态下,如果我们直接以 gcc 编译原始码,并且没有加上 任何,则 执档的档名会被自动设定为 a.out 这个档案名称! 3. 执一下这个档案: rootlinux ./a.out Hello World lt呵呵!成果出现! 好,上面的子很简单吧!那个 hello.c 就是原始码,而 gcc 就是编译器,至於 a.out 就是编译成功 的可执 binary file 罗!咦!如果我想要产生目标档 object file 进其他的动作 在较大的套件当 中, 就需要使用多个目标档进相关的结,而且执档的档名也要用预设的 a.out ,那该如何 是好?可以将上面的第 2 个步骤改成这样:http://linux.vbird.org/linux_basic/0520source_code_and_tarball.
php 18/4/2009鸟哥的 Linux 私房菜 -- 原始码与 Tarball 套件管员 Page 6 of 21 rootlinux gcc -c hello.c 会产生一个名为 hello.o 的目标档,object file 的副档名为 .o 喔! rootlinux gcc -o hello hello.o 这个步骤是用 hello.o 这个目标档制作出一个名为 hello 的执档 详细的 gcc 语法我们会在后续章节中继续介绍! 透过这个动作后,我们可以得到 hello 及 hello.o 个档案, 真正可以执的是 hello 这个 binary file 喔! 3. 执一下这个档案: rootlinux ./hello Hello World 或许您会觉得,咦!只要一个动作作出 a.out 就好,干嘛还要先制作目标档再做成执档呢?! 呵 呵!透过下个范,您就可以知道为麼啦! 副程式的编译 如果我们在一个主程式面又呼叫另一个副程式呢!?这是很常的一个程式写法, 因为可以简 化整个程式的性!在底下的子当中,我们以 thanks.c 这个主程式去呼叫 thanks_2.c 这个副程 式,写法很简单: 1. 先编辑原始码 thanks.c 与 thanks_2.c: rootlinux vi thanks.