Nexus 7 上的 Ubuntu Touch:为什么没有 ld-linux.so*?

Nexus 7 上的 Ubuntu Touch:为什么没有 ld-linux.so*?

简洁版本:

安装了 Ubuntu Touch,发现没有/lib/ld-linux.so.3动态链接器(符号链接或其他)。这是我第一次在 Linux 安装中看到它缺失。它不存在有什么特殊原因吗?


长版本:

我刚刚在第一代 Nexus 7 上安装了 Ubuntu Touch(13.10,稳定版),我想在其上尝试一些针对 ARM 的编译。

我把这个gcc-arm-linux-gnueabi包安装在我的 Ubuntu 桌面上(顺便说一下,是 12.04),用 C 语言编译了一个简单的“hello world”,然后把它复制到 Nexus 上,ssh然后运行可执行文件(nexustest)。响应是:

-bash: ./nexustest: No such file or directory

最终我发现这是因为 Ubuntu 甚至无法加载ld-linux.so动态链接器。与非静态链接的 Linux 可执行文件一样,ldd nexustest显示它正在寻找/lib/ld-linux.so.3,而 Ubuntu Touch 安装没有该程序。

我可以使用以下任一方法“修复”此问题,在这种情况下“hello world”可以按预期运行:

  • 复制或符号链接/lib/ld-linux-armhf.so.3/lib/ld-linux.so.3——表明这ld-linux-armhf.so.3是正确的动态链接器

  • 使用以下方法编译(链接)可执行文件-static——建议arm-linux-gnueabi-gcc使用正确的链接器/架构

从 GCC 和 Linux 链接的角度来看,一切似乎都按预期工作,只是我的 Nexus 7 上没有/lib/ld-linux.so.3(我预计它应该只是一个符号链接ld-linux-armhf.so.3)。这是为什么?遗漏是一个错误,还是一些我没有理解的故意的发行版设计决定?

答案1

Ubuntu Touch 版本使用 armhf ABI,该架构可在较新的 ARM 芯片上显著提高性能。针对此 ABI 的交叉编译器是gcc-arm-linux-gnueabihf(hf 代表“硬浮动”)封装,而不是gcc-arm-linux-gnueabi包。此 armhf 交叉编译器在 12.04 中可用。

您不应将 /lib/ld-linux-armhf.so.3 符号链接到 /lib/ld-linux.so.3。链接器之所以有不同的名称,正是因为它们用于具有不同调用约定的库。“hello world”可能可以正常工作,但只要您使用任何需要将浮点数作为参数传递给函数的代码,程序就会以神秘的方式开始失败。

相关内容