ldd和objdump有什么区别?

我正在运行这两个命令,我得到不同的输出:

$ ldd `which ls` linux-gate.so.1 => (0x00db3000) libselinux.so.1 => /lib/i386-linux-gnu/libselinux.so.1 (0x00ba2000) librt.so.1 => /lib/i386-linux-gnu/librt.so.1 (0x007bf000) libacl.so.1 => /lib/i386-linux-gnu/libacl.so.1 (0x004ce000) libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0x00110000) libdl.so.2 => /lib/i386-linux-gnu/libdl.so.2 (0x00398000) /lib/ld-linux.so.2 (0x00dea000) libpthread.so.0 => /lib/i386-linux-gnu/libpthread.so.0 (0x00a83000) libattr.so.1 => /lib/i386-linux-gnu/libattr.so.1 (0x00d3d000) 

接着

 objdump -x `which ls` | grep NEEDED NEEDED libselinux.so.1 NEEDED librt.so.1 NEEDED libacl.so.1 NEEDED libc.so.6 

那是怎么回事? 我以为他们都给了图书馆的依赖? 我关心的原因是,我怀疑ldd是正确的,但我正在ARM上的Linux上工作,在那里没有ldd从我可以告诉…

Solutions Collecting From Web of "ldd和objdump有什么区别?"

你可以看到输出的差异。

objdump只是简单地将对象本身列为包含未解析符号的库。

ldd列出了ld.so会实际加载的库。 并且它向后跟随该图,以便您可以看到这些库将加载的内容。 libpthread.so.0是如何在ldd输出中生成的,尽管不在objdump输出中。

所以ldd会给出一个更好的图像,说明在运行时真正需要的东西。 但是,当解决编译/链接时问题时,objdump是非常有帮助的。

请参阅程序库HOWTO ,第3.5节。 安装和使用共享库 :

注意:不要在你不信任的程序上运行ldd。 如ldd(1)手册中明确指出的,ldd通过(在某些情况下)通过设置特殊的环境变量(对于ELF对象LD_TRACE_LOADED_OBJECTS)并执行程序来工作。 一个不受信任的程序可能会强制ldd用户运行任意代码(而不是简单地显示ldd信息)。 所以,为了安全起见,不要在不信任的程序上使用ldd来执行。