1 ;;; This is a "repear" program that merely waits for child processes
2 ;;; to appear and "reap" them, i.e. read their exit status to let them
3 ;;; exit. The program allows an arbitrary first argument that is
4 ;;; indended for identifying the reaper process.
6 format elf64 executable
10 segment readable writable
12 ;; sigset_t set -- bit mask for sigprocmask
13 set: dq -1 ; all bits set
15 ;;; siginfo_t status -- all ignored
16 status: rept 16 { dq 0 }
20 segment readable executable
24 ;; if (getpid() != 1) exit 1;
33 syscall ; exit program
35 ;; Continue here for pid 1 only
38 ;; sigprocmask(SIG_BLOCK, &set, 0);
39 xor rdi, rdi ; SIG_BLOCK = 0
43 mov rax, qword 14 ; sys_rt_sigprocmask
46 ;; loop waiting for children, and reading their exit status
48 ;; first clear status area again
57 ;; waitid( idtype, id, *status, options )
58 xor rdi, rdi ; idtype_t idtype = P_ALL = 0
59 xor rsi, rsi ; int id = 0
60 lea rdx, [status] ; siginfo_t* = &status
61 mov r10, 4 ; int options = WEXITED = 4
65 cmp rax,-10 ; -10 = ECHILD (no child processes)
70 syscall ; exit program
72 ;;; The rest of memory is not executable
73 segment readable writable