Linux操作系统动态函式库探究

http://tech.ddvip.com   2007年03月08日    社区交流

本文详细介绍Linux操作系统动态函式库探究

  前言

  用 MS Windows 一段时间的读者,应该都听过动态函式库这个名词。在 Windows 9X/ME 或是 Windows NT/2000 中,常见到的动态函式库为副档名 “DLL” (Dynamic Loading Library)的档案。

  而在 Linux 中,当然也有动态函式库的机制存在。如此一来,所撰写的程序便无需透过静态连结(Static Link),而可以在编程时透过动态连结(Dynamic Link)产生我们所要的执行档。

  使用动态函式库的好处有许多。首先,就是由於执行档主要呼叫的函式都包含於动态函式库中,所以档案所占的空间可以因而缩小。其次,当动态函式库的函式内容有所改变时,呼叫该动态函式库的程序,可以在最小修正甚至是不需重新编程的情况下,就可以叫用到新版本的函式库服务。

  对於发展 Embedded Linux 的业者来说,能够尽可能减少应用程序执行环境所需空间的大小,便可以把日後成品所需的 Flash 容量降到最低,在整体成本以及所耗用的记忆体空间来说,都可以得到许多的好处,而在动态函式库来著手所得到的效益也是相当可观的,尽可能的删去不必要的动态函式库,以及针对动态函式库改写来缩小或是透过工具删去用不到的函式,都可以带来许多的助益。当然,动态函式库的好处还不只这些,相信读者们在文章中可以发现其它的妙用的。

  档案格式(ELF VS A.out)

  首先,我们必须先确定目前所执行的 Linux Kernel 版本有开启 ELF 与 A.out 执行档案格式的支援(通常都会有):

Kernel support for a.out binaries (CONFIG_BINFMT_AOUT) [M/n/y/?]
Kernel support for ELF binaries (CONFIG_BINFMT_ELF) [Y/m/n/?]

  举个例子来说,若要执行 a.out 格式的执行档时,我们必须确认 CONFIG_BINFMT_AOUT 为 Y,也就是由 Kernel 直接支援 a.out 档案格式,或者 CONFIG_BINFMT_AOUT 为 M,也就是不把 a.out 的档案格式支援编入 Kernel 中,改以 Module 的形式存在,一旦 Kernel 需要执行 a.out 格式的程序时,在动态的载入该 Module,来启动具备执行 a.out 执行档的能力。不过 a.out 执行档的格式,是 Unix 上使用了相当久的的档案格式,ELF 是目前较新的的档案格式。a.out 档案格式共有三个 Section,分别为.text, .data, 及 .bss,并还包括了一个文字表(String Table)与符号表(Symbol Table)。与ELF 档案格式比较起来,a.out 相形之下显得较为缺乏弹性,ELF档案格式允许多个节区的存在,执行档可以根据需求提供应用程序执行环境的节区,并且 ELF 档支援了 32-bit 与 64-bit 的执行环境。其实,两者之间还有其它规格上的不同,有兴趣的读者也可以自行找一些相关的资料来比较即可了解。

来源:linuxbyte    作者:hlchou    责编:豆豆技术应用

正在加载评论...