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