12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455 |
- From: Rich Felker <[email protected]>
- 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")))
|