reaper in C (bbonev)
authorRalph Ronnquist <ralph.ronnquist@gmail.com>
Tue, 29 Mar 2022 01:22:42 +0000 (12:22 +1100)
committerRalph Ronnquist <ralph.ronnquist@gmail.com>
Tue, 29 Mar 2022 01:22:42 +0000 (12:22 +1100)
src/Makefile [new file with mode: 0644]
src/reaper.c [new file with mode: 0644]
src/reaper_nsl.c [new file with mode: 0644]

diff --git a/src/Makefile b/src/Makefile
new file mode 100644 (file)
index 0000000..82cffb0
--- /dev/null
@@ -0,0 +1,22 @@
+all: reaper reaperc reapernsl
+
+STRIP?=strip
+
+reaper: reaper.asm
+       fasm $^ -s $@.fas $@
+       chmod a+x $@
+
+reaper.map: reaper
+       ./fas2txt.lsp $@.fas > $@.map
+
+reaperc: reaper.c
+       $(CC) -O3 -flto -o $@ $^
+       $(STRIP) $@
+
+reapernsl: reaper_nsl.c
+       #$(CC) -O3 -flto -nostdlib -static -fdata-sections -ffunction-sections -o $@ $^ -Wl,--gc-sections -Wl,--strip-all -Wl,--build-id=none
+       $(CC) -O3 -flto -nostdlib -static -o $@ $^ -Wl,--build-id=none
+       $(STRIP) --remove-section=.comment $@
+
+clean:
+       rm -f reaper reaperc reaper.fas reaper.map reapernsl
diff --git a/src/reaper.c b/src/reaper.c
new file mode 100644 (file)
index 0000000..f1c2f9a
--- /dev/null
@@ -0,0 +1,19 @@
+#include <errno.h>
+#include <signal.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/wait.h>
+#include <sys/types.h>
+
+int main(void) {
+       sigset_t set;
+       siginfo_t status;
+
+       if (getpid()!=1)
+               return 1;
+       sigfillset(&set);
+       sigprocmask(SIG_BLOCK,&set,NULL);
+       memset(&status,0,sizeof status);
+       while (-ECHILD!=waitid(P_ALL,0,&status,WEXITED));
+       return 1;
+}
diff --git a/src/reaper_nsl.c b/src/reaper_nsl.c
new file mode 100644 (file)
index 0000000..b788562
--- /dev/null
@@ -0,0 +1,36 @@
+//#include <errno.h>
+//#include <signal.h>
+//#include <string.h>
+//#include <unistd.h>
+//#include <sys/wait.h>
+//#include <sys/types.h>
+
+//int main(void) {
+//     sigset_t set;
+//     siginfo_t status;
+//
+//     if (getpid()!=1)
+//             return 1;
+//     sigfillset(&set);
+//     sigprocmask(SIG_BLOCK,&set,NULL);
+//     memset(&status,0,sizeof status);
+//     while (-ECHILD!=waitid(P_ALL,0,&status,WEXITED));
+//     return 1;
+//}
+
+#define _GNU_SOURCE
+
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/syscall.h>
+#include <linux/unistd.h>
+
+static inline void nsl_exit1(void) {
+       asm("mov $60,%eax");
+       asm("mov $1,%rdi");
+       asm("syscall");
+}
+
+__attribute__((naked)) void _start(void) {
+       nsl_exit1();
+}