diff options
author | Rich Felker <dalias@aerifal.cx> | 2014-04-12 00:16:19 -0400 |
---|---|---|
committer | Rich Felker <dalias@aerifal.cx> | 2014-04-12 00:16:19 -0400 |
commit | 83c98aac4c43f9571e8f92a1c795afe02c237d4b (patch) | |
tree | 97e9646a20cf560a7c70ff48fac7f6d564699684 | |
parent | 73c870ed3209b68b5c8c350534508cc9d95a6bcb (diff) | |
download | musl-83c98aac4c43f9571e8f92a1c795afe02c237d4b.tar.gz musl-83c98aac4c43f9571e8f92a1c795afe02c237d4b.tar.xz musl-83c98aac4c43f9571e8f92a1c795afe02c237d4b.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.
-rw-r--r-- | src/internal/syscall.h | 2 |
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, |