path: root/configure
diff options
authorRich Felker <>2015-04-19 22:05:29 -0400
committerRich Felker <>2015-04-19 22:05:29 -0400
commitde2b67f8d41e08caa56bf6540277f6561edb647f (patch)
treec0117710aa8a092a7ead36770811d430fca0b477 /configure
parent51fc77c7c03fa0b300e9a609b18f11f0e4db065a (diff)
add optional global visibility override
this is implemented via the build system and does not affect source files. the idea is to use protected or hidden visibility to prevent the compiler from pessimizing function calls within a shared (or position-independent static) libc in the form of overhead setting up for a call through the PLT. the ld-time symbol binding via the -Bsymbolic-functions option already optimized out the PLT itself, but not the code in the caller needed to support a call through the PLT. on some archs this overhead can be substantial; on others it's trivial.
Diffstat (limited to 'configure')
1 files changed, 30 insertions, 1 deletions
diff --git a/configure b/configure
index 41a73b46..0e396941 100755
--- a/configure
+++ b/configure
@@ -27,6 +27,7 @@ Optional features:
--enable-optimize=... optimize listed components for speed over size [auto]
--enable-debug build with debugging information [disabled]
--enable-warnings build with recommended warnings flags [disabled]
+ --enable-visibility use global visibility options to optimize PIC [auto]
--enable-gcc-wrapper build musl-gcc toolchain wrapper [auto]
--disable-shared inhibit building shared library [enabled]
--disable-static inhibit building static library [enabled]
@@ -79,7 +80,7 @@ fi
tryflag () {
printf "checking whether compiler accepts %s... " "$2"
echo "typedef int x;" > "$tmpc"
-if $CC "$2" -c -o /dev/null "$tmpc" >/dev/null 2>&1 ; then
+if $CC $2 -c -o /dev/null "$tmpc" >/dev/null 2>&1 ; then
printf "yes\n"
eval "$1=\"\${$1} \$2\""
eval "$1=\${$1# }"
@@ -124,6 +125,7 @@ target=
@@ -148,6 +150,8 @@ case "$arg" in
--disable-debug|--enable-debug=no) debug=no ;;
--enable-warnings|--enable-warnings=yes) warnings=yes ;;
--disable-warnings|--enable-warnings=no) warnings=no ;;
+--enable-visibility|--enable-visibility=yes) visibility=yes ;;
+--disable-visibility|--enable-visibility=no) visibility=no ;;
--enable-gcc-wrapper|--enable-gcc-wrapper=yes) wrapper=yes ;;
--disable-gcc-wrapper|--enable-gcc-wrapper=no) wrapper=no ;;
--enable-*|--disable-*|--with-*|--without-*|--*dir=*|--build=*) ;;
@@ -415,6 +419,31 @@ tryflag CFLAGS_AUTO -Wno-unknown-pragmas
tryflag CFLAGS_AUTO -Wno-pointer-to-int-cast
+if test "x$visibility" == xauto ; then
+# This test checks toolchain support for several things:
+# - the -include option
+# - the attributes/pragmas used in vis.h
+# - linking code that takes the address of protected symbols
+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"
+if $CC $CFLAGS_C99FSE -I./arch/$ARCH -I src/internal -I./include \
+ $CPPFLAGS $CFLAGS -DSHARED -fPIC -include vis.h \
+ -nostdlib -shared -Wl,-Bsymbolic-functions \
+ -o /dev/null "$tmpc" >/dev/null 2>&1 ; then
+printf "%s\n" "$visibility"
+if test "x$visibility" == xyes ; then
+CFLAGS_AUTO="$CFLAGS_AUTO -include vis.h"
# Some patched GCC builds have these defaults messed up...
tryldflag LDFLAGS_AUTO -Wl,--hash-style=both