我编写了简单的 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 或程序与内核接口(系统调用等)之间的二进制兼容性。唯一可靠的解决方案是使用正确的工具链。