assembly 如何在Apple M1汇编代码中处理SIGINT?

beq87vna  于 2023-08-06  发布在  其他
关注(0)|答案(1)|浏览(66)

我正在学习苹果M1的组装。我想写一个程序,进入一个无限循环,然后在按下control-c时以状态123退出。我写了如下程序:

// foo.s
.align 2
.text
.global _main

_main:
  mov x0, #2
  adrp x1, sigint_handler@page
  add x1, x1, sigint_handler@pageoff
  mov x2, #0
  mov x8, 0x8c
  svc 0

loop:
  b loop

sigint_handler:
  mov x0, #123
  mov x16, #1
  svc 0

字符串
它可以与以下部件组装:

as foo.s -arch arm64 -o foo.o
ld -arch arm64 -syslibroot /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk -lSystem -o foo foo.o


并运行:

./foo


当我按下control-c时,程序退出,状态为130:

echo $?
130


由于sigint_handler的原因,我期望的状态码是123。
我想我没有正确注册sigint_handler。我做错了什么?
谢啦,谢啦

编辑:

在根据Nate的评论进行了更多的尝试之后,我现在有了以下代码:

.align 2

.data
nsa: .skip 24

.text
.global _main

_main:
  // Populate the __sigaction nsa struct:
  // https://opensource.apple.com/source/xnu/xnu-1504.3.12/bsd/sys/signal.h.auto.html

  adrp x0, nsa@page
  add x0, x0, nsa@pageoff

  adrp x1, sigint_handler@page
  add x1, x1, sigint_handler@pageoff
  str x1, [x0, #0]

  // I'm not sure what to do here:
  mov x1, #0
  str x1, [x0, #8]
  str x1, [x0, #16]

  // Make service call 46:
  // int sigaction(int signum, struct __sigaction *nsa, struct sigaction *osa);
  // https://opensource.apple.com/source/xnu/xnu-1504.3.12/bsd/kern/syscalls.master

  mov x0, #2 // SIGINT
  adrp x1, nsa@page
  add x1, x1, nsa@pageoff
  mov x2, #0 // NULL
  mov x16, #46
  svc 0

loop:
  b loop

sigint_handler:
  mov x0, #123
  mov x16, #1
  svc 0


我正在尝试构建一个__sigaction *nsa结构体,以便可以进行有效的sigaction服务调用。这不起作用,当我控制-c时,我得到了一个分段错误。我不是很确定这个结构体的大小以及如何正确地填充它的字段。

7vux5j2d

7vux5j2d1#

我使用这个相对简单的代码让它工作:

.align 2
.text
.global _main

_main:
  mov x0, #2
  adrp x1, sigint_handler@page
  add x1, x1, sigint_handler@pageoff
  bl _signal

loop:
  b loop

sigint_handler:
  mov x0, #123
  mov x16, #1
  svc 0

字符串
我从一个简单的C程序开始:

// foo.c
#include <signal.h>

void handler(int signal) {}

void main(void) {
  signal(SIGINT, handler);
}


然后我使用gcc来输出assembly:

gcc -S -o foo.s foo.c


结果如下:

.section    __TEXT,__text,regular,pure_instructions
    .build_version macos, 13, 0 sdk_version 13, 3
    .globl  _handler                        ; -- Begin function handler
    .p2align    2
_handler:                               ; @handler
    .cfi_startproc
; %bb.0:
    sub sp, sp, #16
    .cfi_def_cfa_offset 16
    str w0, [sp, #12]
    add sp, sp, #16
    ret
    .cfi_endproc
                                        ; -- End function
    .globl  _main                           ; -- Begin function main
    .p2align    2
_main:                                  ; @main
    .cfi_startproc
; %bb.0:
    stp x29, x30, [sp, #-16]!           ; 16-byte Folded Spill
    .cfi_def_cfa_offset 16
    mov x29, sp
    .cfi_def_cfa w29, 16
    .cfi_offset w30, -8
    .cfi_offset w29, -16
    mov w0, #2
    adrp    x1, _handler@PAGE
    add x1, x1, _handler@PAGEOFF
    bl  _signal
    ldp x29, x30, [sp], #16             ; 16-byte Folded Reload
    ret
    .cfi_endproc
                                        ; -- End function
.subsections_via_symbols


然后,我挑选出注册信号处理程序的行。我不确定_signal来自哪里-我假设它内置在macOS汇编器中。如果有人能解释这一部分,我将不胜感激。谢啦,谢啦

相关问题