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命令以立即生效,以确保新设置在当前终端或新打开的终端中可用。

阅读剩余
THE END