【发布时间】:2018-02-22 01:16:42
【问题描述】:
我正在搞乱我的新树莓派,而且我对组装还很陌生。我已经在 Google 和 SO 上寻找解决方案,这是我最接近运行程序的方法。
main.s(cmets 来自我在互联网上找到的解释)
.section .text
.global _start
_start:
mov x0, #0 // return value 0 for success
mov x7, #1 // 1 is exit in the vector table
svc 0 // execute the system call to exit the program
然后我与as main.s -o main.o 组装并与ld main.o -o main 链接。使用./main 运行输出“非法指令(核心转储)”。
这是在 64 位四核 ARM Cortex-A53 上运行 ARM Arch Linux 的 Raspberry Pi Model B。
目标:编译并链接只有 as 和 ld 的 ARM 汇编程序将成功退出
【问题讨论】:
-
尝试将此添加到顶部
.section .text -
@user8908459 结果相同 :(
-
有机会仔细看看这个。您正在将值 0 移动到内存地址 0。您不能只写入任意内存位置。该程序失败,因为它试图写入它不拥有的内存区域。尝试将其移至有效寄存器。
mov r1, #0 -
使用
strace ./main来跟踪系统调用。在svc 0以失败返回而不是退出后它可能会出现故障(因此执行落入下一步)。但是 IDK AArch64 系统调用 ABI 所以 IDK 如果svc 0甚至是正确的指令。我认为它适用于 32 位 ARM。 -
@PeterCordes 你刚刚拯救了这一天。我读了
man syscall。结果是在 arm64 上,您将参数放入 x8,我正在随机谷歌搜索,发现 github.com/seccomp/libseccomp/blob/master/src/…random github 在“退出”数字 93 下。我会将解决方案放在未来的傻瓜的问题中。再次感谢您的智慧。
标签: assembly raspberry-pi raspberry-pi3 arm64 archlinux-arm