C 检索libs运行时
我用谷歌搜索了很多次,但都没有成功 如果可能的话,我需要的是一种检索运行时的方法,该过程使用哪些动态lib 我知道,但我正在寻找一个c代码的解决方案 目标是让进程在启动时检索有关lib的信息,并将其发送到能够存储和显示我的进程使用的所有lib的信息进程 编辑C 检索libs运行时,c,linux,gcc,dynamic-library,C,Linux,Gcc,Dynamic Library,我用谷歌搜索了很多次,但都没有成功 如果可能的话,我需要的是一种检索运行时的方法,该过程使用哪些动态lib 我知道,但我正在寻找一个c代码的解决方案 目标是让进程在启动时检索有关lib的信息,并将其发送到能够存储和显示我的进程使用的所有lib的信息进程 编辑 请注意,我正在开发一个嵌入式系统,该系统必须尽可能少(用RootFS footprint术语来说)。您希望程序解析elf头。好的,在最后,您将只获得所分析的elf文件所需的依赖项列表,例如(readelf-doutput): 然后,您应该递
请注意,我正在开发一个嵌入式系统,该系统必须尽可能少(用RootFS footprint术语来说)。您希望程序解析elf头。好的,在最后,您将只获得所分析的elf文件所需的依赖项列表,例如(
readelf-d
output):
然后,您应该递归地解析每个找到的库,以获取它们的依赖项。这将强制查找每个库的完整路径。为此,您应该处理库的搜索路径:内置ld.so和环境变量ld\u LIBRARY\u PATH
。在elf结构中还可以出现带有特殊变量的RPATH
字段(更高优先级的搜索路径),例如:
0x0000000f (RPATH) Library rpath: [/usr/lib:/usr/lib/i386-linux-gnu:$ORIGIN]
ldd
是一个bash脚本,它有很多例程和注释,因此如果需要,可以将其精简到最小大小。在通常情况下,它使用set变量ld_TRACE_LOADED_对象调用ld.so(标准动态链接器)。仅此而已。所以解析ldd
输出非常方便。您希望程序解析elf头。好的,在最后,您将只获得所分析的elf文件所需的依赖项列表,例如(readelf-d
output):
然后,您应该递归地解析每个找到的库,以获取它们的依赖项。这将强制查找每个库的完整路径。为此,您应该处理库的搜索路径:内置ld.so和环境变量ld\u LIBRARY\u PATH
。在elf结构中还可以出现带有特殊变量的RPATH
字段(更高优先级的搜索路径),例如:
0x0000000f (RPATH) Library rpath: [/usr/lib:/usr/lib/i386-linux-gnu:$ORIGIN]
ldd
是一个bash脚本,它有很多例程和注释,因此如果需要,可以将其精简到最小大小。在通常情况下,它使用set变量ld_TRACE_LOADED_对象调用ld.so(标准动态链接器)。仅此而已。因此,解析ldd
输出非常方便。ldd实际上是设置LD\u TRACE\u LOADED\u OBJECTS
环境变量并执行程序。因此,实际上执行ldd
功能不需要额外的占用空间
但您可能希望避免解析输出。或者您甚至可以使用另一个动态链接器,而不是ld.so
(它不尊重ld\u TRACE\u LOADED\u对象
变量)
一种解决方案是修改动态链接器,使其也具有C API接口,并允许它报告本应加载的
.so
文件。ldd实际上是设置LD\u跟踪加载的对象
环境变量并执行程序。因此,实际上执行ldd
功能不需要额外的占用空间
但您可能希望避免解析输出。或者您甚至可以使用另一个动态链接器,而不是ld.so
(它不尊重ld\u TRACE\u LOADED\u对象
变量)
一种解决方案是修改您的动态链接器,使其也具有C API接口,并允许它报告本应加载的
。因此
文件。请参见:@nnn据我所知,在控制台上总是可以运行一些东西,比如使用system()
您有什么理由不想使用ldd
或类似工具吗?@skyking可以避免解析外部程序的输出,并避免使用ldd扩大我的RootFS。我没能写下我说的是一个嵌入式系统。看到了吗:@nnn就我所知总是在控制台上运行的东西,比如使用system()
您有什么理由不想使用ldd
或类似工具吗?@skyking可以避免解析外部程序的输出,并避免使用ldd扩大我的RootFS。我忘了写我说的是嵌入式系统。你建议的解决方案很有趣。你能详细阐述一下吗?你建议的解决方案很有趣。你能详细说明一下吗?