`

第8章 Linux共享库的组织

 
阅读更多

       从文件结构上讲,共享库(shared library)和共享文件没有什么区别,Linux下的共享库就是普通的ELF共享对象。

 

一、共享库的版本

      1. 共享库版本命名:libname.so.x.y.z

                                   lib 固定前缀;

                                   name 库的名字;

                                   .so 固定后缀;

                                   x 主版本号 表示重大升级,不同主版本号的库之间不兼容;

                                   y 次版本号 库的增量升级,即增加一些新的接口符号,且保持原来的符号不变。在主版本号不变的情况下,高的次版本号的库向后兼容低的此版本号的库。

                                   z 发布版本号 库的一些错误的修正、性能的改进等,并不添加任何新的接口,也不对接口进行更改。相同主版本号、次版本号的共享库,不同的发布版本号之间完全兼容。

 

       2. SO-NAME: 每个共享库都有一个对应的SO-NAME,这个SO-NAME即共享库的文件名去掉次版本号和发布版本号,保留主版本号。例如,共享库libfoo.so.2.6.1的SO-NAME是libfoo.so.2 。 在Linux系统中系统会为每个共享库在它所在的目录创建一个跟SO-NAME相同的并且指向它的软链接(Symbol Link)。

           为什么搞一个SO-NAME呢: 实际上SO-NAME这个软链接会指向目录中主版本号相同、次版本号和发布版本号最新的共享库。文件A的.dynamic段中会有DT_NEED类型的字段,字段的值是它所依赖的所有文件(共享库)的SO-NAME。当共享库进行升级时,如果只是进行增量升级,即保持主版本号不变,只改变次版本号或发布版本号,那么我们可以直接将新版的共享库替换掉旧版,并且修改SO-NAME的软链接指向新版本共享库,即可实现升级;当共享库的主版本号升级时,系统就会存在多个SO-NAME,由于这些SO-NAME并不相同,所以已有的程序并不受影响。     总之,SO-NAME是用来管理共享库依赖关系的。



 

 

二、符号版本

 

三、共享库系统路径

       目前大多数包括Linux在内的开源操作系统都遵守一个叫 FHS (File Hierarchy Standard)的标准,这个标准规定了一个系统中的系统文件应该如何存放。FHS规定,一个系统中主要有3个存放共享库的位置:

      /lib  系统最关键和基础的共享库(如动态链接器、C语言运行库、数学库等);

      /usr/lib  非系统运行时所需要的关键性的共享库,主要是开发时用到的共享库(用户程序或shell一般不用);

      /usr/local/lib  主要是第三方应用程序的库。

 

四、共享库查找顺序

       动态链接器查找某个动态链接模块A所依赖的模块(保存在A的.dynamic段的DT_NEED字段里)。

       1. 如果DT_NEED里面保存的是绝对路径,那么动态链接器就按照这个路径去查找;

       2. 如果DT_NEED里面保存的是相对路径,则按照下面的顺序查找:

              2.1. 由环境变量LD_LIBRARY_PATH指定的路径

              2.2. 由路径缓存文件/etc/ld.so.cache指定的路径

              2.3. 默认共享目录/usr/lib

              2.4. 默认共享目录/lib

 

五、环境变量

       LD_LIBRARY_PATH  可以临时改变应用程序的共享库查找路径,而不会影响系统中的其他程序;

       LD_DEBUG  打开动态链接器的调试功能,动态链接器在运行时打印出各种有用信息

$LD_DEBUG=files ./HelloWorld.out

 

六、共享库的创建和安装

 

创建

$gcc -shared -fPIC -W1, -soname, libfoo.so.1 -o libfoo.so.1.0.0 \
  libfoo1.c libfoo2.c \
  -lbar1 -lbar2

 -shared  输出为共享类型;

-fPIC  使用地址无关代码;

-W1  将指定参数传递给链接器(-soname, libfoo.so.1 指定输出共享库so-name);

-lbar1 -lbar2  生成的这个共享库依赖于libbar1.so和libbar2.so两个共享库。

 

安装

$su root
$ldconfig -n shared_library_directory

-n  仅扫描命令行指定的目录,不扫描默认目录/usr/lib和/lib,也不扫描配置文件/etc/ld.so.conf所列的目录。

 

  • 大小: 6.6 KB
分享到:
评论

相关推荐

    LINUX操作系统(电子教案,参考答案)

    第8章:进程管理。本章主要介绍了在Linux中的进程管理。其中包括了进程、进程数、进程的优先级、定时执行等。 第9章:C编译器—— gcc。本章主要介绍了Linux下面的编译器—— gcc的基本用法以及Make与Makefile的一些...

    第四章 LINUX 进程与线程

    8. **进程通信**:虽然在这个描述中没有直接提到,但在实际的多进程环境中,进程间通信(IPC)是必不可少的,Linux提供了管道、套接字、共享内存等多种方式来实现进程间的协作和数据交换。 9. **线程**:虽然标题...

    深入理解linux内核中文第三版-第9章

    第九章“进程地址空间”是理解操作系统核心功能的重要篇章,它涵盖了进程如何在内存中组织和管理其虚拟地址空间的关键概念。在此章节中,作者详细介绍了以下关键知识点: 1. **虚拟内存**:Linux内核采用虚拟内存...

    第5章嵌入式Linux开发环境的搭建.ppt

    8. **熟悉内核相关代码的分布**:理解Linux内核代码的组织结构有助于更高效地进行内核定制和调试,包括设备驱动、系统调用、内存管理、进程调度等多个方面的代码分布。 9. **Bootloader原理**:Bootloader是系统...

    Linux Programming(高级编程)_第三版

    8. **内存管理**:Linux编程中的内存管理包括动态内存分配、内存映射、共享内存等,理解这些可以帮助开发者有效利用系统资源,避免内存泄漏。 9. **程序调试与性能分析**:书中也会介绍GDB调试工具的使用,以及如何...

    深入理解linux内核(Understanding the linux kernel)-part1

    第七章-进程地址空间:本章聚焦于进程的虚拟地址空间,涉及了段页式内存模型、动态加载和链接、内存映射、共享库等内容,阐述了Linux如何为每个进程创建独立的地址空间。 第八章-系统调用:系统调用是用户程序与...

    Linux操作系统复习题库

    5. 权限“drw-r--r--”表示一个目录(因为第一个字符是'd'),其八进制数值表示为644,意味着所有者有读写权限,同组用户和其他用户只有读权限。 6. 前台启动的进程可以用Ctrl+C组合键来终止。 7. 安装Linux系统时...

    第6章、文件IO编程_linux_

    本章“第6章、文件IO编程”深入探讨了这一关键主题,旨在帮助嵌入式Linux应用程序开发人员理解和掌握高效、安全的文件操作技巧。以下是关于Linux文件I/O编程的详细讲解。 一、文件系统基础 在Linux中,一切皆为文件...

    深入理解linux内核中文第三版-第7章

    以上只是《深入理解Linux内核》第7章“进程调度”部分的一些基本知识点,实际内容可能还包括更多细节,如调度算法的具体实现、调度器的参数调整、以及与内存管理、I/O子系统等其他模块的交互。通过深入学习这一章,...

    嵌入式Linux应用程序开发标准教程

    第8章《进程间通信》介绍了Linux下的进程同步与通信机制,如信号量、消息队列、共享内存等,这是在多任务环境下实现高效协作的关键。 第9章《多线程编程》深入探讨了线程的概念、创建与管理,以及线程同步和互斥锁...

    linux内核讲解

    8. **第八章:内核模块** - 内核模块加载与卸载:讲解如何编写和管理内核模块,以及insmod、rmmod命令的使用。 - 模块编译与调试:介绍如何构建内核模块,并使用kgdb等工具进行内核调试。 9. **第九章:安全与...

    Professional Linux Kernel Architecture

    #### 八、虚拟文件系统(第8章) 虚拟文件系统(VFS)是Linux内核中处理文件系统请求的统一接口。本章深入探讨了VFS的架构设计和工作原理,包括文件操作函数集、目录遍历、文件打开和关闭等基本操作的实现机制。此外...

    Linux内核设计的艺术

    4. 内存管理:Linux内核负责管理物理和虚拟内存,包括内存的分配、回收、共享、映射等,确保系统运行稳定。 5. 文件系统:Linux支持多种文件系统,如ext4、XFS、Btrfs等。文件系统的设计对于数据的组织、访问和存储...

    Learning Debian GNU/Linux

    **第8章:使用 Linux 应用程序和客户端** 本章介绍了一系列常用的 Linux 应用程序和客户端软件,如办公套件、Web 浏览器、电子邮件客户端、多媒体播放器等。通过对这些工具的了解,用户可以充分利用 Linux 来完成...

    RED HAT LINUX 6大全

    第8章 FTP 135 8.1 获取和安装FTP服务程序 135 8.2 FTP服务器的工作方式 137 8.3 配置FTP服务器 138 8.3.1 控制访问权—/etc/ftpaccess 文件 138 8.3.2 在传输时转换文件—/etc/ftpcon- versions文件 147 8.3.3 ...

    清华大学Linux操作系统原理与应用

    第8章 文件系统 165 8.1 Linux文件系统基础 165 8.1.1 Linux文件结构 165 8.1.2 Linux文件系统 166 8.1.3 文件类型 167 8.1.4 文件访问权限 168 8.2 虚拟文件系统 168 8.2.1 虚拟文件系统的引入 168 8.2.2 VFS中的...

    Linux网络编程.pdf

    Linux系统采用多用户、多任务的操作模式,其基本结构包括内核、shell、系统调用、库和应用程序等部分。内核负责管理硬件资源和进程调度,shell作为用户与内核之间的接口,提供命令解释功能。 #### 知识点7:进程...

Global site tag (gtag.js) - Google Analytics