summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRich Felker <dalias@aerifal.cx>2014-07-06 22:56:25 -0400
committerRich Felker <dalias@aerifal.cx>2014-07-06 22:56:25 -0400
commitd96b12b755483208673fb05e2e60a15d3822752d (patch)
tree1a8eac2308bc9348b23417a462a271570d1ceea3
parentea496d6c63ecbb5ea475111808e5c0f799354450 (diff)
downloadmusl-d96b12b755483208673fb05e2e60a15d3822752d.tar.gz
musl-d96b12b755483208673fb05e2e60a15d3822752d.tar.bz2
musl-d96b12b755483208673fb05e2e60a15d3822752d.tar.xz
musl-d96b12b755483208673fb05e2e60a15d3822752d.zip
rework cancellation weak alias logic not to depend on archive order
if the order of object files in the static archive libc.a was not respected by the linker, the old logic could wrongly cause POSIX symbols outside of the ISO C namespace to be pulled into pure C programs. this should not happen with well-behaved linkers, but relying on the link order was a bad idea anyway. files are renamed to better reflect their contents now that they don't need names to control their order as members in the archive file.
-rw-r--r--src/thread/__syscall_cp.c (renamed from src/thread/cancel_dummy.c)9
-rw-r--r--src/thread/pthread_cancel.c (renamed from src/thread/cancel_impl.c)2
-rw-r--r--src/thread/pthread_testcancel.c7
3 files changed, 12 insertions, 6 deletions
diff --git a/src/thread/cancel_dummy.c b/src/thread/__syscall_cp.c
index b630b02c..a48cee9b 100644
--- a/src/thread/cancel_dummy.c
+++ b/src/thread/__syscall_cp.c
@@ -8,10 +8,11 @@ static long sccp(syscall_arg_t nr,
return (__syscall)(nr, u, v, w, x, y, z);
}
-weak_alias(sccp, __syscall_cp);
+weak_alias(sccp, __syscall_cp_c);
-static void dummy()
+long (__syscall_cp)(syscall_arg_t nr,
+ syscall_arg_t u, syscall_arg_t v, syscall_arg_t w,
+ syscall_arg_t x, syscall_arg_t y, syscall_arg_t z)
{
+ return __syscall_cp_c(nr, u, v, w, x, y, z);
}
-
-weak_alias(dummy, __testcancel);
diff --git a/src/thread/cancel_impl.c b/src/thread/pthread_cancel.c
index 069b2796..e3d291ee 100644
--- a/src/thread/cancel_impl.c
+++ b/src/thread/pthread_cancel.c
@@ -13,7 +13,7 @@ long __syscall_cp_asm(volatile void *, syscall_arg_t,
syscall_arg_t, syscall_arg_t, syscall_arg_t,
syscall_arg_t, syscall_arg_t, syscall_arg_t);
-long (__syscall_cp)(syscall_arg_t nr,
+long __syscall_cp_c(syscall_arg_t nr,
syscall_arg_t u, syscall_arg_t v, syscall_arg_t w,
syscall_arg_t x, syscall_arg_t y, syscall_arg_t z)
{
diff --git a/src/thread/pthread_testcancel.c b/src/thread/pthread_testcancel.c
index 33238c0f..ba5f7c6c 100644
--- a/src/thread/pthread_testcancel.c
+++ b/src/thread/pthread_testcancel.c
@@ -1,6 +1,11 @@
#include "pthread_impl.h"
+#include "libc.h"
-void __testcancel(void);
+static void dummy()
+{
+}
+
+weak_alias(dummy, __testcancel);
void pthread_testcancel()
{