有关linux库函数

    前次系统升级,出现一些意想不到的问题,烦恼了我很久,系统升级之后重启,然后提示各种找到以.so结尾的文件,后来查询得知,是因为linux系统升级后,函数库没有更新,造成很多服务启动出错。为了以后不再出现这样的问题特对linux函数库作点分析:linux库函数分为静态库和动态库两种。

1. 静态函数库  

    这类库的名字一般是libxxx.a;利用静态函数库编译成的文件比较大,因为整个 函数库的所有数据都会被整合进目标代码中,他的优点就显而易见了,即编译后的执行程序不需要外部的函数库支持,因为所有使用的函数都已经被编译进去了。当然这也会成为他的缺点,因为如果静态函数库改变了,那么你的程序必须重新编译。  

2. 动态函数库  

    这类库的名字一般是libxxx.so;相对于静态函数库,动态函数库在编译的时候 并没有被编译进目标代码中,你的程序执行到相关函数时才调用该函数库里的相应函数,因此动态函数库所产生的可执行文件比较小。由于函数库没有被整合进你的程序,而是程序运行时动态的申请并调用,所以程序的运行环境中必须提供相应的库。动态函数库的改变并不影响你的程序,所以动态函数库的升级比较方便。 
linux系统有几个重要的目录存放相应的函数库,如/lib /usr/lib。

3.动态库加载过程

 

    将动态函数库加载到高速缓存的过程如下:

  • 首先,要在/etc/ld.so.conf中写下“想要读入高速缓存中的动态函数库所在的目录”,注意是目录而不是文件

  • 利用ldconf执行文件将/etc/ld.so.conf的数据读入高速缓存中

  • 同时在/etc/ld.so.cache文件中记录数据
    下面我们已mysql为例,做个示范
    #vi /etc/ld.so.conf
    include ld.so.conf.d/*.conf
    /usr/lib/mysq

4.查看ELF文件依赖的库

ldd不要对不信任的ELF文件用,因为它隐含了对某些环境变量的改变。

ldd demo_use:查看可执行文件demo_use依赖的库。

ldd libhello.so:查看库libhello.so依赖的库。

 

5.动态函数库更新

    这个才是我开头提到的问题的解决方案,因为升级后要重新指定库的连接,所以函数库是比较麻烦的。我们知道,升级函数库时必须使用新的版本的。但是我们对共享库进行操作的时候就要特别小心了。绝不能简单地将新文件拷到一个目录下,然后删除旧的文件(我之前就是这样做的,在困惑中待了很长时间)。因为有可能旧的函数库正在为某个程序所使用。我们必须保证每个程序都能够正确地找到动态库。简单的将,当我们将新版本的动态库文件放到指定目录下以后,使用ln命令来完成:

ln �Csf /usr/lib/libdb.so.new("new"指新的版本号) /usr/lib/libdb.so.old("old"是原有的文件) ;

比如:/usr/lib/libdb.so.2原来指向的文件是/usr/llib/libdb.so.2.0.1,现在有一个新文件 /usr/lib/libdb.so.2.78.1,我们可以这样处理:ln �Csf /usr/lib/libdb.so.2.78.1 /usr/lib/libdb.so.2 ;

然后,我们才能将/usr/lib/libdb.so.2.0.1文件进行删除。

(完)

 


 

 

 

你可能感兴趣的:(linux,动态库,运行环境,系统升级)