首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >检索libs运行时

检索libs运行时
EN

Stack Overflow用户
提问于 2015-12-01 11:11:38
回答 2查看 269关注 0票数 0

我在谷歌上查了很多但都没成功。

如果可能的话,我需要的是一种检索运行时的方法,流程使用哪个动态库。

我知道ldd,但我正在寻找一个c++的解决方案。

目标是让进程在启动时检索有关lib的信息,并将它们发送到能够存储和显示我的进程所使用的所有库的信息进程中。

编辑注意到我正在开发一个嵌入式系统,这个系统必须尽可能少(用RootFS占用的术语来说)。

EN

回答 2

Stack Overflow用户

发布于 2015-12-01 14:41:41

你想通过你的程序解析精灵头。好的,最后您将得到仅用于分析精灵文件的所需依赖项列表,例如(readelf -d输出):

代码语言:javascript
运行
复制
 0x00000001 (NEEDED)     Shared library: [libcurl.so.4]
 0x00000001 (NEEDED)     Shared library: [libpthread.so.0]
 0x00000001 (NEEDED)     Shared library: [librt.so.1]
 0x00000001 (NEEDED)     Shared library: [libm.so.6]
 0x00000001 (NEEDED)     Shared library: [libc.so.6]

然后,您应该递归地解析每个找到的库,以获得它们的依赖关系。这迫使为每个库找到完整的路径。为此,您应该处理库的搜索路径:内置ld.so和环境变量LD_LIBRARY_PATH。在精灵结构中也可以出现带有特殊变量的RPATH字段(高优先级搜索路径),例如:

代码语言:javascript
运行
复制
0x0000000f (RPATH) Library rpath: [/usr/lib:/usr/lib/i386-linux-gnu:$ORIGIN]

ldd是一个包含大量例程和注释的bash脚本,因此如果需要的话,可以以最小的大小剥离它。在通常情况下,它使用set变量LD_TRACE_LOADED_OBJECTS调用标准动态链接器( ld.so )。这就是全部。因此,解析ldd输出非常舒适。

票数 2
EN

Stack Overflow用户

发布于 2015-12-01 14:55:52

ldd所做的实际上是设置LD_TRACE_LOADED_OBJECTS环境变量并执行程序。因此,实际上,ldd功能不需要额外的占用空间来执行。

但是,您可能希望避免解析输出。或者您甚至可以使用另一个动态链接器,而不是ld.so (它不尊重LD_TRACE_LOADED_OBJECTS变量)。

一种解决方案是修改动态链接器,使其具有一个C接口,并允许它报告本应加载的.so文件。

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

https://stackoverflow.com/questions/34018954

复制
相关文章

相似问题

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