Linux——函式库管理

xiaoxiao2025-09-24  317

在Linux操作系统中,函式库是一个很重要的项目,很多软件之间都会互相取用彼此提供的函式库来进行特殊功能的运作

1、动态与静态函式库

<1>静态函式库的特色

· 扩展名:(扩展名为 .a) 这类的函式库通常扩展名为 libxxx.a 的类型; · 编译行为: 这类函式库在编译的时候会直接整合到执行程序当中,所以利用静态函式库编译成的文件会比较大一些喔; · 独立执行的状态: 这类函式库最大的优点,就是编译成功的可执行文件可以独立执行,而不需要再向外部要求读取函式库的 内容 (请参照动态函式库的说明)。 · 升级难易度: 虽然执行档可以独立执行,但因为函式库是直接整合到执行档中, 因此若函式库升级时,整个执行档必须 要重新编译才能将新版的函式库整合到程序当中。 也就是说,在升级方面,只要函式库升级了,所有将此 函式库纳入的程序都需要重新编译!

<2>动态函式库的特色

· 扩展名:(扩展名为 .so)这类函式库通常扩展名为 libxxx.so 的类型; · 编译行为:动态函式库与静态函式库的编译行为差异挺大的。 与静态函式库被整个捉到程序中不同的,动态函式库在编译的时候,在程序里面只有一个『指向 (Pointer)』的位置而已。也就是说,动态函式库的内容并没有被整合到执行档当中,而是当执行档要使用到函式库的机制时, 程序才会去读取函式库来使用。由于执行文件当中仅具有指向动态函式库所在的指标而已, 并不包含函式库的内容,所以他的文件会比较小一点。 · 独立执行的状态:这类型的函式库所编译出来的程序不能被独立执行, 因为当我们使用到函式库的机制时,程序才会去读取 函式库,所以函式库文件『必须要存在』才行,而且,函式库的『所在目录也不能改变』,因为我们的可执行文件里面仅有『指标』亦即当要取用该动态函式库时, 程序会主动去某个路径下读取,呵呵!所以动态函式库可不能随意移动或删除,会影响很多相依的程序软件喔! · 升级难易度:虽然这类型的执行档无法独立运作,然而由于是具有指向的功能, 所以,当函式库升级后,执行档根本不需要进行重新编译的行为,因为执行档会直接指向新的函式库文件 (前提是函式库新旧版本的档名相同喔!)。

目前的 Linux distribution 比较倾向于使用动态函式库,因为如同上面提到的最重要的一点, 就是函式库的升级方便!由于 Linux 系统里面的软件相依性太复杂了,如果使用太多的静态函式库,那么升级某一个函式库时, 都会对整个系统造成很大的冲击!因为其他相依的执行档也要同时重新编译啊! 这个时候动态函式库可就有用多了,因为只要动态函式库升级就好,其他的软件根本无须变动。那么这些函式库放置在哪里呢?绝大多数的函式库都放置在:/lib64, /lib 目录下! 此外,Linux 系统里面很多的函式库其实 kernel 就提供了,那么 kernel 的函式库放在哪里?呵呵!就是在 /lib/modules 里面啦!里面的数据可多着呢!不过要注意的是, 不同版本的核心提供的函式库差异性是挺大的,所以 kernel 2.4.xx 版本的系统不要想将核心换成 2.6.xx 喔! 很容易由于函式库的不同而导致很多原本可以执行的软件无法顺利运作呢!

2、ldconfig与/etc/ld.so.conf

目前的Linux大多是将函式库做成动态函式库。如果我们将常用的动态函式库先加载到内存中,当软件调用函式库是,就不需要从头由硬盘里面读出。

将动态函式库加载到告诉缓存中:

(1)首先,我们必须要在 /etc/ld.so.conf 里面写下『 想要读入高速缓存当中的动态函式库所在的目录』,注意, 是目录而不是文件; (2)接下来则是利用 ldconfig 这个执行档将 /etc/ld.so.conf 的资料读入快取当中; (3)同时也将数据记录一份在 /etc/ld.so.cache 这个文件当中吶! 事实上, ldconfig 还可以用来判断动态函式库的链接信息。假设妳想要将目前你系统下的 mariadb 函式库加入到快取当中时

[root@study ~]# ldconfig [-f conf] [ -C cache] [root@study ~]# ldconfig [-p] 选项与参数: -f conf :那个 conf 指的是某个文件名,也就是说,使用 conf 作为 libarary  函式库的取得路径,而不以 /etc/ld.so.conf 为默认值 -C cache:那个 cache 指的是某个文件名,也就是说,使用 cache 作为快取暂存  的函式库资料,而不以 /etc/ld.so.cache 为默认值 -p :列出目前有的所有函式库资料内容 (在 /etc/ld.so.cache 内的资料!) 范例一:假设我的 Mariadb 数据库函式库在 /usr/lib64/mysql 当中,如何读进 cache ? [root@study ~]# vim /etc/ld.so.conf.d/vbird.conf /usr/lib64/mysql <==这一行新增的啦! [root@study ~]# ldconfig <==画面上不会显示任何的信息,不要太紧张!正常的! [root@study ~]# ldconfig -p 924 libs found in cache `/etc/ld.so.cache'  p11-kit-trust.so (libc6,x86-64) => /lib64/p11-kit-trust.so  libzapojit-0.0.so.0 (libc6,x86-64) => /lib64/libzapojit-0.0.so.0 ....(底下省略).... # 函式库名称 => 该函式库实际路径

 

透过上面的动作,我们可以将 Mariadb 的相关函式库给他读入快取当中,这样可以加快函式库读取的效率呢! 在某些时候,你可能会自行加入某些 Tarball 安装的动态函式库,而你想要让这些动态函式库的相关连结可以被读入到快取当中, 这个时候你可以将动态函式库所在的目录名称写入/etc/ld.so.conf.d/yourfile.conf 当中,然后执行 ldconfig 就可以啦! 3、程序的动态函式库解析: ldd 如何判断某个可执行的 binary 文件含有什么动态函式库呢?很简单,利用 ldd 就可以!例如我想要知道 /usr/bin/passwd 这个程序含有的动态函式库有哪些,可以这样做:

[root@study ~]# ldd [-vdr] [filename] 选项与参数: -v :列出所有内容信息; -d :重新将资料有遗失的 link 点秀出来! -r :将 ELF 有关的错误内容秀出来! 范例一:找出 /usr/bin/passwd 这个文件的函式库数据 [root@study ~]# ldd /usr/bin/passwd ....(前面省略)....  libpam.so.0 => /lib64/libpam.so.0 (0x00007f5e683dd000) <==PAM 模块  libpam_misc.so.0 => /lib64/libpam_misc.so.0 (0x00007f5e681d8000)  libaudit.so.1 => /lib64/libaudit.so.1 (0x00007f5e67fb1000) <==SELinux  libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f5e67d8c000) <==SELinux ....(底下省略).... # 我们前言的部分不是一直提到 passwd 有使用到 pam 的模块吗!怎么知道? # 利用 ldd 察看一下这个文件,看到 libpam.so 了吧?这就是 pam 提供的函式库 范例二:找出 /lib64/libc.so.6 这个函式的相关其他函式库! [root@study ~]# ldd -v /lib64/libc.so.6  /lib64/ld-linux-x86-64.so.2 (0x00007f7acc68f000)  linux-vdso.so.1 => (0x00007fffa975b000)  Version information: <==使用 -v 选项,增加显示其他版本信息!  /lib64/libc.so.6:  ld-linux-x86-64.so.2 (GLIBC_2.3) => /lib64/ld-linux-x86-64.so.2  ld-linux-x86-64.so.2 (GLIBC_PRIVATE) => /lib64/ld-linux-x86-64.so.2

 

转载请注明原文地址: https://www.6miu.com/read-5036809.html

最新回复(0)