Commit 59582a9d authored by Dan Fandrich's avatar Dan Fandrich
Browse files

Implemented --enable-hidden-symbols configure option to enable

-fvisibility=hidden on gcc >= 4.0.  This reduces the size of the libcurl
binary and speeds up dynamic linking by hiding all the internal symbols from
the symbol table.
parent 6246bbc6
Loading
Loading
Loading
Loading
+23 −0
Original line number Diff line number Diff line
@@ -1954,6 +1954,29 @@ AC_HELP_STRING([--disable-cookies],[Disable cookies support]),
       AC_MSG_RESULT(yes)
)

dnl ************************************************************
dnl Enable hiding of internal symbols in library to reduce its size and
dnl speed dynamic linking of applications.  This currently is only supported
dnl on gcc >= 4.0
dnl
AC_MSG_CHECKING([whether to enable hidden symbols in the library])
AC_ARG_ENABLE(hidden-symbols,
AC_HELP_STRING([--enable-hidden-symbols],[Hide internal symbols in library (gcc>=4)])
AC_HELP_STRING([--disable-hidden-symbols],[Leave all symbols with default visibility in library]),
[ case "$enableval" in
  no)
       AC_MSG_RESULT(no)
       ;;
  *)   AC_MSG_RESULT(yes)
       AC_DEFINE(CURL_HIDDEN_SYMBOLS, 1, [to enable hidden symbols])
       AC_SUBST(CURL_HIDDEN_SYMBOLS)
       CFLAGS="$CFLAGS -fvisibility=hidden"
       ;;
  esac ],
       AC_MSG_RESULT(no)
)

dnl ************************************************************
if test "x$ws2" = "xyes"; then

  dnl If ws2_32 is wanted, make sure it is the _last_ lib in LIBS (makes
+22 −4
Original line number Diff line number Diff line
@@ -506,13 +506,17 @@ CROSS COMPILE

       ./configure --host=ARCH-OS

REDUCING SIZE
=============

   There are a number of configure options that can be used to reduce the
   size of libcurl for embedded applications where binary size is an
   important factor.  First, be sure to set the CFLAGS environment variable
   when configuring with any compiler optimization flags to reduce the
   size of the binary.  For gcc, this would mean at minimum:
   important factor.  First, be sure to set the CFLAGS variable when
   configuring with any relevant compiler optimization flags to reduce the
   size of the binary.  For gcc, this would mean at minimum the -Os option
   and probably the -march=X option as well, e.g.:

      env CFLAGS='-Os' ./configure ...
      ./configure CFLAGS='-Os' ...

   Be sure to specify as many --disable- and --without- flags on the configure
   command-line as you can to disable all the libcurl features that you
@@ -526,10 +530,24 @@ CROSS COMPILE
     --disable-crypto-auth (disables HTTP cryptographic authentication)
     --disable-ipv6 (disables support for IPv6)
     --disable-verbose (eliminates debugging strings and error code strings)
     --enable-hidden-symbols (eliminates unneeded symbols in library)
     --without-libidn (disables support for the libidn DNS library)
     --without-ssl (disables support for SSL/TLS)
     --without-zlib (disables support for on-the-fly decompression)

   The GNU linker has a number of options to reduce the size of the libcurl
   dynamic libraries on some platforms even further. Specify them by giving
   the options -Wl,-Bsymbolic and -Wl,-s on the gcc command-line.  
   Be sure also to strip debugging symbols from your binaries after
   compiling using 'strip' (or the appropriate variant if cross-compiling).
   If space is really tight, you may be able to remove some unneeded
   sections of the library using the -R option to objcopy (e.g. the
   .comment section).

   Using these techniques it is possible to create an HTTP-only shared
   libcurl library for i386 Linux platforms that is less than 90 KB in
   size (as of version 7.15.4).

   You may find that statically linking libcurl to your application will
   result in a lower total size.

+11 −1
Original line number Diff line number Diff line
@@ -58,8 +58,18 @@ extern "C" {
#define CURL_EXTERN  __declspec(dllimport)
#endif
#else

#ifdef CURL_HIDDEN_SYMBOLS
/*
 * On gcc >= 4 if -fvisibility=hidden is given then this is used to cause
 * external definitions to be put into the shared library.  It makes no
 * difference to applications whether this is set or not, only the library.
 */
#define CURL_EXTERN __attribute__ ((visibility ("default")))
#else
#define CURL_EXTERN 
#endif
#endif

/*
 * We want the typedef curl_off_t setup for large file support on all