On Tue, Nov 25, 2014 at 10:36 AM, Niels Möller <[email protected]> wrote:

> I think it lacked a linker script for hogweed, with symbol version
> tracking libhogweed's major version rather than libnettle's.

Attached a patch which separates the .map files.

>> What I now realize is that that mini-gmp mpz_*, gmp_* and mpn_*
>> symbols are not exported in the script that I sent. They could be put
>> unconditionally there, or via a configure variable.
>
> I think it's generally a bit dangerous to make shared libraries with
> mini-gmp (the result is not promised to be binary compatible with
> regular builds). Anyone trying that really needs to know what he/she
> is doing. So I think a sensible default is to disable hogweed symbol
> versioning in that case, and possibly have a configure option to
> explicitly specify the linker script to use for each library.

I'm not sure what is the correct path. Disabling the linker script
would mean that more symbols will be exported than normally (all
internal symbols) and there can be clashes that wouldn't be with the
normal library. In any case this is not really related to the version
script, it is mostly an issue of having a different soname when
nettle-mini is used.

regards,
Nikos
From 6436f99f34e607a25018cb2a8d915bf8a3b268cc Mon Sep 17 00:00:00 2001
From: Nikos Mavrogiannopoulos <[email protected]>
Date: Mon, 24 Nov 2014 14:02:25 +0100
Subject: [PATCH] Added symbol versioning for nettle and hogweed

Signed-off-by: Nikos Mavrogiannopoulos <[email protected]>
---
 .gitignore        |  3 +++
 Makefile.in       |  4 ++--
 aclocal.m4        | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 configure.ac      |  7 ++++++-
 libhogweed.map.in | 18 +++++++++++++++++
 libnettle.map.in  | 17 ++++++++++++++++
 6 files changed, 105 insertions(+), 3 deletions(-)
 create mode 100644 libhogweed.map.in
 create mode 100644 libnettle.map.in

diff --git a/.gitignore b/.gitignore
index 2b16f4c..7c4e04c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -67,3 +67,6 @@ core
 /nettle.tps
 /nettle.vr
 /nettle.vrs
+*.po
+/libhogweed.map
+/libnettle.map
diff --git a/Makefile.in b/Makefile.in
index 10a58b0..ebd2bb1 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -244,7 +244,7 @@ libhogweed.a: $(hogweed_OBJS)
 
 # Rules building shared libraries.
 $(LIBNETTLE_FORLINK): $(nettle_OBJS)
-	$(LIBNETTLE_LINK) $(nettle_OBJS) -o $@ $(LIBNETTLE_LIBS)
+	$(LIBNETTLE_LINK) $(nettle_OBJS) @EXTRA_LINKER_FLAGS@ -o $@ $(LIBNETTLE_LIBS)
 	-mkdir .lib 2>/dev/null
 	(cd .lib \
           && rm -f $(LIBNETTLE_FORLINK) \
@@ -255,7 +255,7 @@ $(LIBNETTLE_FORLINK): $(nettle_OBJS)
 	echo nettle > libnettle.stamp
 
 $(LIBHOGWEED_FORLINK): $(hogweed_OBJS) $(LIBNETTLE_FORLINK)
-	$(LIBHOGWEED_LINK) $(hogweed_OBJS) -o $@ $(LIBHOGWEED_LIBS)
+	$(LIBHOGWEED_LINK) $(hogweed_OBJS) @EXTRA_HOGWEED_LINKER_FLAGS@ -o $@ $(LIBHOGWEED_LIBS)
 	-mkdir .lib 2>/dev/null
 	(cd .lib \
           && rm -f $(LIBHOGWEED_FORLINK) \
diff --git a/aclocal.m4 b/aclocal.m4
index 36daec6..4c0bd41 100644
--- a/aclocal.m4
+++ b/aclocal.m4
@@ -1211,3 +1211,62 @@ ac_cv_type_int_fast32_t="$ac_cv_type_int_fast32_t"
 ac_cv_type_intmax_t="$ac_cv_type_intmax_t"
 ])
 ])
+
+# ld-version-script.m4 serial 3
+dnl Copyright (C) 2008-2014 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([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
+  if test "$have_ld_version_script" = "yes";then
+	EXTRA_LINKER_FLAGS="-Wl,--version-script=\$(srcdir)/libnettle.map"
+	AC_SUBST(EXTRA_LINKER_FLAGS)
+	EXTRA_HOGWEED_LINKER_FLAGS="-Wl,--version-script=\$(srcdir)/libhogweed.map"
+	AC_SUBST(EXTRA_HOGWEED_LINKER_FLAGS)
+  fi
+])
diff --git a/configure.ac b/configure.ac
index bb33962..33c16e1 100644
--- a/configure.ac
+++ b/configure.ac
@@ -78,10 +78,13 @@ AC_ARG_ENABLE(mini-gmp,
 
 if test "x$enable_mini_gmp" = xyes ; then
   NETTLE_USE_MINI_GMP=1
+  HOGWEED_EXTRA_SYMBOLS="mpz_*;gmp_*;mpn_*;"
 else
   NETTLE_USE_MINI_GMP=0
+  HOGWEED_EXTRA_SYMBOLS=""
 fi
 AC_SUBST([NETTLE_USE_MINI_GMP])
+AC_SUBST([HOGWEED_EXTRA_SYMBOLS])
 
 LSH_RPATH_INIT([`echo $with_lib_path | sed 's/:/ /g'` \
     `echo $exec_prefix | sed "s@^NONE@$prefix/lib@g" | sed "s@^NONE@$ac_default_prefix/lib@g"` \
@@ -114,6 +117,8 @@ AC_TRY_COMPILE([],[return 0;],[IF_CXX=''], [IF_CXX='#'])
 AC_SUBST([IF_CXX])
 AC_LANG_POP
 
+LD_VERSION_SCRIPT
+
 AC_PROG_MAKE_SET
 AC_PROG_RANLIB
 AC_CHECK_TOOL(NM, nm, strings)
@@ -843,7 +848,7 @@ fi
 
 AC_CONFIG_FILES([config.make config.m4 Makefile bignum.h])
 AC_CONFIG_FILES([tools/Makefile testsuite/Makefile examples/Makefile])
-AC_CONFIG_FILES([nettle.pc hogweed.pc])
+AC_CONFIG_FILES([nettle.pc hogweed.pc libnettle.map libhogweed.map])
 
 AC_OUTPUT
 
diff --git a/libhogweed.map.in b/libhogweed.map.in
new file mode 100644
index 0000000..eea6ed8
--- /dev/null
+++ b/libhogweed.map.in
@@ -0,0 +1,18 @@
+# libhogweed.map -- libhogweed linker version script.           -*- ld-script -*-
+
+#
+# The symbol version must be updated on every hogweed
+# library major number change. That is taken care by
+# auto-generating the file.
+
+HOGWEED_@LIBHOGWEED_MAJOR@
+{
+  global:
+    nettle_*;
+    _nettle_*;
+    @HOGWEED_EXTRA_SYMBOLS@
+
+  local:
+    *;
+};
+
diff --git a/libnettle.map.in b/libnettle.map.in
new file mode 100644
index 0000000..02455bc
--- /dev/null
+++ b/libnettle.map.in
@@ -0,0 +1,17 @@
+# libnettle.map -- libnettle linker version script.           -*- ld-script -*-
+
+#
+# The symbol version must be updated on every nettle
+# library major number change. That is taken care by
+# auto-generating the file.
+
+NETTLE_@LIBNETTLE_MAJOR@
+{
+  global:
+    nettle_*;
+    _nettle_*;
+
+  local:
+    *;
+};
+
-- 
1.9.3

_______________________________________________
nettle-bugs mailing list
[email protected]
http://lists.lysator.liu.se/mailman/listinfo/nettle-bugs

Reply via email to