ARM 交叉编译:错误,没有这样的文件或目录

ARM 交叉编译:错误,没有这样的文件或目录

我编写了简单的 Hello world 程序并用gcc-arm-linux-gnueabi编译器编译了它。它编译得很好,但当我尝试在 ARM 机器上执行它时,它会抱怨“没有这样的文件或目录”。我认为gcc-arm-linux-gnueabi它仅适用于嵌入式 Linux e(mbedded)abi。它与 ARM Linux ABI 有什么不同吗?

请帮我解决这个问题

代码在这里

#include "stdio.h"

int main(void) {
  printf("Hello world !\n");
  return 0;
}

编译为

> arm-linux-gnueabi-gcc -Wall -o crosscomp hello.c

当我在目标 ARM 机器上执行此 crosscomp 时,错误是 crosscomp 没有这样的文件或目录

编辑 当我使用时,arm-linux-gnueabi-gcc入口点与目标机器入口点不匹配(readelf -l crosscom),但当我使用与aarch64-linux-gnu-gcc目标机器匹配的入口点进行编译时。但现在错误变成了 ./crosscomp 上的权限被拒绝。我尝试使用 sudo,它显示 crosscomp:没有这样的命令。

答案1

如何辨别问题?

file cross_compiled_executable

包含如下内容:

interpreter /lib/ld-uClibc.so.0

问题是该文件在目标上不存在。

如何解决这个问题?

使用适当的编译器,可以:

  • 创建磁盘映像的人必须向您提供交叉编译器,或者告诉您如何构建它,例如crosstool-ng
  • 编译你自己的图像和交叉编译器,例如构建根。 这是一个例子
  • 在目标上使用本机编译器。但通常目标比主机慢得多,并且空间受限,因此您可能不想这样做。

    您还可以使用 QEMU 等功能模拟器进行构建,然后仅在较慢的平台(例如 gem5 或慢速主板)上运行程序。

仅仅破解interpreter可能还不够,特别是/proc如果您尝试使用-static(目标内核可能太旧并且不包含所需的接口),您必须确保程序与目标 libc 或程序与内核接口(系统调用等)之间的二进制兼容性。唯一可靠的解决方案是使用正确的工具链。

相关内容