admin管理员组文章数量:1531764
2024年3月27日发(作者:)
Linux 动态库剖析
进程与 AP
级别: 中级
M. Tim Jones, 顾问工程师, Emulex Corp.
2008 年 9 月 08 日
动 态链接的共享库是 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/),如清单 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
版权声明:本文标题:Linux 动态库剖析 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/dongtai/1711552583a315542.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论