被‘ldd’报告为“非动态可执行文件”的文件是否依赖于其他库?

被‘ldd’报告为“非动态可执行文件”的文件是否依赖于其他库?

只是为了确保我做对了 - 我打电话

ldd /path/to/executable

并且它返回“不是动态可执行文件”。这意味着它不依赖于其他库,对吗?如果是这样,是否意味着它可以转移到另一个 Ubuntu 机器而不必担心依赖关系?

答案1

正确,但有一些事情需要考虑。

来自ldd手册页:

ldd 不适用于 a.out 共享库。

ldd 无法与某些非常老的 a.out 程序配合使用,这些程序是在编译器版本中添加 ldd 支持之前构建的。如果您在这些程序中使用 ldd,该程序将尝试使用 argc = 0 运行,结果将不可预测。

答案2

@Calmarius 是正确的,如果你考虑一个 32 位 exe,甚至没有基本的 32 位库,就会发生这种情况。

我正在尝试升级我的系统(从 12.04 升级到全新安装的 Ubuntu 16.04),我必须安装一个旧的专有 32 位服务,avserver它需要ia32-libs(不再可用)。这意味着dpkgapt-get都不满意(无论我做什么,它都会提示我apt-get -f install,如果我运行它,它会坚持让我卸载服务包),并且我的服务不会启动。

为了证明这是由于缺少 32 位库造成的,我ia32-libs在 上安装了旧系统 (Ubuntu 12.04,带有 和 32 位库) /sda2。确保/opt(包含我的 32 位二进制文​​件) 安装在 中,然后/sda2/opt我就可以按预期运行。 chroot /sda2ldd

为了解决这个问题,我可以使用 :i386 (arch) 手动安装所有依赖库包。但是我决定不去弄清楚我的依赖项是什么,而是安装 wine(它主要是 32 位的,因此会安装基本库和大量我并不真正需要的库,但我可以接受)。

为了修复dpkgapt-get,我编辑了/var/lib/dpkg/status,找到了我服务的包,然后删除了ia32-libs。现在dpkgapt-get很高兴

完成后,ldd高兴地报告:- root@withnail:/opt/<service path># ldd avserver linux-gate.so.1 => (0xf77a6000) libdl.so.2 => /lib/i386-linux-gnu/libdl.so.2 (0xf778f000) libpthread.so.0 => /lib/i386-linux-gnu/libpthread.so.0 (0xf7772000) libuuid.so.1 => /lib/i386-linux-gnu/libuuid.so.1 (0xf776b000) libresolv.so.2 => /lib/i386-linux-gnu/libresolv.so.2 (0xf7752000) libcrypt.so.1 => /lib/i386-linux-gnu/libcrypt.so.1 (0xf7720000) libktssl.so.1.0.0 => /opt/<service path>/libktssl.so.1.0.0 (0xf76cb000) libktcrypto.so.1.0.0 => /opt/<service path>/libktcrypto.so.1.0.0 (0xf756b000) libktz.so.1 => /opt/<service path>/libktz.so.1 (0xf7558000) librt.so.1 => /lib/i386-linux-gnu/librt.so.1 (0xf754f000) libstdc++.so.6 => /usr/lib/i386-linux-gnu/libstdc++.so.6 (0xf73d8000) libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0xf7383000) libgcc_s.so.1 => /lib/i386-linux-gnu/libgcc_s.so.1 (0xf7366000) libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xf71af000) /lib/ld-linux.so.2 (0x565b1000)

相关内容