linux/gcc:C/C内部的ldd功能+;程序

linux/gcc:C/C内部的ldd功能+;程序,linux,gcc,linker,dependencies,ldd,Linux,Gcc,Linker,Dependencies,Ldd,有没有一种简单而有效的方法可以知道一个给定的动态链接的ELF缺少一个必需的。因此,要让它运行,所有这些都来自C/C++程序的内部 我需要一个功能与ldd类似的程序,而不需要执行ELF来找出系统中的(满足/未满足)依赖项。也许通过某个库询问ld-linux.so实用程序?(我在linux的这一部分是新手=) 注意:阅读ldd的源代码对我的意图没有多大帮助:看来ldd实际上是在派生另一个进程并执行程序 如果不执行程序就不可能知道程序有未满足的依赖项,那么至少有什么方法可以快速列出.so's requ

有没有一种简单而有效的方法可以知道一个给定的动态链接的
ELF
缺少一个必需的。因此,要让它运行,所有这些都来自C/C++程序的内部

我需要一个功能与
ldd
类似的程序,而不需要执行
ELF
来找出系统中的(满足/未满足)依赖项。也许通过某个库询问ld-linux.so实用程序?(我在linux的这一部分是新手=)

注意:阅读
ldd
的源代码对我的意图没有多大帮助:看来
ldd
实际上是在派生另一个进程并执行程序

如果不执行程序就不可能知道程序有未满足的依赖项,那么至少有什么方法可以快速列出.so's required for the
ELF
全部来自我的程序


提前感谢=)

您是否尝试了
dlopen
功能?您可以使用它来加载动态库(或者,在您的情况下,如果可以加载库,请检查)

要获得所需库的列表更为困难,请查看

上的
handle\u dynamic
函数,将环境变量
LD\u TRACE\u LOADED\u OBJECTS
设置为非空字符串将给出类似于
ldd
的结果(而不是正常执行二进制或库)


使用ptrace()跟踪所有open()调用以查找程序所依赖的所有内容如何(但是,输出包括文件,而不仅仅是库)。或者使用文件名“/lib”中的前缀过滤输出会有帮助。

您是否有充分的理由不调用ldd实用程序并解析其输出?在linux下,这种技术被广泛使用。除了我自己的程序之外,我不想调用shell来执行任何事情。。此外,仅仅为了测试一个可执行文件是否会通过试错来运行,而进行fork、启动shell等操作并不是很有效。。但是,是的,我怀疑调用ldd是一个很好的标准选择。对不起,这是一个神话。现在Fork一点也不昂贵,大多数exec*()调用都不使用shell来运行二进制文件。与fork()/exec()开销相比,在将来的所有调用中,您很容易通过深入研究ld linux内部结构来消磨更多的时间。是的,这将提供与ldd完全相同的输出(好吧,可能需要设置更多的环境),事实上ldd只不过是您的代码。。但当然,这个解决方案与调用ldd相同,ldd将调用您的代码。。我在寻找另一种解决方案,也许是查询ld-linux。所以,用另一种更直接的方式。。。。无需调用shell=)无需调用shell也很容易——只需
fork
exec
管道
,如果您想要输出,则首先使用管道,
fdopen
,如果您确实想要
文件*
),而不是
popen
。这基本上是查询
ld linux.so
而不必硬编码
ld linux.so
。这个函数很有趣,我可以看到rpath和其他参数。。我会进一步调查的,谢谢
setenv("LD_TRACE_LOADED_OBJECTS", "1", 1);
FILE *ldd = popen("/lib/libz.so");