快速业务通道

Linux 操作系统动态库剖析

作者 佚名技术 来源 Linux系统 浏览 发布时间 2012-05-09

动态链接的共享库是 GNU/Linux? 的一个重要方面.该种库允许可执行文件在运行时动态访问外部函数,从而(通过在需要时才会引入函数的方式)减少它们对内存的总体占用.本文研究了创建和使用静态库的过程,详细描述了开发它们的各种工具,并揭秘了这些库的工作方式.

库用于将相似函数打包在一个单元中.然后这些单元就可为其他开发人员所共享,并因此有了模块化编程这种说法 — 即,从模块中构建程序.Linux 支持两种类型的库,每一种库都有各自的优缺点.静态库包含在编译时静态绑定到一个程序的函数.动态库则不同,它是在加载应用程序时被加载的,它与应用程序是在运行时绑定的.图 1 展示了 Linux 中的库的层次结构.

图 1. Linux 中的库层次结构

使用共享库的方法有两种:您既可以在运行时动态链接库,也可以动态加载库并在程序控制之下使用它们.本文对这两种方法都做了探讨.

静态库较适宜于较小的应用程序,它们只需要最小限度的函数.而对于需要多个库的应用程序来说,则适合使用共享库,它们可以减少应用程序对内存(包括运行时中的磁盘占用和内存占用)的占用.这是多个应用程序可以同时使用一个共享库;因此,每次只需要在内存上复制一个库.要是静态库的话,每一个运行的程序都要有一份库的副本.

GNU/Linux 提供两种处理共享库的方法(每种方法都源于 Sun Solaris).您可以动态地将程序和共享库链接并让 Linux 在执行时加载库(如果它已经在内存中了,则无需再加载).另外一种方法是使用一个称为动态加载的过程,这样程序可以有选择地调用库中的函数.使用动态加载过程,程序可以先加载一个特定的库(已加载则不必),然后调用该库中的某一特定函数(图 2 展示了这两种方法).这是构建支持插件的应用程序的一个普遍的方法.我稍候将在本文探讨并示范该应用程序编程接口(API).

图 2. 静态链接与动态链接

用 Linux 进行动态链接

现在,让我们深入探讨一下使用 Linux 中的动态链接的共享库的过程.当用户启动一个应用程序时,它们正在调用一个可执行和链接格式(Executable and Linking Format,ELF)映像.内核将 ELF 映像加载到用户空间虚拟内存中.然后内核会注意到一个称为 .interp 的 ELF 部分,它指明了将要被使用的动态链接器(/lib/ld-linux.so),如清单 1 所示.这与 UNIX? 中的脚本文件的解释器定义(#!/bin/sh)很相似:只是用在了不同的上下文中.

清单 1. 使用 readelf 来显示程序标题

mtj@camus:~/dl$ readelf -l dl

Elf file type is EXEC (Executable file)
Entry point 0x8048618
There are 7 program headers, starting at offset 52

Program Headers:
Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
PHDR 0x000034 0x08048034 0x08048034 0x000e0 0x000e0 R E 0x4
INTERP 0x000114 0x08048114 0x08048114 0x00013 0x00013 R 0x1
[Requesting program interpreter: /lib/ld-linux.so.2]
LOAD 0x000000 0x08048000 0x08048000 0x00958 0x00958 R E 0x1000
LOAD 0x000958 0x08049958 0x08049958 0x00120 0x00128 RW 0x1000
DYNAMIC 0x00096c 0x0804996c 0x0804996c 0x000d0 0x000d0 RW 0x4
NOTE 0x000128 0x08048128 0x08048128 0x00020 0x00020 R 0x4
GNU_STACK 0x000000 0x00000000 0x00000000 0x00000 0x00000 RW 0x4

...

mtj@camus:~dl$

注意,ld-linux.so 本身就是一个 ELF 共享库,但它是静态编译的并且不具备共享库依赖项.当需要动态链接时,内核会引导动态链接(ELF 解释器),该链接会初始化自身,然后加载指定的共享对象(已加载则不必).接着它会执行

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号