gpt4 book ai didi

linux - sigprocmask 在汇编中返回 -22

转载 作者:太空宇宙 更新时间:2023-11-04 12:59:21 25 4
gpt4 key购买 nike

我想在汇编中使用 sigprocmask 来阻止函数中的所有信号。

以下代码在 C 中有效:

#include <stdio.h>
#include <signal.h>
int main() {
sigset_t n={(unsigned long int) 0xffffffff};
sigprocmask (SIG_BLOCK, &n, 0);

for (int i=0; i<0x8ffff; i++) printf(".");
}

当代码执行并开始在终端上打印点时,我无法使用 Ctrl+C 中断它。到目前为止一切顺利。

显然,SIG_BLOCK 的值是 0; sys_rt_sigprocmask 的系统调用号是 14: http://blog.rchapman.org/post/36801038863/linux-system-call-table-for-x86-64

所以我写:

[BITS 64]
[section .text align=1]

global main

main:

mov r10, 32
mov rdx, 0
mov rsi, newmask
mov rdi, 0

mov rax, 14
syscall


dotPrintLoop:
mov rdi, dotstring
mov rax, 0
syscall
jmp dotPrintLoop


[section .data align=1]

dotstring: db ".",0

newmask: dd 0xffffffff
dd 0xffffffff
dd 0xffffffff
...

而且它不起作用。 gdb 在第一次系统调用后显示 rax 的值为 -22(EINVAL - “无效参数”);而第二个系统调用(sys_write)工作得很好。

我做错了什么?

最佳答案

显然 r10 应该保持值 8 而不是 32。

我在内核代码中遇到了 4 种不同的 sigset_t 定义;对于它们中的每一个,sizeof() 函数返回不同的结果(我记得是 32、128、4 和 8)。只有最后一个与系统调用相关。

内核首先检查$r10 == sizeof(sigset_t);如果不成立,则返回 EINVAL (-22)。对于 32 位和 64 位版本,sizeof(sigset_t) 的值都等于 8。

关于linux - sigprocmask 在汇编中返回 -22,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34671312/

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