`

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

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

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

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

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

    Beginning Linux Programming(4rdEn).pdf

    ##### 第8章:MySQL (MySQL) MySQL是一种广泛使用的开源关系型数据库管理系统。本章将带领读者了解如何在Linux环境中安装、配置并使用MySQL数据库。包括基本的SQL语句、查询优化等知识点。 ##### 第9章:开发工具 ...

    嵌入式Linux应用程序开发详解 pdf 第五章

    ### 嵌入式Linux应用程序开发详解:第五章——嵌入式Linux开发环境的搭建 #### 一、章节概述 本章重点介绍了嵌入式Linux开发环境的搭建过程,为后续深入学习嵌入式Linux应用程序开发奠定了基础。通过本章的学习,...

    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 来完成...

    Linux程序设计[4ed,en]

    #### 九、第八章:MySQL 作为广泛使用的开源关系型数据库管理系统之一,MySQL在各种规模的应用项目中都扮演着重要角色。本章详细介绍了如何在Linux环境中安装、配置及使用MySQL进行数据库开发。 #### 十、第九章:...

Global site tag (gtag.js) - Google Analytics