linux 库加载,linux动态库加载过程
大家好,今天来为大家分享linux 库加载的一些知识点,和linux动态库加载过程的问题解析,大家要是都明白,那么可以忽略,如果不太清楚的话可以看看本篇文章,相信很大概率可以解决您的问题,接下来我们就一起来看看吧!
如何让linux加载当前目录的动态库
linux加载当前目录的动态库的方法是:设置合适的环境变量LD_LIBRARY_PATH。\x0d\x0a设置方法有以下三种:\x0d\x0a\x0d\x0a1、临时修改,log out之后就失效\x0d\x0a在terminal中执行:export LD_LIBRARY_PATH=./\x0d\x0a\x0d\x0a2、让当前帐号以后都优先加载当前目录的动态库\x0d\x0a修改~/.bash_profile在文件末尾加上两行: LD_LIBRARY_PATH=./和 export LD_LIBRARY_PATH \x0d\x0a\x0d\x0a3、让所有帐号从此都优先加载当前目录的动态库\x0d\x0a修改/etc/profile在文件末尾加上两行: LD_LIBRARY_PATH=./和 export LD_LIBRARY_PATH
查看linux当前加载库文件的命令
ldd<可执行文件名>查看可执行文件链接了哪些系统动态链接库
nm<可执行文件名>查看可执行文件里面有哪些符号
strip<可执行文件名>去除符号表可以给可执行文件瘦身
如果我们想从可执行程序里面提取出来一点什么文本信息的话,还可以用strings命令
strings<可执行文件名>
Linux操作系统上面的动态共享库大致分为三类:
1、操作系统级别的共享库和基础的系统工具库
比方说libc.so, libz.so, libpthread.so等等,这些系统库会被放在/lib和/usr/lib目录下面,如果是64位操作系统,还会有/lib64和/usr/lib64目录。如果操作系统带有图形界面,那么还会有/usr/X11R6/lib目录,如果是64位操作系统,还有/usr/X11R6/lib64目录。此外还可能有其他特定Linux版本的系统库目录。
这些系统库文件的完整和版本的正确,确保了Linux上面各种程序能够正常的运行。
2、应用程序级别的系统共享库
并非操作系统自带,但是可能被很多应用程序所共享的库,一般会被放在/usr/local/lib和/usr/local/lib64这两个目录下面。很多你自行编译安装的程序都会在编译的时候自动把/usr/local/lib加入gcc的-L参数,而在运行的时候自动到/usr/local/lib下面去寻找共享库。
以上两类的动态共享库,应用程序会自动寻找到他们,并不需要你额外的设置和担心。这是为什么呢?因为以上这些目录默认就被加入到动态链接程序的搜索路径里面了。Linux的系统共享库搜索路径定义在/etc/ld.so.conf这个配置文件里面。这个文件的内容格式大致如下:
/usr/X11R6/lib64
/usr/X11R6/lib
/usr/local/lib
/lib64
/lib
/usr/lib64
/usr/lib
/usr/local/lib64
/usr/local/ImageMagick/lib
假设我们自己编译安装的ImageMagick图形库在/usr/local/ImageMagick目录下面,并且希望其他应用程序都可以使用 ImageMagick的动态共享库,那么我们只需要把/usr/local/ImageMagick/lib目录加入/etc/ld.so.conf文件里面,然后执行:ldconfig命令即可。
ldcofig将搜索以上所有的目录,为共享库建立一个缓存文件/etc/ld.so.cache。为了确认ldconfig已经搜索到ImageMagick的库,我们可以用上面介绍的strings命令从ld.so.cache里面抽取文本信息来检查一下:
strings/etc/ld.so.cache| grep ImageMagick
输出结果为:
/usr/local/ImageMagick/lib/libWand.so.10
/usr/local/ImageMagick/lib/libWand.so
/usr/local/ImageMagick/lib/libMagick.so.10
/usr/local/ImageMagick/lib/libMagick.so
/usr/local/ImageMagick/lib/libMagick++.so.10
/usr/local/ImageMagick/lib/libMagick++.so
已经成功了!
3、应用程序独享的动态共享库
有很多共享库只被特定的应用程序使用,那么就没有必要加入系统库路径,以免应用程序的共享库之间发生版本冲突。因此Linux还可以通过设置环境变量LD_LIBRARY_PATH来临时指定应用程序的共享库搜索路径,就像我们上面举的那个例子一样,我们可以在应用程序的启动脚本里面预先设置 LD_LIBRARY_PATH,指定本应用程序附加的共享库搜索路径,从而让应用程序找到它。
linux系统重so库加载环境变量设置方法
Linux环境配置,动态库,静态库,profile,bashrc,source,ldconfig
环境配置第一:export PATH
修改办法:export PATH=$PATH:/home/test/bin
生效操作:立即生效
生效期限:当前终端有效,窗口关闭后无效
生效范围:仅对当前用户有效
所属级别:用户级别
注意事项:不要忘了加上原来的配置,即$PATH部分,避免覆盖原来配置
第二:vim~/.bashrc
修改办法:修改~/.bashrc,在最后一行加上:export PATH=$PATH:/home/test/bin
生效操作:使用相同的用户打开新的终端时生效,或者手动source~/.bashrc生效
生效期限:永久有效
生效范围:仅对当前用户有效
所属级别:用户级别
注意事项:如果有后续的环境变量加载文件覆盖了PATH定义,则可能不生效
第三:vim~/.bash_profile
修改办法:修改~/.bash_profile,在最后一行加上:export PATH=$PATH:/home/test/bin
生效操作:使用相同的用户打开新的终端时生效,或者手动source~/.bash_profile生效
生效期限:永久有效
生效范围:仅对当前用户有效
所属级别:用户级别
注意事项:如果有后续的环境变量加载文件覆盖了PATH定义,则可能不生效
第四:vim/etc/bashrc
修改办法:修改/etc/bashrc,在最后一行加上:export PATH=$PATH:/home/test/bin
生效操作:新开终端生效,或者手动source/etc/bashrc生效
生效期限:永久有效
生效范围:对所有用户有效
所属级别:系统级别
注意事项:修改系统配置,需要管理员权限(如root)或者对该文件的写入权限
第五:vim/etc/profile
修改办法:修改/etc/profile,在最后一行加上:export PATH=$PATH:/home/test/bin
生效操作:新开终端生效,或者手动source/etc/profile生效
生效期限:永久有效
生效范围:对所有用户有效
所属级别:系统级别
注意事项:修改系统配置,需要管理员权限(如root)或者对该文件的写入权限
第六:vim/etc/environment
修改办法:修改/etc/environment,在最后一行加上:export PATH=$PATH:/home/test/bin
生效操作:新开终端生效,或者手动source/etc/environment生效
生效期限:永久有效
生效范围:对所有用户有效
所属级别:系统级别
注意事项:修改系统配置,需要管理员权限(如root)或者对该文件的写入权限
用户级别环境变量定义文件:~/.bashrc、~/.profile(部分系统为:~/.bash_profile)
系统级别环境变量定义文件:/etc/bashrc、/etc/profile(部分系统为:/etc/bash_profile)、/etc/environment
注意:更改系统环境配置后,需要执行source命令使其立即生效
加载原理分析:系统环境变量->用户自定义环境变量
Linux加载环境变量的顺序如下:
1,/etc/environment
2,/etc/profile(部分系统为:/etc/bash_profile)
3,/etc/bashrc
4,/etc/profile.d/xxx.sh
5,~/.profile(部分系统为:~/.bash_profile)
7,~/.bashrc
什么是/etc/profile.d/?
当用户登录Linux系统或使用su命令切换到另一个用户时,首先要确保执行的启动脚本就是/etc/profile。注意:只有Login shell启动时才会运行/etc/profile这个脚本,而Non-login shell不会调用这个脚本
在/etc/profile.d目录中存放的是一些应用程序所需的启动脚本,其中包括了颜色、语言、less、vim及which等命令的一些附加设置。这些脚本文件之所以能够被自动执行,是因为在/etc/profile中使用一个for循环语句来调用这些脚本,而这些脚本文件是用来设置一些变量和运行一些初始化过程的
也就是说,Login shell启动时会运行/etc/profile,/etc/profile再调用/etc/profile.d/的脚本进行设置
/etc/profile和/etc/profile.d区别?
1、两个文件都是设置环境变量文件的,/etc/profile是永久性的环境变量,是全局变量,/etc/profile.d/设置所有用户生效
2、/etc/profile.d/高度解耦,比/etc/profile好维护,不想要什么变量直接删除/etc/profile.d/下对应的脚本即可
3、/etc/profile和/etc/profile.d同样是登录(login)级别的变量,当用户重新登录shell时会触发,所以效果一致
如何配置函数库路径?
为了将动态函数库载入内存(高速缓存),首先在/etc/ld.so.conf文件中列出动态函数库所在的目录,然后使用ldconfig命令将/etc/ld.so.conf中的数据载入高速缓存。
具体操作包括创建/编辑/etc/ld.so.conf.d/目录下的配置文件,添加函数库路径,执行ldconfig命令更新缓存。
如何修改ld.so.conf.d和/etc/profile.d的配置?
修改ld.so.conf.d和/etc/profile.d目录下的配置文件,可以动态添加、删除环境变量配置,方便管理而不影响系统整体配置。
在配置系统环境或函数库后,确保执行source命令以立即生效,以确保新设置在当前终端或新打开的终端中可用。