summaryrefslogtreecommitdiff
path: root/configure
diff options
context:
space:
mode:
authorRich Felker <dalias@aerifal.cx>2015-09-29 02:44:05 +0000
committerRich Felker <dalias@aerifal.cx>2015-09-29 02:44:05 +0000
commitf3a53f095cd8ba108f8ac780da27a5ebbf4b224f (patch)
tree8f31e84a9e7e0e510fffed164235b7a1ca839d0c /configure
parent2a6e1f0f5a8811d08101df0fd72b9baa27ed430c (diff)
downloadmusl-f3a53f095cd8ba108f8ac780da27a5ebbf4b224f.tar.gz
musl-f3a53f095cd8ba108f8ac780da27a5ebbf4b224f.tar.bz2
musl-f3a53f095cd8ba108f8ac780da27a5ebbf4b224f.tar.xz
musl-f3a53f095cd8ba108f8ac780da27a5ebbf4b224f.zip
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.
Diffstat (limited to 'configure')
-rwxr-xr-xconfigure14
1 files changed, 11 insertions, 3 deletions
diff --git a/configure b/configure
index de357bc2..d944a47f 100755
--- 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 \