C 检索libs运行时

C 检索libs运行时,c,linux,gcc,dynamic-library,C,Linux,Gcc,Dynamic Library,我用谷歌搜索了很多次,但都没有成功 如果可能的话,我需要的是一种检索运行时的方法,该过程使用哪些动态lib 我知道,但我正在寻找一个c代码的解决方案 目标是让进程在启动时检索有关lib的信息,并将其发送到能够存储和显示我的进程使用的所有lib的信息进程 编辑 请注意,我正在开发一个嵌入式系统,该系统必须尽可能少(用RootFS footprint术语来说)。您希望程序解析elf头。好的,在最后,您将只获得所分析的elf文件所需的依赖项列表,例如(readelf-doutput): 然后,您应该递

我用谷歌搜索了很多次,但都没有成功

如果可能的话,我需要的是一种检索运行时的方法,该过程使用哪些动态lib

我知道,但我正在寻找一个c代码的解决方案

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

编辑
请注意,我正在开发一个嵌入式系统,该系统必须尽可能少(用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。我忘了写我说的是嵌入式系统。你建议的解决方案很有趣。你能详细阐述一下吗?你建议的解决方案很有趣。你能详细说明一下吗?