Follow @Openwall on Twitter for new release announcements and other news
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date: Sat, 16 Feb 2013 00:25:07 +0100
From: Jens Gustedt <Jens.Gustedt@...ia.fr>
To: musl@...ts.openwall.com
Subject: [PATCH 5/5] Use the weak functions that do nothing as aliases for
 the default actions

 - this unifies the coding of such functions and clearly marks the intent
 - all such functions with a same type may be overlayed by the
   compiler. thereby only three such functions must be realized over all
   the musl C library
 - when compiled with -ffunction-sections and linked with
   -Wl,--gc-sections the gcc toolchain is in fact capable to rip
   superfluous copies from the final libc.so or from the statically
   linked executable.

2	5	src/aio/aio_readwrite.c
2	4	src/env/__init_security.c
4	7	src/exit/exit.c
2	2	src/exit/quick_exit.c
4	4	src/mman/mmap.c
4	4	src/mman/munmap.c
2	5	src/process/fork.c
3	5	src/process/posix_spawn.c
3	5	src/process/system.c
2	5	src/thread/cancel_dummy.c
6	3	src/thread/cancellation.c
4	6	src/thread/pthread_create.c
2	4	src/thread/pthread_join.c

diff --git a/src/aio/aio_readwrite.c b/src/aio/aio_readwrite.c
index e4c95aa..4862365 100644
--- a/src/aio/aio_readwrite.c
+++ b/src/aio/aio_readwrite.c
@@ -5,11 +5,8 @@
 #include <limits.h>
 #include "pthread_impl.h"
 
-static void dummy(void)
-{
-}
-
-weak_alias(dummy, __aio_wake);
+WEAK_PROVIDE_VOID;
+weak_alias(__weak_dummy_void, __aio_wake);
 
 static void notify_signal(struct sigevent *sev)
 {
diff --git a/src/env/__init_security.c b/src/env/__init_security.c
index 91b9b10..5b98623 100644
--- a/src/env/__init_security.c
+++ b/src/env/__init_security.c
@@ -6,10 +6,8 @@
 #include "libc.h"
 #include "atomic.h"
 
-static void dummy(void *ent)
-{
-}
-weak_alias(dummy, __init_ssp);
+WEAK_PROVIDE_VOIDP;
+weak_alias(__weak_dummy_voidp, __init_ssp);
 
 void __init_security(size_t *aux)
 {
diff --git a/src/exit/exit.c b/src/exit/exit.c
index e4932b5..a866e02 100644
--- a/src/exit/exit.c
+++ b/src/exit/exit.c
@@ -5,14 +5,11 @@
 #include "atomic.h"
 #include "syscall.h"
 
-static void dummy()
-{
-}
-
 /* __toread.c, __towrite.c, and atexit.c override these */
-weak_alias(dummy, __funcs_on_exit);
-weak_alias(dummy, __flush_on_exit);
-weak_alias(dummy, __seek_on_exit);
+WEAK_PROVIDE_VOID;
+weak_alias(__weak_dummy_void, __funcs_on_exit);
+weak_alias(__weak_dummy_void, __flush_on_exit);
+weak_alias(__weak_dummy_void, __seek_on_exit);
 
 _Noreturn void exit(int code)
 {
diff --git a/src/exit/quick_exit.c b/src/exit/quick_exit.c
index 1175d80..79c389f 100644
--- a/src/exit/quick_exit.c
+++ b/src/exit/quick_exit.c
@@ -3,8 +3,8 @@
 #include "atomic.h"
 #include "libc.h"
 
-static void dummy() { }
-weak_alias(dummy, __funcs_on_quick_exit);
+WEAK_PROVIDE_VOID;
+weak_alias(__weak_dummy_void, __funcs_on_quick_exit);
 
 _Noreturn void quick_exit(int code)
 {
diff --git a/src/mman/mmap.c b/src/mman/mmap.c
index e99271f..2391eb7 100644
--- a/src/mman/mmap.c
+++ b/src/mman/mmap.c
@@ -5,10 +5,10 @@
 #include "syscall.h"
 #include "libc.h"
 
-static void dummy1(int x) { }
-static void dummy0(void) { }
-weak_alias(dummy1, __vm_lock);
-weak_alias(dummy0, __vm_unlock);
+WEAK_PROVIDE_INT;
+WEAK_PROVIDE_VOID;
+weak_alias(__weak_dummy_int, __vm_lock);
+weak_alias(__weak_dummy_void, __vm_unlock);
 
 #define OFF_MASK ((-0x2000ULL << (8*sizeof(long)-1)) | 0xfff)
 
diff --git a/src/mman/munmap.c b/src/mman/munmap.c
index 91aefd4..2c18e7c 100644
--- a/src/mman/munmap.c
+++ b/src/mman/munmap.c
@@ -3,10 +3,10 @@
 #include "syscall.h"
 #include "libc.h"
 
-static void dummy1(int x) { }
-static void dummy0(void) { }
-weak_alias(dummy1, __vm_lock);
-weak_alias(dummy0, __vm_unlock);
+WEAK_PROVIDE_INT;
+WEAK_PROVIDE_VOID;
+weak_alias(__weak_dummy_int, __vm_lock);
+weak_alias(__weak_dummy_void, __vm_unlock);
 
 int __munmap(void *start, size_t len)
 {
diff --git a/src/process/fork.c b/src/process/fork.c
index fb8a430..4a83bc3 100644
--- a/src/process/fork.c
+++ b/src/process/fork.c
@@ -4,11 +4,8 @@
 #include "libc.h"
 #include "pthread_impl.h"
 
-static void dummy(int x)
-{
-}
-
-weak_alias(dummy, __fork_handler);
+WEAK_PROVIDE_INT;
+weak_alias(__weak_dummy_int,  __fork_handler);
 
 pid_t fork(void)
 {
diff --git a/src/process/posix_spawn.c b/src/process/posix_spawn.c
index dd45012..e1668b7 100644
--- a/src/process/posix_spawn.c
+++ b/src/process/posix_spawn.c
@@ -10,11 +10,9 @@
 #include "fdop.h"
 #include "libc.h"
 
-static void dummy_0()
-{
-}
-weak_alias(dummy_0, __acquire_ptc);
-weak_alias(dummy_0, __release_ptc);
+WEAK_PROVIDE_VOID;
+weak_alias(__weak_dummy_void, __acquire_ptc);
+weak_alias(__weak_dummy_void, __release_ptc);
 
 struct args {
 	int p[2];
diff --git a/src/process/system.c b/src/process/system.c
index 4232bef..6946b35 100644
--- a/src/process/system.c
+++ b/src/process/system.c
@@ -7,11 +7,9 @@
 #include "pthread_impl.h"
 #include "libc.h"
 
-static void dummy_0()
-{
-}
-weak_alias(dummy_0, __acquire_ptc);
-weak_alias(dummy_0, __release_ptc);
+WEAK_PROVIDE_VOID;
+weak_alias(__weak_dummy_void, __acquire_ptc);
+weak_alias(__weak_dummy_void, __release_ptc);
 
 extern char **__environ;
 
diff --git a/src/thread/cancel_dummy.c b/src/thread/cancel_dummy.c
index 7246970..655a222 100644
--- a/src/thread/cancel_dummy.c
+++ b/src/thread/cancel_dummy.c
@@ -6,8 +6,5 @@ long (__syscall_cp)(long nr, long u, long v, long w, long x, long y, long z)
 	return (__syscall)(nr, u, v, w, x, y, z);
 }
 
-static void dummy()
-{
-}
-
-weak_alias(dummy, __testcancel);
+WEAK_PROVIDE_VOID;
+weak_alias(__weak_dummy_void, __testcancel);
diff --git a/src/thread/cancellation.c b/src/thread/cancellation.c
index 9b21764..fa3208e 100644
--- a/src/thread/cancellation.c
+++ b/src/thread/cancellation.c
@@ -1,10 +1,13 @@
 #include "pthread_impl.h"
 
-static void dummy(struct __ptcb *cb)
+/* The following two are overwritten by pthread_create.c */
+_Weak
+void __weak_dummy_ptcb(struct __ptcb *cb)
 {
 }
-weak_alias(dummy, __do_cleanup_push);
-weak_alias(dummy, __do_cleanup_pop);
+
+weak_alias(__weak_dummy_ptcb, __do_cleanup_push);
+weak_alias(__weak_dummy_ptcb, __do_cleanup_pop);
 
 void _pthread_cleanup_push(struct __ptcb *cb, void (*f)(void *), void *x)
 {
diff --git a/src/thread/pthread_create.c b/src/thread/pthread_create.c
index 3f30116..77ca0cf 100644
--- a/src/thread/pthread_create.c
+++ b/src/thread/pthread_create.c
@@ -2,12 +2,10 @@
 #include "stdio_impl.h"
 #include <sys/mman.h>
 
-static void dummy_0()
-{
-}
-weak_alias(dummy_0, __acquire_ptc);
-weak_alias(dummy_0, __release_ptc);
-weak_alias(dummy_0, __pthread_tsd_run_dtors);
+WEAK_PROVIDE_VOID;
+weak_alias(__weak_dummy_void, __acquire_ptc);
+weak_alias(__weak_dummy_void, __release_ptc);
+weak_alias(__weak_dummy_void, __pthread_tsd_run_dtors);
 
 _Noreturn void pthread_exit(void *result)
 {
diff --git a/src/thread/pthread_join.c b/src/thread/pthread_join.c
index 719c91c..87eed62 100644
--- a/src/thread/pthread_join.c
+++ b/src/thread/pthread_join.c
@@ -1,14 +1,12 @@
 #include "pthread_impl.h"
 #include <sys/mman.h>
 
-static void dummy(void *p)
-{
-}
+WEAK_PROVIDE_VOIDP;
 
 int pthread_join(pthread_t t, void **res)
 {
 	int tmp;
-	while ((tmp = t->tid)) __timedwait(&t->tid, tmp, 0, 0, dummy, 0, 0);
+	while ((tmp = t->tid)) __timedwait(&t->tid, tmp, 0, 0, __weak_dummy_voidp, 0, 0);
 	if (res) *res = t->result;
 	if (t->map_base) munmap(t->map_base, t->map_size);
 	return 0;
-- 
1.7.9.5

Powered by blists - more mailing lists

Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.