Subject: [PATCH] add symbol versioning support

[PATCH] add symbol versioning support

From: Cristian Rodríguez <crrodriguez_at_opensuse.org>
Date: Fri, 3 Feb 2012 18:01:21 -0300

---
 Makefile.am             |   11 ++++---
 c-ares.map              |   72 +++++++++++++++++++++++++++++++++++++++++++++++
 configure.ac            |    9 +----
 m4/ld-version-script.m4 |   53 ++++++++++++++++++++++++++++++++++
 4 files changed, 133 insertions(+), 12 deletions(-)
 create mode 100644 c-ares.map
 create mode 100644 m4/ld-version-script.m4
--- c-ares-1.7.5.orig/Makefile.am
+++ c-ares-1.7.5/Makefile.am
@@ -93,12 +93,13 @@ VER=-version-info 2:0:0
 # set age to 0. (c:r:a=0)
 #
 
-if NO_UNDEFINED
-# The -no-undefined flag is crucial for this to build fine on some platforms
-UNDEF = -no-undefined
-endif
+libcares_la_LDFLAGS = -no-undefined $(UNDEF) $(VER)
 
-libcares_la_LDFLAGS = $(UNDEF) $(VER)
+if HAVE_LD_VERSION_SCRIPT
+libcares_la_LDFLAGS += -Wl,--version-script=$(srcdir)/c-ares.map
+else
+libcares_la_LDFLAGS += -export-symbols-regex '^ares_.*'
+endif
 
 # Add -Werror if defined
 CFLAGS += @CARES_CFLAG_EXTRAS@
--- /dev/null
+++ c-ares-1.7.5/c-ares.map
@@ -0,0 +1,72 @@
+CARES_1.2.0 {
+global:
+    ares_cancel;
+    ares_destroy;
+    ares_expand_name;
+    ares_expand_string;
+    ares_fds;
+    ares_free_data;
+    ares_free_hostent;
+    ares_free_string;
+    ares_get_servers;
+    ares_gethostbyaddr;
+    ares_gethostbyname;
+    ares_init;
+    ares_init_options;
+    ares_mkquery;
+    ares_parse_a_reply;
+    ares_parse_ptr_reply;
+    ares_process;
+    ares_query;
+    ares_search;
+    ares_send;
+    ares_set_local_dev;
+    ares_set_local_ip4;
+    ares_set_local_ip6;
+    ares_set_servers;
+    ares_set_servers_csv;
+    ares_strerror;
+    ares_timeout;
+    ares_version;
+local: *;
+};
+
+CARES_1.3.1 {
+global:
+    ares_parse_aaaa_reply;
+    ares_getnameinfo;
+    ares_getsock;
+} CARES_1.2.0;
+
+CARES_1.4.0 {
+global:
+    ares_save_options;
+    ares_destroy_options;
+    ares_parse_ns_reply;
+    ares_process_fd;
+} CARES_1.3.1;
+
+CARES_1.6.0 {
+global:
+    ares_dup;
+    ares_gethostbyname_file;
+} CARES_1.4.0;
+
+CARES_1.7.0 {
+global:
+    ares_set_socket_callback;
+    ares_parse_txt_reply;
+    ares_parse_srv_reply;
+    ares_library_init;
+    ares_library_cleanup;
+} CARES_1.6.0;
+
+CARES_1.7.1 {
+global:
+    ares_reinit;
+} CARES_1.7.0;
+
+CARES_1.7.2 {
+global:
+    ares_parse_mx_reply;
+} CARES_1.7.1;
--- c-ares-1.7.5.orig/configure.ac
+++ c-ares-1.7.5/configure.ac
@@ -97,9 +97,6 @@ case $host_os in
     ;;
 esac
 
-dnl support building of Windows DLLs
-AC_LIBTOOL_WIN32_DLL
-
 dnl force libtool to build static libraries with PIC on AMD64-Linux & FreeBSD
 AC_MSG_CHECKING([if arch-OS host is AMD64-Linux/FreeBSD (to build static libraries with PIC)])
 case $host in
@@ -124,7 +121,8 @@ case $CC in
 esac
 
 dnl libtool setup
-AC_PROG_LIBTOOL
+LT_INIT([win32-dll pic-only disable-static])
+gl_LD_VERSION_SCRIPT
 
 AC_MSG_CHECKING([if we need CARES_BUILDING_LIBRARY])
 case $host in
@@ -171,9 +169,6 @@ CARES_CHECK_COMPILER_HALT_ON_ERROR
 CARES_CHECK_COMPILER_ARRAY_SIZE_NEGATIVE
 CARES_CHECK_COMPILER_SYMBOL_HIDING
 
-CARES_CHECK_NO_UNDEFINED
-AM_CONDITIONAL(NO_UNDEFINED, test x$need_no_undefined = xyes)
-
 CARES_CHECK_CURLDEBUG
 AM_CONDITIONAL(CURLDEBUG, test x$want_curldebug = xyes)
 
--- /dev/null
+++ c-ares-1.7.5/m4/ld-version-script.m4
@@ -0,0 +1,53 @@
+# ld-version-script.m4 serial 3
+dnl Copyright (C) 2008-2012 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Simon Josefsson
+
+# FIXME: The test below returns a false positive for mingw
+# cross-compiles, 'local:' statements does not reduce number of
+# exported symbols in a DLL.  Use --disable-ld-version-script to work
+# around the problem.
+
+# gl_LD_VERSION_SCRIPT
+# --------------------
+# Check if LD supports linker scripts, and define automake conditional
+# HAVE_LD_VERSION_SCRIPT if so.
+AC_DEFUN([gl_LD_VERSION_SCRIPT],
+[
+  AC_ARG_ENABLE([ld-version-script],
+    AS_HELP_STRING([--enable-ld-version-script],
+      [enable linker version script (default is enabled when possible)]),
+      [have_ld_version_script=$enableval], [])
+  if test -z "$have_ld_version_script"; then
+    AC_MSG_CHECKING([if LD -Wl,--version-script works])
+    save_LDFLAGS="$LDFLAGS"
+    LDFLAGS="$LDFLAGS -Wl,--version-script=conftest.map"
+    cat > conftest.map <<EOF
+foo
+EOF
+    AC_LINK_IFELSE([AC_LANG_PROGRAM([], [])],
+                   [accepts_syntax_errors=yes], [accepts_syntax_errors=no])
+    if test "$accepts_syntax_errors" = no; then
+      cat > conftest.map <<EOF
+VERS_1 {
+        global: sym;
+};
+
+VERS_2 {
+        global: sym;
+} VERS_1;
+EOF
+      AC_LINK_IFELSE([AC_LANG_PROGRAM([], [])],
+                     [have_ld_version_script=yes], [have_ld_version_script=no])
+    else
+      have_ld_version_script=no
+    fi
+    rm -f conftest.map
+    LDFLAGS="$save_LDFLAGS"
+    AC_MSG_RESULT($have_ld_version_script)
+  fi
+  AM_CONDITIONAL(HAVE_LD_VERSION_SCRIPT, test "$have_ld_version_script" = "yes")
+])
Received on 2012-02-03