检索libs运行时

时间:2015-12-01 11:11:39

标签: c linux gcc dynamic-library

我google了很多没有成功。

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

我知道ldd,但我正在寻找一个C编码解决方案。

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

修改 请注意我正在开发一个嵌入式系统,它必须尽可能少(在RootFS足迹方面)。

2 个答案:

答案 0 :(得分:2)

您希望程序使用parse elf-header。好的,最后您将获得仅用于分析的elf文件的NEEDED依赖项列表,例如(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]

然后,您应该递归地解析每个找到的库以获取它们的依赖项。这迫使找到每个库的完整路径。为此,您应该处理库的搜索PATH:内置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输出非常舒服。

答案 1 :(得分:2)

ldd的作用实际上是设置LD_TRACE_LOADED_OBJECTS环境变量并执行程序。实际上ldd功能实际上不需要额外的足迹来执行。

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

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