![在 ARM(HF) 系统上运行 ARM(EL) 可执行文件-缺少动态加载器的符号链接?](https://linux22.com/image/964613/%E5%9C%A8%20ARM(HF)%20%E7%B3%BB%E7%BB%9F%E4%B8%8A%E8%BF%90%E8%A1%8C%20ARM(EL)%20%E5%8F%AF%E6%89%A7%E8%A1%8C%E6%96%87%E4%BB%B6-%E7%BC%BA%E5%B0%91%E5%8A%A8%E6%80%81%E5%8A%A0%E8%BD%BD%E5%99%A8%E7%9A%84%E7%AC%A6%E5%8F%B7%E9%93%BE%E6%8E%A5%EF%BC%9F.png)
我在 panda 板上使用 Ubuntu 12.10 (ARMHF) 发行版。我想运行为 ARMEL 编译的应用程序。由于动态加载程序位置已更改,因此无法运行 (https://wiki.linaro.org/OfficeofCTO/HardFloat/LinkerPathCallApr2012)
我成功创建了以下符号链接 /lib/ld-linux.so.3 -> /lib/ld-linuxarmhf.so.3
有没有办法安装可移植性软件包?发行版没有这样做的原因是什么?
提前致谢
答案1
动态链接器在编译时被嵌入。运行后即可查看正在使用哪个动态链接器。readelf -l /usr/bin/foo | grep Request
改变这种情况的唯一方法是调整 gcc 规范文件。请参阅gcc -dumpspecs | grep ld-linux
。或者在构建时将 --dynamic-linker 标志传递给链接器,例如gcc -Wl,--dynamic-linker,/lib/ld-linux.so.3 foo.c
然而,如果工具链设置正确,那么这些都不是必需的,而且你真的不应该弄乱它,除非你真的有理由这样做。
简而言之,您的解决方案可能是最好的,但是我会尝试找到 armhf 包并使用它(如果可以),或者重建该包。
答案2
也许,这样的兼容包并不存在(目的是为了运行旧的第三方 armhf 二进制文件,而/lib/ld-linux.so.3
不是新的标准,是/lib/ld-linuxarmhf.so.3
的,对吧?)因为该包(如果安装)会给出一个“虚假承诺”,以适合任何 armel 二进制文件。但如果我理解正确的话,armhf 动态链接器必须破坏 armel 二进制文件,因为 ABI 不兼容。(在这种情况下,正确的解决方案是包装一些特殊的非标准 armhf 二进制文件,以便动态链接器的预期位置适合您的系统。或者在二进制文件中重写这个值。如果这是可能的。那么当您尝试运行真正的 armel 二进制文件时,这不会造成任何问题。)
另一方面,如果你想在 armhf 系统上运行真正的 armel 二进制文件,你只需要“多架构”(因此使用真正的 armel 动态链接器,而不是符号链接!):为 armel 二进制文件安装 armel 先决条件。在先决条件libc6:armel
或类似条件中(如果我错了,请更正 pkg 名称),肯定会包括所需的 /lib/ld-linux.so.3
.
(关于 ABI 的不兼容性:据我所知,在 armhf 中,浮点参数直接在浮点寄存器中传递,而在 armel 中,它们在整数寄存器中传递。这种间接性为支持浮点的 ARM 增加了额外的成本,这就是为什么 armhf 更适合现代 ARM。)