首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在C语言linux下寻找ELF共享库的最佳方法是什么?

在C语言linux下寻找ELF共享库的最佳方法是什么?
EN

Stack Overflow用户
提问于 2017-10-08 21:56:35
回答 2查看 104关注 0票数 0

我目前正在使用C中的userland,LD_LIBRARY_PATH似乎不是我的一种选择,因为在我的系统(X86_64 openSUSE)上,它似乎没有默认设置。获得存储库的所有目录的最佳方法是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-10-08 22:04:23

/usr/lib64/lib64用于64位二进制文件,/usr/lib/lib用于32位二进制文件,而不是从/etc/ld.so.conf获取的包含信任的路径。

来自man ldconfig

ldconfig为命令行、文件/etc/ld.so.conf和受信任目录中指定的目录、/lib/usr/lib创建了必要的链接和缓存(在x86-64、/lib/usr/lib等64位体系结构上,/lib/usr/lib是32位库的受信任目录,/lib64/usr/lib64用于64位库)。 缓存由运行时链接器ld.so或d-linux.so使用。

..。

/etc/ld.so.conf文件,其中包含一个目录列表,每行一个,在其中搜索库。

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

票数 1
EN

Stack Overflow用户

发布于 2017-10-09 19:06:48

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

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

要知道动态加载程序正在使用哪些子名称(soname是共享对象引用接口所使用的公共名称,这是保证共享对象与库兼容所必需的),只需运行

代码语言:javascript
运行
复制
ldconfig -p

你就会注册所有的声子名,而通往图书馆的路径也会被加载。

如果您想知道动态加载程序将加载哪些库,只需执行以下命令:

代码语言:javascript
运行
复制
ldd your_executable

它将打印可执行文件所需的奏鸣曲以及它们在系统中的位置。

ldconfig(8)所做的就是在文件/etc/ld.so.conf中包含的目录中搜索共享对象文件,并查找其名称与存储在文件中的索纳名匹配的所有目录,并包含对文件名为soname的引用。表完成后,文件/etc/ld.so.cache/lib64/ld-linux-x86-64.so.2创建和使用,该共享模块负责加载程序使用的其余共享库的用户模式。

拥有一个本地$HOME/lib目录来存储本地开发的共享库没有问题,但由于该目录通常不会包含在/etc/ld.so.conf中,因此您需要创建LD_LIBRARY_PATH=${HOME}/lib并小心地将其导出为,从不尝试将其用作根用户,因为对于禁用env变量的根用户而言。

编辑1

顺便说一句,如果您需要按需加载共享库(这可能就是您所需要的),请阅读有关dlopen(3)和朋友函数的内容,因为这是大多数程序用于动态加载模块的方法,在编译主程序之前您还没有听说过。您需要加载模块,查找所需的符号(dlsym(3)dlfunc(3)),存储模块提供的引用,最后调用它们。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46636461

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档