简洁版本:
安装了 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”可能可以正常工作,但只要您使用任何需要将浮点数作为参数传递给函数的代码,程序就会以神秘的方式开始失败。