gpt4 book ai didi

arm - 在 Raspberry Pi 上运行简单的 ELLCC 生成的 ELF 二进制文件时出现非法指令

转载 作者:行者123 更新时间:2023-12-01 23:43:30 28 4
gpt4 key购买 nike

我在 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

我不知道如何判断 the disassembled code 出了什么问题.我尝试了其他 ARM Linux 目标,但行为是一样的。怎么了?


对于其他目标,如 i386-linux-eng,完全相同的文件构建、链接和运行良好, x86_64-w64-mingw32等(我可以对其进行测试),再次使用 ELLCC 工具链。


假设库和启动代码没有问题,这就是 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

最佳答案

我猜它在 0x0001018c 处的 movw 上阻塞了。可以处理完整 16 位立即值的 movw/movt 编码首先出现在架构的 ARMv6T2 版本中 - 原始 Pi 模型中的 ARM1176 早于此,仅支持原始 ARMv6*

你需要告诉编译器生成适合你正在运行的东西的代码——我不知道 ELLCC,但我猜它是相当现代和最新的,因此默认为某些东西较新的 ARMv6T2 或 ARMv7。否则,这类似于为 Pentium 生成代码并希望它能在 80486 上运行——你可能很幸运,也可能不会。也就是说,没有充分的理由应该首先选择该编码 - 这并不是说 0 不能在“经典”mov 指令中编码...

然而,颓废的选择是认为这是用 Pi 2 替换 Pi 的完美借口——其中的 Cortex-A7s 是功能强大的 ARMv7 内核;)

* 为清楚起见撒谎。我认为 1176 实际上可能是 v6K,但这与这里无关。我不确定是否真的存在纯 ARMv6,坦率地说,所有各种架构扩展都是一团糟

关于arm - 在 Raspberry Pi 上运行简单的 ELLCC 生成的 ELF 二进制文件时出现非法指令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30242661/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com