我在谷歌上查了很多但都没成功。
如果可能的话,我需要的是一种检索运行时的方法,流程使用哪个动态库。
我知道ldd,但我正在寻找一个c++的解决方案。
目标是让进程在启动时检索有关lib的信息,并将它们发送到能够存储和显示我的进程所使用的所有库的信息进程中。
编辑注意到我正在开发一个嵌入式系统,这个系统必须尽可能少(用RootFS占用的术语来说)。
发布于 2015-12-01 14:41:41
你想通过你的程序解析精灵头。好的,最后您将得到仅用于分析精灵文件的所需依赖项列表,例如(readelf -d
输出):
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
字段(高优先级搜索路径),例如:
0x0000000f (RPATH) Library rpath: [/usr/lib:/usr/lib/i386-linux-gnu:$ORIGIN]
ldd
是一个包含大量例程和注释的bash脚本,因此如果需要的话,可以以最小的大小剥离它。在通常情况下,它使用set变量LD_TRACE_LOADED_OBJECTS调用标准动态链接器( ld.so )。这就是全部。因此,解析ldd
输出非常舒适。
发布于 2015-12-01 14:55:52
ldd
所做的实际上是设置LD_TRACE_LOADED_OBJECTS
环境变量并执行程序。因此,实际上,ldd
功能不需要额外的占用空间来执行。
但是,您可能希望避免解析输出。或者您甚至可以使用另一个动态链接器,而不是ld.so
(它不尊重LD_TRACE_LOADED_OBJECTS
变量)。
一种解决方案是修改动态链接器,使其具有一个C接口,并允许它报告本应加载的.so
文件。
https://stackoverflow.com/questions/34018954
复制相似问题