我在 LLVM IR 中有一个空程序:
define i32 @main(i32 %argc, i8** %argv) nounwind {
entry:
ret i32 0
}
我使用 ELLCC 在 Intel x86-64 Windows for ARM Linux 上交叉编译它,使用以下命令:
ecc++ hw.ll -o hw.o -target arm-linux-engeabihf
它没有错误地完成并生成一个 ELF 二进制文件。
当我将二进制文件带到 Raspberry Pi Model B+(运行 Raspbian)时,我只收到以下错误:
Illegal instruction
我不知道如何从反汇编代码中判断出什么问题。我尝试了其他 ARM Linux 目标,但行为相同。怎么了?
同样使用 ELLCC 工具链,对于其他目标(如 , 等)(我可以测试),i386-linux-eng
完全相同的文件构建、链接和运行良好。x86_64-w64-mingw32
假设库和启动代码没有问题,这就是反汇编main
本身的样子:
.text:00010188 e24dd008 sub sp, sp, #8
.text:0001018c e3002000 movw r2, #0
.text:00010190 e58d0004 str r0, [sp, #4]
.text:00010194 e1a00002 mov r0, r2
.text:00010198 e58d1000 str r1, [sp]
.text:0001019c e28dd008 add sp, sp, #8
.text:000101a0 e12fff1e bx lr