format elf64 executable
entry main
- ;; A data segment
- segment readable writable
+;;; Using mixed Data and Code segment for size squeeze
- ;; sigset_t set -- bit mask for sigprocmask
-set: dq -1 ; all bits set
-
-;;; siginfo_t status -- all ignored
-status: rept 16 { dq 0 }
-status$end:
-
-;;; A code segment
- segment readable executable
+ segment readable writable executable
;;; Main entry point
main:
;; if (getpid() != 1) exit 1;
- mov rax, qword 39
+ xor rax, rax
+ mov al, 39
+ ; rax=39
syscall
- cmp rax, 1
- je pid_1
-
- ;; exit(1)
- mov rdi, qword 1
- mov rax, qword 60
- syscall ; exit program
+
+ dec rax
+ jnz exit ; exit(1)
;; Continue here for pid 1 only
pid_1:
;; Block all signals
;; sigprocmask(SIG_BLOCK, &set, 0);
- xor rdi, rdi ; SIG_BLOCK = 0
+ ; rax is already 0
+ mov rdi, rax ; SIG_BLOCK = 0
lea rsi, [set] ; *set
- xor rdx, rdx ; 0
- xor r10, r10 ; 0
- mov rax, qword 14 ; sys_rt_sigprocmask
+ mov rdx, rax ; 0
+ mov r10, rax ; 0
+ mov al, 14 ; sys_rt_sigprocmask
+ ; rax=14, rdi=0, rsi=[set], rdx=0, r10=0
syscall
;; loop waiting for children, and reading their exit status
;; first clear status area again
cld
xor rax, rax
- lea rsi, [status$end]
lea rdi, [status]
-clear: stosq
- cmp rdi,rsi
- jl clear
+ mov rdx, rdi
+ mov rcx, rax
+ mov cl, status$end-status
+ rep stosq
;; waitid( idtype, id, *status, options )
- xor rdi, rdi ; idtype_t idtype = P_ALL = 0
- xor rsi, rsi ; int id = 0
- lea rdx, [status] ; siginfo_t* = &status
- mov r10, 4 ; int options = WEXITED = 4
- mov rax, 247 ; waitid
+ mov rdi, rax ; idtype_t idtype = P_ALL = 0
+ mov rsi, rax ; int id = 0
+ ;rdx = [status] ; siginfo_t* = &status
+ mov al, 4 ; int options = WEXITED = 4
+ mov r10, rax
+ mov al, 247 ; waitid
+ ; rax=247, rdi=0, rsi=0, rdx=[status], r10=4
syscall
- cmp rax,-10 ; -10 = ECHILD (no child processes)
- jne reaper
-
+ add rax, 10 ; -10 = ECHILD (no child processes)
+ jnz reaper
+
+exit: ; exit(1)
+ xor rax, rax
mov rdi, rax
- mov rax, qword 60
- syscall ; exit program
+ inc rdi
+ mov al, 60
+ syscall ; exit(1) program
-;;; The rest of memory is not executable
- segment readable writable
+ ;; sigset_t set -- bit mask for sigprocmask
+set:
+ dq -1 ; all bits set
+
+;;; siginfo_t status -- all ignored
+status:
+ rept 16 { dq ? }
+status$end: