知识大全 Linux 动态函式库解析(一)

Posted 档案

篇首语:送饥者一条鱼,只管一天不饿;教他学会捕鱼,能使他永不受饿。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 Linux 动态函式库解析(一)相关的知识,希望对你有一定的参考价值。

Linux 动态函式库解析(一)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  摘要:使用动态函式库的好处有许多 首先 就是由于执行档主要呼叫的函式都包含于动态函式库中 所以档案所占的空间可以因而缩小 其次 当动态函式库的函式内容有所改变时 呼叫该动态函式库的程序 可以在最小修正甚至是不需重新编程的情况下 就可以叫用到新版本的函式库服务     前言       用 MS Windows 一段时间的读者 应该都听过动态函式库这个名词 在 Windows X/ME 或是 Windows NT/ 中 常见到的动态函式库为副档名 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 档支援了 bit 与 bit 的执行环境 其实 两者之间还有其它规格上的不同 有兴趣的读者也可以自行找一些相关的资料来比较即可了解       再来呢 我们就来讨论动态函式库的档案格式 我们都知道在 Linux中有 a out 与 ELF 两种档案的格式 其中目前我们最常见的便是 ELF 档案格式 在 Linux 的函式库目录中 我们常常可以见到 * so 的档案 例如: /lib/libc so 或是 /lib/ld linux so 这些便是在 Linux中所常见到的动态函式库档案 由下图我们可以看到动态函式库 libc so 的 ELF Header:     libc so 的 ELF Header   e_ident >EI_MAG : fh    >EI_MAG :E    >EI_MAG :L    >EI_MAG :F    >EI_CLASS: bit objects    >EI_DATA:ELFDATA LSB    >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: a h   e_phoff: h   e_shoff: bbf ch   e_flags: h   e_ehsize: h   e_phentsize: h   e_phnum: h   e_shentsize: h   e_shnum: h   e_shstrndx: dh       由图中 我们可以注意到 e_type: ET_DYN e_type 是在ELF 档案的格式中 用来描述目前该档的档案型态 我们所举的例子为 libc so 这个动态函式库的档案 所以 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:ELFDATA LSB    >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:bea h   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 档中对于执行档所定义的档案属性     cha138/Article/program/Oracle/201311/18141

相关参考