Merge "Implement _Exit(3)."
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));
+}