Implement _Exit(3).

Change-Id: Ida6ac844cc87d38c9645b197dd8188bb73e27dbe
diff --git a/libc/SYSCALLS.TXT b/libc/SYSCALLS.TXT
index e597b2f..220c713 100644
--- a/libc/SYSCALLS.TXT
+++ b/libc/SYSCALLS.TXT
@@ -308,7 +308,7 @@
 
 int eventfd:eventfd2(unsigned int, int)  all
 
-void _exit:exit_group(int)  all
+void _exit|_Exit:exit_group(int)  all
 void __exit:exit(int)  all
 
 int futex(void*, int, int, void*, void*, int)  all
diff --git a/libc/arch-arm/syscalls/_exit.S b/libc/arch-arm/syscalls/_exit.S
index 1a6b35d..581b340 100644
--- a/libc/arch-arm/syscalls/_exit.S
+++ b/libc/arch-arm/syscalls/_exit.S
@@ -12,3 +12,6 @@
     neg     r0, r0
     b       __set_errno
 END(_exit)
+
+    .globl _Exit
+    .equ _Exit, _exit
diff --git a/libc/arch-arm64/syscalls/_exit.S b/libc/arch-arm64/syscalls/_exit.S
index 24b7b17..40ada48 100644
--- a/libc/arch-arm64/syscalls/_exit.S
+++ b/libc/arch-arm64/syscalls/_exit.S
@@ -19,3 +19,6 @@
 
     ret
 END(_exit)
+
+    .globl _Exit
+    .equ _Exit, _exit
diff --git a/libc/arch-mips/syscalls/_exit.S b/libc/arch-mips/syscalls/_exit.S
index 5a0877d..f546b66 100644
--- a/libc/arch-mips/syscalls/_exit.S
+++ b/libc/arch-mips/syscalls/_exit.S
@@ -17,3 +17,6 @@
     nop
     .set reorder
 END(_exit)
+
+    .globl _Exit
+    .equ _Exit, _exit
diff --git a/libc/arch-mips64/syscalls/_exit.S b/libc/arch-mips64/syscalls/_exit.S
index 9b108a6..eb84def 100644
--- a/libc/arch-mips64/syscalls/_exit.S
+++ b/libc/arch-mips64/syscalls/_exit.S
@@ -23,3 +23,6 @@
     move ra, t0
     .set pop
 END(_exit)
+
+    .globl _Exit
+    .equ _Exit, _exit
diff --git a/libc/arch-x86/syscalls/_exit.S b/libc/arch-x86/syscalls/_exit.S
index 2ff5faf..793c9d5 100644
--- a/libc/arch-x86/syscalls/_exit.S
+++ b/libc/arch-x86/syscalls/_exit.S
@@ -20,3 +20,6 @@
     popl    %ebx
     ret
 END(_exit)
+
+    .globl _Exit
+    .equ _Exit, _exit
diff --git a/libc/arch-x86_64/syscalls/_exit.S b/libc/arch-x86_64/syscalls/_exit.S
index f40cfe3..3c15897 100644
--- a/libc/arch-x86_64/syscalls/_exit.S
+++ b/libc/arch-x86_64/syscalls/_exit.S
@@ -14,3 +14,6 @@
 1:
     ret
 END(_exit)
+
+    .globl _Exit
+    .equ _Exit, _exit
diff --git a/libc/include/stdlib.h b/libc/include/stdlib.h
index 5dbcb3d..2c797c5 100644
--- a/libc/include/stdlib.h
+++ b/libc/include/stdlib.h
@@ -41,8 +41,9 @@
 #define EXIT_FAILURE 1
 #define EXIT_SUCCESS 0
 
-extern __noreturn void exit(int);
 extern __noreturn void abort(void);
+extern __noreturn void exit(int);
+extern __noreturn void _Exit(int);
 extern int atexit(void (*)(void));
 
 extern char *getenv(const char *);
diff --git a/tests/stdlib_test.cpp b/tests/stdlib_test.cpp
index 3a3fe28..bb395f0 100644
--- a/tests/stdlib_test.cpp
+++ b/tests/stdlib_test.cpp
@@ -202,3 +202,17 @@
 TEST(stdlib, strtold) {
   ASSERT_DOUBLE_EQ(1.23, strtold("1.23", NULL));
 }
+
+TEST(unistd, _Exit) {
+  int pid = fork();
+  ASSERT_NE(-1, pid) << strerror(errno);
+
+  if (pid == 0) {
+    _Exit(99);
+  }
+
+  int status;
+  ASSERT_EQ(pid, waitpid(pid, &status, 0));
+  ASSERT_TRUE(WIFEXITED(status));
+  ASSERT_EQ(99, WEXITSTATUS(status));
+}
diff --git a/tests/unistd_test.cpp b/tests/unistd_test.cpp
index f50c102..da8fd4b 100644
--- a/tests/unistd_test.cpp
+++ b/tests/unistd_test.cpp
@@ -116,3 +116,17 @@
 TEST(unistd, alarm) {
   ASSERT_EQ(0U, alarm(0));
 }
+
+TEST(unistd, _exit) {
+  int pid = fork();
+  ASSERT_NE(-1, pid) << strerror(errno);
+
+  if (pid == 0) {
+    _exit(99);
+  }
+
+  int status;
+  ASSERT_EQ(pid, waitpid(pid, &status, 0));
+  ASSERT_TRUE(WIFEXITED(status));
+  ASSERT_EQ(99, WEXITSTATUS(status));
+}