ARM的交叉编译:错误,找不到文件或目录。

我已经编写了一个简单的Hello world程序,并使用gcc-arm-linux-gnueabi编译器进行了编译。它编译得很好,但是当我尝试在ARM机器上执行它时,它报错说"没有这个文件或目录"。 我认为gcc-arm-linux-gnueabi只适用于嵌入式Linux,因为它带有嵌入式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 no such file or dir”的错误。
编辑: 当我使用arm-linux-gnueabi-gcc时,入口点与目标机器的入口点不匹配(readelf -l crosscom),但是当我使用aarch64-linux-gnu-gcc编译时,入口点与目标机器匹配。但现在出现了"./crosscomp"的权限被拒绝的错误。我尝试使用sudo,但显示crosscomp:没有这个命令。

只是说“没有这样的文件或目录”,没有提到文件? - JonBrave
文件存在于目录中 :) - incompetent
什么文件?你说你写了一个“简单的Hello world程序”,它不访问任何文件,如果你不(a)向我们展示你的实际代码和(b)向我们展示完整的错误信息,现在你将得不到太多帮助! - JonBrave
所以只是为了百分之百确定,你输入的是 crosscomp 并且已经确认 . 在你的 PATH 中? - JonBrave
是的,我亲爱的,我正在这样做 :) - incompetent
如果是我,我会查看ldd crosscompstrace crosscomp,也许还会尝试将printf注释掉,看看它的行为如何。 - JonBrave
对于那些遇到类似问题的人,这里是一个关于SO的问题链接--https://stackoverflow.com/questions/31929092/trying-to-run-a-cross-compiled-executable-on-target-device-fails-with-no-such-f - Vadim Kotov
1个回答

如何识别问题?
file cross_compiled_executable

包含类似以下内容的文字:
interpreter /lib/ld-uClibc.so.0

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

如何解决这个问题?

使用适当的编译器,可以选择以下方式:

  • 创建磁盘映像的人必须提供交叉编译器或者告诉您如何构建它,例如使用crosstool-ng
  • 自己编译映像和交叉编译器,例如使用Buildroot。这里有一个示例
  • 在目标设备上使用本地编译器。但通常目标设备比主机慢得多,并且空间有限,所以您可能不想这样做。

    您还可以尝试使用功能强大的模拟器(如QEMU)进行构建,然后只在较慢的平台上运行程序,例如gem5或者一块慢速开发板。

只是简单地修改解释器可能还不够,特别是你必须确保程序与目标libc之间的二进制兼容性,或者程序与内核接口(系统调用,/proc等)之间的兼容性,如果你尝试使用-static选项(目标内核可能过旧,不包含所需的接口)。唯一可靠的解决方案是使用正确的工具链。