只是为了确保我做对了 - 我打电话
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
(不再可用)。这意味着dpkg
和apt-get
都不满意(无论我做什么,它都会提示我apt-get -f install
,如果我运行它,它会坚持让我卸载服务包),并且我的服务不会启动。
为了证明这是由于缺少 32 位库造成的,我ia32-libs
在 上安装了旧系统 (Ubuntu 12.04,带有 和 32 位库) /sda2
。确保/opt
(包含我的 32 位二进制文件) 安装在 中,然后/sda2/opt
我就可以按预期运行。 chroot /sda2
ldd
为了解决这个问题,我可以使用 :i386 (arch) 手动安装所有依赖库包。但是我决定不去弄清楚我的依赖项是什么,而是安装 wine(它主要是 32 位的,因此会安装基本库和大量我并不真正需要的库,但我可以接受)。
为了修复dpkg
和apt-get
,我编辑了/var/lib/dpkg/status
,找到了我服务的包,然后删除了ia32-libs
。现在dpkg
和apt-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)