musl: backport a fix that caused the wrong relocations to be emitted on some architectures
Signed-off-by: Felix Fietkau <nbd@openwrt.org> SVN-Revision: 48444
This commit is contained in:
parent
57690041fa
commit
d0077103b7
1 changed files with 55 additions and 0 deletions
|
@ -0,0 +1,55 @@
|
|||
From: Rich Felker <dalias@aerifal.cx>
|
||||
Date: Tue, 29 Sep 2015 02:44:05 +0000
|
||||
Subject: [PATCH] eliminate protected-visibility data in libc.so with vis.h
|
||||
preinclude
|
||||
|
||||
some newer binutils versions print scary warnings about protected data
|
||||
because most gcc versions fail to produce the right address
|
||||
references/relocations for such data that might be subject to copy
|
||||
relocations. originally vis.h explicitly assigned default visibility
|
||||
to all public data symbols to avoid this issue, but commit
|
||||
b8dda24fe1caa901a99580f7a52defb95aedb67c removed this treatment for
|
||||
stdin/out/err to work around a gcc 3.x bug, and since they don't
|
||||
actually need it (because taking their addresses is not valid C).
|
||||
|
||||
instead, a check for the gcc 3.x bug is added to the configure check
|
||||
for vis.h preinclude support; this feature will simply be disabled
|
||||
when using a buggy version of gcc.
|
||||
---
|
||||
|
||||
--- a/configure
|
||||
+++ b/configure
|
||||
@@ -476,10 +476,18 @@ if test "x$visibility" = xauto ; then
|
||||
# - the -include option
|
||||
# - the attributes/pragmas used in vis.h
|
||||
# - linking code that takes the address of protected symbols
|
||||
+# - gcc 3.x bug that wrongly claims declarations mismatch
|
||||
printf "checking whether global visibility preinclude works... "
|
||||
-echo 'int (*fp)(void);' > "$tmpc"
|
||||
-echo 'int foo(void) { }' >> "$tmpc"
|
||||
-echo 'int bar(void) { fp = foo; return foo(); }' >> "$tmpc"
|
||||
+cat > "$tmpc" <<EOF
|
||||
+__attribute__((__visibility__("default")))
|
||||
+extern struct a *const x;
|
||||
+typedef struct a b;
|
||||
+extern b *const x;
|
||||
+b *const x;
|
||||
+int (*fp)(void);
|
||||
+int foo(void) { }
|
||||
+int bar(void) { fp = foo; return foo(); }
|
||||
+EOF
|
||||
if $CC $CFLAGS_C99FSE $CPPFLAGS $CFLAGS \
|
||||
-DSHARED -fPIC -I./src/internal -include vis.h \
|
||||
-nostdlib -shared -Wl,-Bsymbolic-functions \
|
||||
--- a/src/internal/vis.h
|
||||
+++ b/src/internal/vis.h
|
||||
@@ -12,6 +12,9 @@
|
||||
* exported data symbols. */
|
||||
|
||||
__attribute__((__visibility__("default")))
|
||||
+extern struct _IO_FILE *const stdin, *const stdout, *const stderr;
|
||||
+
|
||||
+__attribute__((__visibility__("default")))
|
||||
extern int optind, opterr, optopt, optreset, __optreset, getdate_err, h_errno, daylight, __daylight, signgam, __signgam;
|
||||
|
||||
__attribute__((__visibility__("default")))
|
Loading…
Reference in a new issue