在 ARM(HF) 系统上运行 ARM(EL) 可执行文件-缺少动态加载器的符号链接?

在 ARM(HF) 系统上运行 ARM(EL) 可执行文件-缺少动态加载器的符号链接?

我在 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。)

相关内容