`
jiagou
  • 浏览: 2589087 次
文章分类
社区版块
存档分类
最新评论

linux 共享库知识整理

 
阅读更多

csdn lidp http://blog.csdn.net/perfectpdl

1 创建和使用静态库

创建一个静态库是相当简单的。通常使用 ar 程序把一些目标文件(.o)组合在一起,
成为一个单独的库,然后运行 ranlib,以给库加入一些索引信息。

2 创建和使用共享库
特殊的编译和连接选项
-D_REENTRANT 使得预处理器符号 _REENTRANT 被定义,这个符号激活一些宏特性。
-fPIC 选项产生位置独立的代码。由于库是在运行的时候被调入,因此这个
选项是必需的,因为在编译的时候,装入内存的地址还不知道。如果
不使用这个选项,库文件可能不会正确运行。
-shared 选项告诉编译器产生共享库代码。
-Wl,-soname -Wl 告诉编译器将后面的参数传递到连接器。而 -soname 指定了
共享库的 soname。


# 可以把库文件拷贝到 /etc/ld.so.conf 中列举出的任何目录中,并以
root 身份运行 ldconfig;或者
# 运行 export LD_LIBRARY_PATH='pwd',它把当前路径加到库搜索路径中去。


3 使用高级共享库特性
1> ldd 工具
ldd 用来显示执行文件需要哪些共享库, 共享库装载管理器在哪里找到了需要的共享库.

2> soname

共享库的一个非常重要的,也是非常难的概念是 soname--简写共享目标名(short for shared object name)。这是一个为共享库(.so)文件而内嵌在控制数据中的名字。如前面提到的,每一个程序都有一个需要使用的库的清单。这个清单的内容是一系列库的 soname,如同 ldd 显示的那样,共享库装载器必须找到这个清单。

soname 的关键功能是它提供了兼容性的标准。当要升级系统中的一个库时,并且新库的 soname 和老的库的 soname 一样,用旧库连接生成的程序,使用新的库依然能正常运行。这个特性使得在 Linux 下,升级使用共享库的程序和定位错误变得十分容易。

在 Linux 中,应用程序通过使用 soname,来指定所希望库的版本。库作者也可以通过保留或者改变 soname 来声明,哪些版本是相互兼容的,这使得程序员摆脱了共享库版本冲突问题的困扰。

查看/usr/local/lib 目录,分析 MiniGUI 的共享库文件之间的关系

3> 共享库装载器

当程序被调用的时候,Linux 共享库装载器(也被称为动态连接器)也自动被调用。它的作用是保证程序所需要的所有适当版本的库都被调入内存。共享库装载器名字是 ld.so 或者是 ld-linux.so,这取决于 Linux libc 的版本,它必须使用一点外部交互,才能完成自己的工作。然而它接受在环境变量和配置文件中的配置信息。

文件 /etc/ld.so.conf 定义了标准系统库的路径。共享库装载器把它作为搜索路径。为了改变这个设置,必须以 root 身份运行 ldconfig 工具。这将更新 /etc/ls.so.cache 文件,这个文件其实是装载器内部使用的文件之一。

可以使用许多环境变量控制共享库装载器的操作(表1-4+)。

表 1-4+ 共享库装载器环境变量
变量 含义
LD_AOUT_LIBRARY_PATH 除了不使用 a.out 二进制格式外,与 LD_LIBRARY_PATH 相同。
LD_AOUT_PRELOAD 除了不使用 a.out 二进制格式外,与 LD_PRELOAD 相同。
LD_KEEPDIR 只适用于 a.out 库;忽略由它们指定的目录。
LD_LIBRARY_PATH 将其他目录加入库搜索路径。它的内容应该是由冒号
分隔的目录列表,与可执行文件的 PATH 变量具有相同的格式。
如果调用设置用户 ID 或者进程 ID 的程序,该变量被忽略。
LD_NOWARN 只适用于 a.out 库;当改变版本号是,发出警告信息。
LD_PRELOAD 首先装入用户定义的库,使得它们有机会覆盖或者重新定义标准库。
使用空格分开多个入口。对于设置用户 ID 或者进程 ID 的程序,
只有被标记过的库才被首先装入。在 /etc/ld.so.perload 中指定
了全局版本号,该文件不遵守这个限制。


4> 使用 dlopen

另外一个强大的库函数是 dlopen()。该函数将打开一个新库,并把它装入内存。该函数主要用来加载库中的符号,这些符号在编译的时候是不知道的。比如 Apache Web 服务器利用这个函数在运行过程中加载模块,这为它提供了额外的能力。一个配置文件控制了加载模块的过程。这种机制使得在系统中添加或者删除一个模块时,都不需要重新编译了。

可以在自己的程序中使用 dlopen()。dlopen() 在 dlfcn.h 中定义,并在 dl 库中实现。它需要两个参数:一个文件名和一个标志。文件名可以是我们学习过的库中的 soname。标志指明是否立刻计算库的依赖性。如果设置为 RTLD_NOW 的话,则立刻计算;如果设置的是 RTLD_LAZY,则在需要的时候才计算。另外,可以指定 RTLD_GLOBAL,它使得那些在以后才加载的库可以获得其中的符号。

当库被装入后,可以把 dlopen() 返回的句柄作为给 dlsym() 的第一个参数,以获得符号在库中的地址。使用这个地址,就可以获得库中特定函数的指针,并且调用装载库中的相应函数。

分享到:
评论

相关推荐

    linux内核锁基础知识整理

    ### Linux内核锁基础知识整理 #### 一、文档介绍 ##### 1) 文档目的 本文档旨在系统地介绍Linux内核中的各种锁机制,并通过详细的解析帮助读者更好地理解每种锁的工作原理及其应用场景。此外,还将对这些锁机制...

    LINUX环境高级编程整理

    综上所述,Linux环境高级编程涉及到广泛的知识点,涵盖文件系统操作、进程管理、高级IO以及错误和信号处理。深入理解和熟练运用这些概念,对于开发高效、可靠的系统级软件至关重要。通过不断实践和学习,你可以成为...

    linux知识整理

    以下是对“linux知识整理”这个主题的详细概述,涵盖了从基础到进阶的多个关键知识点。 首先,让我们从【自学linux第二章要点记录.doc】开始,这通常涉及Linux操作系统的基础概念。这可能包括Linux的起源、发行版的...

    Linux程序设计知识点整理.docx

    ### Linux程序设计知识点整理 #### 一、Linux命令 **1、文件操作** - **列出目录内容**: `ls`, `dir`, `vdir` - `ls`: 显示目录下的文件列表,默认按照字母顺序排列。 - `dir` 和 `vdir`: 也用于列出目录内容,...

    linux下C语言开发笔记整理

    Linux下C语言开发笔记整理涵盖了从基础知识到网络通信的多个方面,主要围绕在Unix/Linux系统环境下使用C语言进行软件开发的各项技术与理论。以下是从文件提供的信息中提炼的知识点。 ### Unix/Linux系统基本命令和...

    linux驱动工程师面试题整理

    根据给定文件的信息,我们可以提炼出以下详细的IT知识点: ### 1. 设备文件的创建方式 - **手动创建**:使用`...这些知识点涵盖了Linux驱动开发中的多个重要方面,对于Linux驱动工程师来说是非常实用且基础的内容。

    linux面试题 已整理过

    - **知识点**: vfat 文件系统是一种兼容MS-DOS的文件系统,支持长文件名,常用于Windows系统与Linux系统之间共享数据。 **37. 设定限制用户使用磁盘空间的命令是quota。** - **知识点**: `quota` 命令用于限制用户...

    测试一下你的linux知识

    根据提供的文件信息,我们可以整理出一系列与Linux相关的知识点,这些知识点涵盖了从基本操作到更深入的理解,对于初学者和有一定经验的用户来说都是很好的复习资料。 ### 一、填空题解析 #### 1. CD-ROM标准的...

    linux命令整理:磁盘管理

    例如,你可能需要挂载一个USB驱动器或者网络共享。`umount`则是卸载已挂载的文件系统,断开与它的连接。 `fdisk`是一个用于创建、修改和查看分区表的工具。你可以通过`fdisk -l`来列出所有可用的硬盘及其分区信息。...

    linux文件IO之整理笔记

    Linux 文件 IO 之整理笔记 本文总结了 Linux 文件 IO 的相关知识点,涵盖了文件 IO 的基本概念、文件描述符、open 函数、read 函数、write 函数、lseek 函数、close 函数等。 一、文件 IO 概念 文件 IO 是计算机...

    计算机三级Linux系统应用与开发教程-习题答案及知识点整理

    - Samba服务:实现Linux与Windows之间的文件共享。 - Web服务器:Apache或Nginx的配置与管理,包括虚拟主机、HTTPS等。 5. **编程环境与开发**: - C/C++编程:在Linux环境下编译、调试C/C++程序,使用gcc/g++等...

    大学Linux复习整理

    Linux是当今广泛使用的开源操作...对于学习Linux的学生而言,理解其内核工作原理、进程管理、文件系统以及图形化界面的运作方式,对于掌握系统级的知识和技能至关重要,也为未来在IT行业中的职业发展奠定了坚实的基础。

    linux-编程书籍的整理和收集

    本资源“linux-编程书籍的整理和收集”是一个专门针对Linux编程的学习资料集合,旨在帮助你在这个广阔的知识领域中找到方向,提升技能。以下是基于提供的信息,对Linux编程相关的知识点进行的详细阐述: 1. **Linux...

    全国计算机三级等级考试 Linux应用与开发技术 知识点整理.docx

    【全国计算机三级等级考试 Linux应用与开发技术】的知识点涵盖了计算机体系结构与操作系统的诸多方面。以下是这些知识点的详细说明: 1. **冯诺依曼体系结构**:这是计算机科学的基础,强调计算机采用二进制,程序...

    嵌入式linux vxworks面试题整理.docx

    涵盖了嵌入式系统、Linux内核、VxWorks实时操作系统、进程管理、线程同步、互斥锁、消息队列、管道、信号量、共享内存、文件系统、网络管理、DHCP、RIP协议、Samba服务器、进程管理、shell命令等方面的知识点。...

    生物信息学之玩转Linux教程.txt打包整理.zip

    【标题】"生物信息学之玩转Linux教程.txt打包整理.zip"揭示了这是一份针对生物信息学领域,专门讲解如何在Linux环境下进行工作和学习的教程。在生物信息学中,由于大量的数据分析和计算任务,Linux系统因其高效、...

    自己整理基础知识集锦

    【标题】:“自己整理基础知识集锦” 【描述】:“自行整理了web方面的开发 同时涉及到系统调优方面的技术资料” 【标签】:“jvm 性能优化 linux” 【部分内容】 这个知识集锦包含了Web开发和系统调优的基础...

    Linux 整理笔记

    这只是Linux庞大知识体系的一个简单介绍,实际操作和学习中,Linux还有更多复杂的命令、工具和配置,适用于服务器管理、网络服务、软件开发等多种场景。不断探索和学习Linux,将有助于提升IT技能并适应不断发展的...

    linux documnet的 按源码doc 整理

    参与这些社区,可以获取最新的开发信息,解决遇到的问题,并与全球的开发者共享知识。 总之,"Linux documnet的按源码doc整理"是一个系统性的工作,涉及源码阅读、文档生成、版本控制、编译调试等多个方面。通过...

Global site tag (gtag.js) - Google Analytics