Как мне вернуться к основному коду из обработчика сигнала в ассемблере?
Я писал программу в NASM для Linux. Я хотел бы иметь возможность вернуться к нормальному пути кода из обработчика сигнала, который я установил для SIGFPE. Сокращенный пример кода:
section .text
global _start
_start: ; --- Enter the program ---
mov ebx,8 ; Load the signal to handle (SIGFPE)
mov ecx,.handle ; Load the handler address
mov eax,48 ; Load the syscall number for signal
int 0x80 ; Establish the handler
mov ebx,0 ; Prepare a divisor for SIGFPE
idiv ebx ; Divide edx:eax by 0
mov ebx,0 ; Set exit status 0 (shouldn't get here)
jmp .exit ; Exit the program
.handle: ; --- Handle a divide exception ---
mov ebx,31 ; Set exit status 31 (instead of real handling)
.exit: ; --- Exit the program ---
mov eax,1 ; Load the syscall number for exit
int 0x80 ; Exit back to the system
Волшебные числа для компактности кода здесь.
Перед инструкцией idiv esp 0xffffcc00
, При входе в обработчик сигнала, esp 0xffffc52c
, Довольно много вещей было помещено в стек! Существует множество информации о __NR_sigreturn. Мне не повезло, пытаясь использовать его. ret
инструкция в обработчике просто возвращает меня к инструкции idiv, на этот раз без обработчика.
Любые идеи о том, что я могу сделать на .handle
ярлык, чтобы безопасно вернуться в магистраль?
(Я знаю, что sigaction доступен, но я хотел бы понять, что происходит в этой ситуации.)
1 ответ
Просто ret
вернется, чтобы повторить попытку ошибочной инструкции. Когда используешь sigaction
зарегистрировать обработчик сигнала с флагом SA_SIGINFO
третий аргумент является указателем на ucontext_t
который содержит сохраненное состояние, которое может быть изменено.