在C

时间:2017-10-08 21:56:35

标签: linux elf

我目前正在使用C语言中的userland ELF文件加载器。LD_LIBRARY_PATH似乎不适合我,因为它似乎默认设置在我的系统上(x86_64 openSUSE)。获取存储库的所有目录的最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

64位二进制文​​件的

/usr/lib64/lib64或32位二进制文​​件的/usr/lib/lib,而不是从/etc/ld.so.conf获取的路径和包含的配置< / p>

来自man ldconfig

  

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

     

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

...

  

/etc/ld.so.conf包含目录列表的文件,每行一个,用于搜索库。

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

答案 1 :(得分:1)

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

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

要知道哪个sonames( soname 是共享对象用来引用接口的通用名称,这是保证共享对象与库兼容所需的)由动态加载器使用,只需运行

ldconfig -p

并且您将获得所有已注册的sonames,并且实际为该soname加载了库的路径。

如果您想知道动态加载器将由某些特定可执行文件加载哪些库,只需执行以下命令:

ldd your_executable

并且它将打印可执行文件需要的名字以及它们所在系统的位置。

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中,因此您需要创建dlopen(3)并且要小心将其导出,并且永远不要尝试将其用作root用户,对于root用户来说,env变量已被禁用。

编辑1

顺便说一句,如果你需要按需加载一个共享库(这可能是你需要的),请阅读dlsym(3)和友元函数,因为这是大多数程序动态使用的方法在编译主程序之前加载您没有听说过的模块。您需要加载模块,查找所需的符号(dlfunc(3)或{{1}})存储模块给出的引用,最后调用它们。