about summary refs log tree commit diff
diff options
context:
space:
mode:
authorRich Felker <dalias@aerifal.cx>2014-04-12 00:16:19 -0400
committerRich Felker <dalias@aerifal.cx>2014-04-16 02:46:05 -0400
commitf82b05c496b0597d35e437a15105ee796bc3a8d6 (patch)
tree63cc563a005bbfde2c2b35d09a8a7dde27b5b99f
parent67dc1f311646c50f3f1c281b7c345bb45401f17d (diff)
downloadmusl-f82b05c496b0597d35e437a15105ee796bc3a8d6.tar.gz
musl-f82b05c496b0597d35e437a15105ee796bc3a8d6.tar.xz
musl-f82b05c496b0597d35e437a15105ee796bc3a8d6.zip
use hidden visibility rather than protected for syscall internals
the use of visibility at all is purely an optimization to avoid the
need for the caller to load the GOT register or similar to prepare for
a call via the PLT. there is no reason for these symbols to be
externally visible, so hidden works just as well as protected, and
using protected visibility is undesirable due to toolchain bugs and
the lack of testing it receives.

in particular, GCC's microblaze target is known to generate symbolic
relocations in the GOT for functions with protected visibility. this
in turn results in a dynamic linker which crashes under any nontrivial
usage that requires making a syscall before symbolic relocations are
processed.

(cherry picked from commit 83c98aac4c43f9571e8f92a1c795afe02c237d4b)
-rw-r--r--src/internal/syscall.h2
1 files changed, 1 insertions, 1 deletions
diff --git a/src/internal/syscall.h b/src/internal/syscall.h
index 88fc89c9..dcfae003 100644
--- a/src/internal/syscall.h
+++ b/src/internal/syscall.h
@@ -10,7 +10,7 @@ typedef long syscall_arg_t;
 #endif
 
 #if defined(__PIC__) && (100*__GNUC__+__GNUC_MINOR__ >= 303)
-__attribute__((visibility("protected")))
+__attribute__((visibility("hidden")))
 #endif
 long __syscall_ret(unsigned long), __syscall(syscall_arg_t, ...),
 	__syscall_cp(syscall_arg_t, syscall_arg_t, syscall_arg_t, syscall_arg_t,