我google了很多没有成功。
如果可能的话,我需要的是一种检索进程使用哪个动态库的运行时的方法。
我知道ldd,但我正在寻找一个C编码解决方案。
目标是让进程在启动时检索有关lib的信息,并将它们发送到能够存储和显示我的进程使用的所有库的信息进程。
修改 请注意我正在开发一个嵌入式系统,它必须尽可能少(在RootFS足迹方面)。
答案 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
文件。