摘要:使用动态函式库的好处有许多首先就是由于执行档主要呼叫的函式都包含于动态函式库中所以档案所占的空间可以因而缩小其次当动态函式库的函式内容有所改变时呼叫该动态函式库的程序可以在最小修正甚至是不需重新编程的情况下就可以叫用到新版本的函式库服务
前言
用 MS Windows 一段时间的读者应该都听过动态函式库这个名词在 Windows X/ME 或是 Windows NT/ 中常见到的动态函式库为副档名 DLL (Dynamic Loading Library)的档案
而在 Linux 中当然也有动态函式库的机制存在如此一来所撰写的程序便无需透过静态连结(Static Link)而可以在编程时透过动态连结(Dynamic Link)产生我们所要的执行档
使用动态函式库的好处有许多首先就是由于执行档主要呼叫的函式都包含于动态函式库中所以档案所占的空间可以因而缩小其次当动态函式库的函式内容有所改变时呼叫该动态函式库的程序可以在最小修正甚至是不需重新编程的情况下就可以叫用到新版本的函式库服务
对于发展 Embedded Linux 的业者来说能够尽可能减少应用程序执行环境所需空间的大小便可以把日后成品所需的 Flash 容量降到最低在整体成本以及所耗用的记忆体空间来说都可以得到许多的好处而在动态函式库来着手所得到的效益也是相当可观的尽可能的删去不必要的动态函式库以及针对动态函式库改写来缩小或是透过工具删去用不到的函式都可以带来许多的助益
当然棉动态函式库的好处还不只这些相信读者们在文章中可以发现其它的妙用的
档案格式(ELF VS Aout)
首先我们必须先确定目前所执行的 Linux Kernel 版本有开启 ELF 与 Aout 执行档案格式的支援(通常都会有)
Kernel support for aout binaries (CONFIG_BINFMT_AOUT) [M/n/y/?]
Kernel support for ELF binaries (CONFIG_BINFMT_ELF) [Y/m/n/?]
举个例子来说若要执行 aout 格式的执行档时我们必须确认 CONFIG_BINFMT_AOUT 为 Y也就是由 Kernel 直接支援 aout 档案格式或者 CONFIG_BINFMT_AOUT 为 M也就是不把 aout 的档案格式支援编入Kernel 中改以 Module 的形式存在一旦 Kernel 需要执行 aout 格式的程序时在动态的载入该 Module来启动具备执行 aout 执行档的能力不过aout 执行档的格式是 Unix 上使用了相当久的的档案格式ELF 是目前较新的的档案格式aout 档案格式共有三个 Section分别为text data 及 bss并还包括了一个文字表(String Table)与符号表(Symbol Table)与ELF 档案格式比较起来aout 相形之下显得较为缺乏弹性ELF档案格式允许多个节区的存在执行档可以根据需求提供应用程序执行环境的节区并且ELF 档支援了 bit 与 bit 的执行环境其实两者之间还有其它规格上的不同有兴趣的读者也可以自行找一些相关的资料来比较即可了解
再来呢我们就来讨论动态函式库的档案格式我们都知道在 Linux中有 aout 与 ELF 两种档案的格式其中目前我们最常见的便是 ELF 档案格式在 Linux 的函式库目录中我们常常可以见到 *so 的档案例如:/lib/libcso 或是 /lib/ldlinuxso这些便是在 Linux中所常见到的动态函式库档案由下图我们可以看到动态函式库 libcso 的 ELF Header:
libcso 的 ELF Header
e_ident >EI_MAG:fh
>EI_MAG:E
>EI_MAG:L
>EI_MAG:F
>EI_CLASS:bit objects
>EI_DATA:ELFDATALSB
>EI_VERSION:h
>EI_PAD:h
>EI_NIDENT:h
e_type: ET_DYN (Shared Obj File)
e_machine:Intel
e_version:Current version
e_entry:ah
e_phoff:h
e_shoff:bbfch
e_flags:h
e_ehsize:h
e_phentsize:h
e_phnum:h
e_shentsize:h
e_shnum:h
e_shstrndx:dh
由图中我们可以注意到 e_type: ET_DYNe_type 是在ELF 档案的格式中用来描述目前该档的档案型态我们所举的例子为 libcso 这个动态函式库的档案所以 e_type 的属性为 Shared Obj File
当然棉我们若再拿一个ELF执行档来比较也是不错的所以如下图
ls 的 ELF Header
e_ident >EI_MAG:fh
>EI_MAG:E
>EI_MAG:L
>EI_MAG:F
>EI_CLASS:bit objects
>EI_DATA:ELFDATALSB
>EI_VERSION:h
>EI_PAD:h
>EI_NIDENT:h
e_type: ET_EXEC (Executable file)
e_machine:Intel
e_version:Current version
e_entry:h
e_phoff:h
e_shoff:beah
e_flags:h
e_ehsize:h
e_phentsize:h
e_phnum:h
e_shentsize:h
e_shnum:ah
e_shstrndx:h
我们可以注意到 e_type: ET_EXEC这就是 ELF 档中对于执行档所定义的档案属性