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
b8dda24fe1 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.
This commit is contained in:
Rich Felker 2015-09-29 02:44:05 +00:00
parent 2a6e1f0f5a
commit f3a53f095c
2 changed files with 14 additions and 3 deletions

14
configure vendored
View File

@ -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 \

View File

@ -11,6 +11,9 @@
* fail to support copy relocations for protected data, so exclude all
* 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;