syscalls: normalize _exit(2) declerations

exit(3) is implemented by the runtime and performs a number of shutdown
actions before ultimately calling _exit(2) to terminate the program.  We
historically named the syscall table entry `exit` rather than `_exit`,
but this requires special handling in libc/libsys to cause the `_exit`
symbol to exist while implementing `exit` in libc.

Declare the syscall as `_exit` and flow that through the system.

Because syscall(SYS_exit, code) is fairly widely used, allow a
configured extra line in syscall.h to define SYS_exit to SYS__exit.

I've found no external uses of __sys_exit() so I've not bothered to
create a compatability version of this private symbol.

Reviewed by:	imp, kib, emaste
Differential Revision:	https://reviews.freebsd.org/D51672
This commit is contained in:
Brooks Davis
2025-08-08 10:30:16 +01:00
parent fd4cdc438b
commit e7e964cb2e
8 changed files with 12 additions and 7 deletions
-1
View File
@@ -52,7 +52,6 @@ STATICOBJS+= interposing_table.o
PSEUDO= \
__realpathat \
clock_gettime \
exit \
getlogin \
gettimeofday \
sched_getcpu
+3 -3
View File
@@ -44,7 +44,7 @@
#define __libc_interposing error, must not use this variable inside rtld
int __sys_close(int);
void __sys_exit(int) __dead2;
void __sys__exit(int) __dead2;
int __sys_fcntl(int, int, ...);
int __sys_fstat(int fd, struct stat *);
int __sys_fstatat(int, const char *, struct stat *, int);
@@ -70,8 +70,8 @@ int __getosreldate(void);
*/
#define close(fd) __sys_close(fd)
#define _close(fd) __sys_close(fd)
#define exit(status) __sys_exit(status)
#define _exit(status) __sys_exit(status)
#define exit(status) __sys__exit(status)
#define _exit(status) __sys__exit(status)
#define fcntl(fd, cmd, arg) __sys_fcntl(fd, cmd, arg)
#define _fcntl(fd, cmd, arg) __sys_fcntl(fd, cmd, arg)
#define _fstat(fd, sb) __sys_fstat(fd, sb)
+1 -1
View File
@@ -202,7 +202,7 @@ exit_onexit(struct proc *p)
* exit -- death of process.
*/
int
sys_exit(struct thread *td, struct exit_args *uap)
sys__exit(struct thread *td, struct _exit_args *uap)
{
exit1(td, uap->rval, 0);
+1
View File
@@ -1,3 +1,4 @@
libsysmap="../../lib/libsys/syscalls.map"
libsys_h="../../lib/libsys/_libsys.h"
sysmk="../sys/syscall.mk"
syshdr_extra="#define SYS_exit SYS__exit"
+1 -1
View File
@@ -125,7 +125,7 @@
);
}
1 AUE_EXIT STD|CAPENABLED {
void exit(
void _exit(
int rval
);
}
+1
View File
@@ -24,6 +24,7 @@ local util = require("tools.util")
local config = {
sysnames = "syscalls.c",
syshdr = "../sys/syscall.h",
syshdr_extra = nil;
sysmk = "/dev/null",
syssw = "init_sysent.c",
systrace = "systrace_args.c",
+4
View File
@@ -38,6 +38,10 @@ function syscall_h.generate(tbl, config, fh)
-- Write the generated preamble.
gen:preamble("System call numbers.")
if config.syshdr_extra then
gen:write(string.format("%s\n\n", config.syshdr_extra))
end
for _, v in pairs(s) do
local c = v:compatLevel()
if v.num > max then
+1 -1
View File
@@ -39,7 +39,7 @@ function syscalls_map.generate(tbl, config, fh)
for _, v in pairs(s) do
gen:write(v.prolog)
if v:native() and not v.type.NODEF and not v.type.NOLIB then
if v.name ~= "exit" and v.name ~= "vfork" then
if v.name ~= "_exit" and v.name ~= "vfork" then
gen:write(string.format("\t_%s;\n", v.name))
end
gen:write(string.format("\t__sys_%s;\n", v.name))