【发布时间】:2017-07-10 10:18:05
【问题描述】:
根据这篇Interfacing Linux Signals 的文章,我一直在尝试在amd64 中使用sys_rt_sigaction,但在发送信号时总是出现内存访问错误。 struct sigaction 在使用 C/C++ 函数 sigaction 时有效。
sys_rt_sigaction 通话有什么问题?
带有 ASM 代码的 C/C++:
#include<signal.h>
#include<stdio.h>
#include<time.h>
void handler(int){printf("handler\n");}
void restorer(){asm volatile("mov $15,%%rax\nsyscall":::"rax");}
struct sigaction act{handler};
timespec ts{10,0};
int main(){
act.sa_flags=0x04000000;
act.sa_restorer=&restorer;
//*
asm volatile("\
mov $13,%%rax\n\
mov %0,%%rdi\n\
mov %1,%%rsi\n\
mov %2,%%rdx\n\
mov $8,%%r10\n\
syscall\n\
mov %%rax,%%rdi\n\
mov $60,%%rax\n\
#syscall\n\
"::"i"(7),"p"(&act),"p"(0):"rax","rdi","rsi","rdx","r10");
/**/
/*
sigaction(7,&act,0);
/**/
nanosleep(&ts,0);
}
编译
g++ -o bin -std=c++11
g++ -o bin -std=c++11 -no-pie
发送信号
kill -7 `pidof bin`
【问题讨论】:
-
不是linux的
syscallclobber rcx和r11吗? -
确实如此,好点。
标签: linux assembly x86-64 system-calls