mirror of https://github.com/hak5/openwrt-owl.git
56 lines
2.1 KiB
Diff
56 lines
2.1 KiB
Diff
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")))
|