about summary refs log tree commit diff
path: root/src/exit
diff options
context:
space:
mode:
authorRich Felker <dalias@aerifal.cx>2014-07-16 20:44:22 -0400
committerRich Felker <dalias@aerifal.cx>2014-07-16 20:44:22 -0400
commitc463e11eda8326aacee2ac1d516954a9574a2dcd (patch)
treed184ab694ab4e47712752bfb78601609676de9fb /src/exit
parent781f26bc92b0710ac025fae3be42f5575468f1a5 (diff)
downloadmusl-c463e11eda8326aacee2ac1d516954a9574a2dcd.tar.gz
musl-c463e11eda8326aacee2ac1d516954a9574a2dcd.tar.xz
musl-c463e11eda8326aacee2ac1d516954a9574a2dcd.zip
simplify __stdio_exit static linking logic
the purpose of this logic is to avoid linking __stdio_exit unless any
stdio reads (which might require repositioning the file offset at exit
time) or writes (which might require flushing at exit time) could have
been performed.

previously, exit called two wrapper functions for __stdio_exit named
__flush_on_exit and __seek_on_exit. both of these functions actually
performed both tasks (seek and flushing) by calling the underlying
__stdio_exit. in order to avoid doing this twice, an overridable data
object __towrite_used was used to cause __seek_on_exit to act as a nop
when __towrite was linked.

now, exit only makes one call, directly to __stdio_exit. this is
satisfiable by a weak dummy definition in exit.c, but the real
definition is pulled in by either __toread.c or __towrite.c through
their referencing a symbol which is defined only in __stdio_exit.c.
Diffstat (limited to 'src/exit')
-rw-r--r--src/exit/exit.c9
1 files changed, 4 insertions, 5 deletions
diff --git a/src/exit/exit.c b/src/exit/exit.c
index 695bdc05..27fb3e29 100644
--- a/src/exit/exit.c
+++ b/src/exit/exit.c
@@ -6,10 +6,10 @@ static void dummy()
 {
 }
 
-/* __toread.c, __towrite.c, and atexit.c override these */
+/* atexit.c and __stdio_exit.c override these. the latter is linked
+ * as a consequence of linking either __toread.c or __towrite.c. */
 weak_alias(dummy, __funcs_on_exit);
-weak_alias(dummy, __flush_on_exit);
-weak_alias(dummy, __seek_on_exit);
+weak_alias(dummy, __stdio_exit);
 
 #ifndef SHARED
 weak_alias(dummy, _fini);
@@ -28,8 +28,7 @@ _Noreturn void exit(int code)
 	_fini();
 #endif
 
-	__flush_on_exit();
-	__seek_on_exit();
+	__stdio_exit();
 
 	_Exit(code);
 	for(;;);