什么是最好的方式来寻找在Linux下的ELF共享库在C

问题描述:

我目前正在研究一个用户级的ELF文件加载器在C. LD_LIBRARY_PATH似乎不是我的选择,因为它似乎没有设置默认情况下在我的系统上(x86_64 openSUSE)。获取存储库的所有目录的最佳方式是什么?什么是最好的方式来寻找在Linux下的ELF共享库在C

+3

'man ldconfig'有你需要的所有答案 – myaut

+0

为什么你需要一个用户级的ELF文件加载器?你的问题太短,缺乏动力和背景。请**编辑您的问题**以改善它。 –

/usr/lib64/lib64为64位二进制或/usr/lib/lib为32位二进制文​​件,比从/etc/ld.so.conf采取的路径和包括CONFIGS

man ldconfig

ldconfig创建必要的链接和高速缓存在文件/etc/ld.so.conf和受信任的目录/lib/usr/lib(在命令行中指定的目录中找到的最新共享库在一些64位体系结构上,如x86-64,/lib/usr/lib是32位库的可信目录,而/lib64/usr/lib64用于64位库)。

缓存由运行时链接程序ld.so或ld-linux.so使用。

...包含目录,每行一个,在其中搜索库的列表

文件/etc/ld.so.conf。

请注意,此信息针对openSUSE,其他发行版可能使用不同的路径。

+0

其他发行版可以使用不同的目录来存储共享库,但机制是一样的......这些目录在'/etc/ld.so.conf'中列出。 –

LD_LIBRARY_PATH是标准环境变量,用于在用户无法或无法访问系统目录安装共享库时添加和加载自己的库。

有它通常由ldconfig在启动时读取一个文件(它读取/etc/ld.so.conf创建一个二进制DBMsomewhat文件/etc/ld.so.cache,利用哈希表来快速访问路径加载库共享对象时使用,而且所使用的动态加载器(作为一个内核工具,只有一个这样的东西,所以它不依赖于你运行的是哪个发行版,而仅仅依赖于你使用的内核版本---它有所改变,但不像内核那样多---)

要知道哪个sonames(soname是共享对象用于引用接口的通用名称,这是保证共享对象将需要的接口l条与磁带库兼容)正在使用的动态加载器,只需运行

ldconfig -p 

,你会得到所有的sonames注册,并且路径库实际加载该SONAME。

如果你想知道哪些图书馆将通过动态加载某些特定的可执行文件被加载,只是执行此:

ldd your_executable 

,它将打印sonames该可执行文件的需求并在系统中的他们位于。

ldconfig(8)做什么,是搜索人包括在文件/etc/ld.so.conf共享目标文件的目录,并期待所有的名字存储在文件中的soname匹配的,并包括对命名为SONAME文件的引用找到。表完成后,/etc/ld.so.cache文件被创建并由/lib64/ld-linux-x86-64.so.2使用,该文件是负责用户模式加载程序使用的其余共享库的共享模块。

有在具有本地$HOME/lib目录来存储你的本地开发的共享库,没有问题,但由于该目录将无法正常纳入/etc/ld.so.conf,你需要创建LD_LIBRARY_PATH=${HOME}/lib和小心出口吗,和永远不要尝试将其作为root用户使用,对于root用户,env变量被禁用。

编辑1

顺便说一句,如果你需要按需加载共享库(这可能是你所需要的,可能),了解dlopen(3)和朋友的功能,因为这是最常用的方法在编译主程序之前动态加载你没有听说过的模块的程序。您需要加载模块,查找需要的符号(dlsym(3)dlfunc(3)),以存储模块给出的引用,最后调用它们。