Hide symbols with gcc.
authorMiroslav Lichvar <mlichvar@redhat.com>
Mon, 3 Dec 2012 20:04:57 +0000 (21:04 +0100)
committerErik de Castro Lopo <erikd@mega-nerd.com>
Tue, 4 Dec 2012 06:45:06 +0000 (17:45 +1100)
With gcc >= 4 and ELF, set default visibility to hidden and make visible
only the symbols with FLAC_API or FLACPP_API.

A convenience libFLAC-static.la is created for test_libFLAC as it
depends on the hidden symbols.

configure.ac
include/FLAC++/export.h
include/FLAC/export.h
src/libFLAC/Makefile.am
src/test_libFLAC/Makefile.am

index f4a31e4..3899d68 100644 (file)
@@ -360,9 +360,15 @@ if test x$ac_cv_c_compiler_gnu = xyes ; then
        if test x$enable_gcc_werror = "xyes" ; then
                CFLAGS="-Wall -Wextra -Werror $CFLAGS"
                CXXFLAGS="-Wall -Wextra -Werror $CXXFLAGS"
-               fi
        fi
 
+       if test "$GCC_MAJOR_VERSION" -ge 4 && test "$OBJ_FORMAT" = elf; then
+               CPPFLAGS="$CPPFLAGS -DFLAC__USE_VISIBILITY_ATTR"
+               CFLAGS="$CFLAGS -fvisibility=hidden"
+               CXXFLAGS="$CXXFLAGS -fvisibility=hidden"
+       fi
+fi
+
 
 #@@@
 AM_CONDITIONAL(FLaC__HAS_AS__TEMPORARILY_DISABLED, test "yes" = "no")
index e3bc51f..d3bd136 100644 (file)
  * \{
  */
 
-#if defined(FLAC__NO_DLL) || !defined(_MSC_VER)
+#if defined(FLAC__NO_DLL)
 #define FLACPP_API
 
-#else
-
+#elif defined(_MSC_VER)
 #ifdef FLACPP_API_EXPORTS
 #define        FLACPP_API      _declspec(dllexport)
 #else
 #define FLACPP_API     _declspec(dllimport)
-
 #endif
+
+#elif defined(FLAC__USE_VISIBILITY_ATTR)
+#define FLACPP_API __attribute__ ((visibility ("default")))
+
+#else
+#define FLACPP_API
+
 #endif
 
 /* These #defines will mirror the libtool-based library version number, see
index d239b9b..312746d 100644 (file)
  * \{
  */
 
-#if defined(FLAC__NO_DLL) || !defined(_MSC_VER)
+#if defined(FLAC__NO_DLL)
 #define FLAC_API
 
-#else
-
+#elif defined(_MSC_VER)
 #ifdef FLAC_API_EXPORTS
 #define        FLAC_API        _declspec(dllexport)
 #else
 #define FLAC_API       _declspec(dllimport)
-
 #endif
+
+#elif defined(FLAC__USE_VISIBILITY_ATTR)
+#define FLAC_API __attribute__ ((visibility ("default")))
+
+#else
+#define FLAC_API
+
 #endif
 
 /** These #defines will mirror the libtool-based library version number, see
index b20e21a..a63a3d0 100644 (file)
@@ -30,6 +30,7 @@
 
 AM_CPPFLAGS = -I$(top_builddir) -I$(srcdir)/include -I$(top_srcdir)/include
 lib_LTLIBRARIES = libFLAC.la
+noinst_LTLIBRARIES = libFLAC-static.la
 if DEBUG
 DEBUGCFLAGS = -DFLAC__OVERFLOW_DETECT
 endif
@@ -106,7 +107,8 @@ extra_ogg_sources = \
 endif
 # see 'http://www.gnu.org/software/libtool/manual/libtool.html#Libtool-versioning' for numbering convention
 libFLAC_la_LDFLAGS = -version-info 10:0:2 $(LOCAL_EXTRA_LDFLAGS) @LT_NO_UNDEFINED@
-libFLAC_la_SOURCES = \
+
+libFLAC_sources = \
        bitmath.c \
        bitreader.c \
        bitwriter.c \
@@ -125,3 +127,9 @@ libFLAC_la_SOURCES = \
        stream_encoder_framing.c \
        window.c \
        $(extra_ogg_sources)
+
+libFLAC_la_SOURCES = $(libFLAC_sources)
+
+# needed for test_libFLAC
+libFLAC_static_la_LIBADD = $(LOCAL_EXTRA_LIBADD)
+libFLAC_static_la_SOURCES = $(libFLAC_sources)
index 91a57fb..ed9aee8 100644 (file)
@@ -27,7 +27,7 @@ test_libFLAC_LDADD = \
        $(top_builddir)/src/share/grabbag/libgrabbag.la \
        $(top_builddir)/src/share/replaygain_analysis/libreplaygain_analysis.la \
        $(top_builddir)/src/test_libs_common/libtest_libs_common.la \
-       $(top_builddir)/src/libFLAC/libFLAC.la \
+       $(top_builddir)/src/libFLAC/libFLAC-static.la \
        @OGG_LIBS@ \
        -lm