一、动态库与可执行程序的关系
动态链接库(Dynamic Link Library,缩写为DLL)是一个可以被其它应用程序共享的程序模块,其中封装了一些可以被共享的例程和资源。Linux系统下,动态链接库文件的扩展名一般是so,静态链接是指把要调用的函数或者过程链接到可执行文件中,成为可执行文件的一部分。动态链接库在编译的时候并没有被编译进目标代码中,你的程序执行到相关函数时才调用该函数库里的相应函数。由于函数库没有被整合进你的程序,而是程序运行时动态的申请并调用,所以程序的运行环境中必须提供相应的库。如果程序在执行时,缺少相应的动态库,将会导致程序运行失败。
二、Linux系统和数据库软件集成动态库
1、Linux系统的动态库一般存储在/usr/lib 或/usr/lib64目录下(不同版本的Linux系统,位置稍微不同),通过变量LD_LIBRARY_PATH,指定动态库的存储路径,在可执行程序调用时,可以到指定的路径下去加载。如下图所示,Linux系统动态库:
2、数据库软件集成
在数据库安装软件的lib目录下,集成了数据库程序运行时所需的大部分动态库。
三、动态库访问变量配置
3.1 指定动态库加载路径
在系统数据库用户的宿主目录的.bashrc或.bash_profile文件配置LD_LIBRARY_PATH变量,指定动态库加载路径。
3.2 查看可执行程序的动态库调用
可以通过ldd工具查看可执行程序动态库调用信息。
四、动态库加载失败案例
4.1 专用机环境(中科方德)启动数据库缺少动态库
问题现象:
专用机环境,sys_ctl启动数据库,提示动态库不兼容。
如上图所示:在sys_ctl启动数据库时,出现动态库不兼容问题。
解决方法:
1) 查看sys_ctl工具调用动态库
如上图所示:libc.so.6的动态库从/lib64下调用,而报错信息中的libxml动态库从数据库自带的lib下调用,并且GLIBC版本不匹配。
2)修改libxml动态库的调用路径
如上图所示,从lib64目录下链接libxml动态库到数据库lib目录下后,启动数据库正常。
4.2 UOS系统下ksql应用缺少动态库”libtinfo.so.5“问题
适用版本: V8R3/R6 (UOS Server 20)
问题描述: ksql在应用时,提示”can not open shared object file:libtinfo.so.5”。
问题现象:
问题分析: 执行ldd -r ksql查看ksql缺少的动态库,find查找缺少的动态库。
问题解决:
UOS操作系统ksql找不到libtinfo.so.5文件,在/usr/lib/mips64el-linux-gnuabi64/libtinfo.so.6,在/usr/lib/mips64el-linux-gnuabi64/目录下做一个软链接就可以的。
执行:ln -s libtinfo.so.6 libtinfo.so.5,然后重启动应用程序。
五、总结
对于数据库可执行程序启动时,缺少动态库的问题,一般可以按照以下步骤解决:
1) 首先通过ldd命令查看可执行程序需要加载的动态库。
2) 检查LD_LIBRARY_PATH变量配置是否正确。
3) 通过find命令查找缺失的so动态库文件。
4) 建立查找到的动态库文件到数据库系统lib目录下的软链接。
5) 重新启动应用程序。
6) 如果不能找到缺失的动态库,需要安装相应的软件包。
参考文档:
《基于Linux系统的数据库软件安装指南》