什么是开放源码、 编译器与可执行档? - 源代码与 Tarball 套件管理员 - lin...

来源:百度文库 编辑:神马文学网 时间:2024/04/28 02:15:00
什么是开放源码、 编译器与可执行档?   前言

  如果鸟哥想要在我的 Linux 伺服器上面跑网页伺服器( WWW server )这项服务,那么我应该要做些什么事呢?呵呵!当然就一定需要‘ 安装网页伺服器的套件’啰! 如果鸟哥的伺服器上面没有这个套件的话,那当然也就无法启用 WWW 的服务啦!所以啦,想要在您的 Linux 上面进行一些有的没的功能,学会‘如何安装套件’是很重要的一个课题!

  咦!安装套件有什么难的?在 Windows 作业系统上面安装套件时,不是只要一直给他按 ‘下一步’就可以安装妥当了吗?话是这样说没错啦,不过,也由于如此,所以在 Windows 系统上面的软体都是一模一样的,也就是说,您‘ 无法修改该软体的原始程式码’,因此, 万一您想要增加或者减少该软体的某些功能时,呵呵!大概只能求助于当初发行该软体套件的厂商了!

  或许你会说:‘唉呦!我不过是一般人,不会用到多余的功能,所以不太可能会更动到程式码的部分吧!?’ 如果您这么想的话,很抱歉~是有问题的!怎么说呢? 像目前网路上面的病毒、黑客软体、臭虫程式等等,都可能对您的主机上面的某些软体造成影响 (这是因为软体开发者在写作之初可能并没有想到某些问题所致!) ,导致主机的当机或者是其他资料损毁等等的伤害。如果您可以藉由安全资讯单位所提供的修订方式进行修改, 那么您将可以很快速的自行修补好该软体的漏洞,而不必一定要等到套件开发商提供修补的程式包哩!要知道, 提早补洞是很重要的一件事。

  这样说可以瞭解 Linux 的优点了吗?!没错!因为 Linux 上面的套件几乎都是经过 GPL 的授权,所以每个套件几乎均提供原始程式码, 并且您可以自行修改该程式码,以符合您个人的需求呢!很棒吧!这就是开放源码( Open source )的优点啰!不过,到底什么是开放源码?这些程式码是什么咚咚?又 Linux 上面可以执行的相关套件档案与开放源码之间是如何转换的?不同版本的 Linux 之间能不能使用同一个执行档?或者是该执行档需要由原始程式码的部分重新进行转换? 这些都是需要釐清观念的。底下我们先就原始程式码与可执行档来进行说明。

  什么是开放源码、 编译器与可执行档?

  在讨论程式码是什么之前,我们先来谈论一下什么是可执行档?我们说过,在 Linux 系统上面,一个档案能不能被执行看的是有没有可执行的那个权限( 具有 x permission ),不过,Linux 系统上真正认识的可执行档其实是二进位档案( binary file ),例如 /usr/bin/passwd, /bin/touch 这些个档案即为 binary 的可执行档案!

  或许您会说,咦! shell scripts 不是也可以执行吗?!其实 shell scripts 只是利用 shell ( 例如 bash )这支程式的功能进行一些判断式,而最终执行的除了 bash 提供的功能外,仍是呼叫一些已经编译好的 binary 档案来执行的呢!( bash 本身就是 binary file 喔!) 那么我怎么知道一个档案是否为 binary 呢?!还记得我们在 Linux 档案与目录管理 里面提到的 file 这个指令的功能吗?!对啦!用他就是了!我们现在来测试一下:

  # 先以系统的档案测试看看:
  [root@linux ~]# 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 呢?
  [root@linux ~]# 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 啰。整个的流程有点像这样:


  图一、简易的 gcc 编译流程

  事实上,在编译的过程当中,还会产生所谓的目标档( Object file ),这些档案是以 *.o 的副档名样式存在的!至于 C 语言的原始码档案通常以 *.c 作为副档名。此外,有的时候,我们会在程式当中‘引用、呼叫’ 其他的外部副程式,或者是利用其他套件提供的‘函数功能’, 这个时候,我们就必须要在编译的过程当中,将该函式库给他加进去,如此一来, 编译器就可以将所有的程式码与函式库作一个连结( Link )以产生正确的执行档啰。