From 3914699f0f47a0e4f90c8966b5c32417cd3c7e73 Mon Sep 17 00:00:00 2001 From: Debian OpenLDAP Maintainers Date: Wed, 11 Nov 2020 17:13:56 +0000 Subject: [PATCH] libldap-symbol-versions Add symbol versioning to the public LDAP libraries. This is required for library transitions, such as the current transition from 2.1 to 2.4, since programs will sometimes have both libraries loaded by different dependency chains during the transition. Not yet contributed upstream. Upstream ITS #5365 filed requesting symbol versioning for libldap and libber. Gbp-Pq: Name libldap-symbol-versions --- build/openldap.m4 | 51 +++++++++++++++++++++++++++++++++ build/top.mk | 5 +++- configure.in | 7 +++++ libraries/liblber/Makefile.in | 3 ++ libraries/liblber/liblber.map | 8 ++++++ libraries/libldap/Makefile.in | 3 ++ libraries/libldap/libldap.map | 7 +++++ libraries/libldap_r/Makefile.in | 3 ++ 8 files changed, 86 insertions(+), 1 deletion(-) create mode 100644 libraries/liblber/liblber.map create mode 100644 libraries/libldap/libldap.map diff --git a/build/openldap.m4 b/build/openldap.m4 index 80fda161..583fdb97 100644 --- a/build/openldap.m4 +++ b/build/openldap.m4 @@ -1115,3 +1115,54 @@ AC_DEFUN([OL_SSL_COMPAT], #endif ], [ol_cv_ssl_crl_compat=yes], [ol_cv_ssl_crl_compat=no])]) ]) + +dnl ==================================================================== +dnl check for symbol versioning support +AC_DEFUN([OL_SYMBOL_VERSIONING], +[AC_CACHE_CHECK([for .symver assembler directive], + [ol_cv_asm_symver_directive],[ +cat > conftest.s <&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD; then + ol_cv_asm_symver_directive=yes +else + ol_cv_asm_symver_directive=no +fi +rm -f conftest*]) +AC_CACHE_CHECK([for ld --version-script], + [ol_cv_ld_version_script_option],[ +if test $ol_cv_asm_symver_directive = yes; then + cat > conftest.s < conftest.map <&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD; then + if AC_TRY_COMMAND([${CC-cc} $CFLAGS $LDFLAGS -shared + -o conftest.so conftest.o + -Wl,--version-script,conftest.map + 1>&AS_MESSAGE_LOG_FD]); + then + ol_cv_ld_version_script_option=yes + else + ol_cv_ld_version_script_option=no + fi + else + ol_cv_ld_version_script_option=no + fi +else + ol_cv_ld_version_script_option=no +fi +rm -f conftest*])]) diff --git a/build/top.mk b/build/top.mk index 6850121e..cf2022ab 100644 --- a/build/top.mk +++ b/build/top.mk @@ -104,6 +104,9 @@ LTFLAGS_MOD = $(@PLAT@_LTFLAGS_MOD) # LINK_LIBS referenced in library and module link commands. LINK_LIBS = $(MOD_LIBS) $(@PLAT@_LINK_LIBS) +# option to pass to $(CC) to support library symbol versioning, if any +VERSION_OPTION = @VERSION_OPTION@ + LTSTATIC = @LTSTATIC@ LTLINK = $(LIBTOOL) --mode=link \ @@ -113,7 +116,7 @@ LTCOMPILE_LIB = $(LIBTOOL) $(LTONLY_LIB) --mode=compile \ $(CC) $(LT_CFLAGS) $(LT_CPPFLAGS) $(LIB_DEFS) -c LTLINK_LIB = $(LIBTOOL) $(LTONLY_LIB) --mode=link \ - $(CC) $(LT_CFLAGS) $(LDFLAGS) $(LTFLAGS_LIB) + $(CC) $(LT_CFLAGS) $(LDFLAGS) $(LTFLAGS_LIB) $(VERSION_FLAGS) LTCOMPILE_MOD = $(LIBTOOL) $(LTONLY_MOD) --mode=compile \ $(CC) $(LT_CFLAGS) $(LT_CPPFLAGS) $(MOD_DEFS) -c diff --git a/configure.in b/configure.in index e1d4790e..e0a3b12e 100644 --- a/configure.in +++ b/configure.in @@ -1928,6 +1928,13 @@ else fi AC_SUBST(LTSTATIC)dnl +VERSION_OPTION="" +OL_SYMBOL_VERSIONING +if test $ol_cv_ld_version_script_option = yes ; then + VERSION_OPTION="-Wl,--version-script=" +fi +AC_SUBST(VERSION_OPTION) + dnl ---------------------------------------------------------------- if test $ol_enable_wrappers != no ; then AC_CHECK_HEADERS(tcpd.h,[ diff --git a/libraries/liblber/Makefile.in b/libraries/liblber/Makefile.in index a831e96f..e189dc12 100644 --- a/libraries/liblber/Makefile.in +++ b/libraries/liblber/Makefile.in @@ -38,6 +38,9 @@ XLIBS = $(LIBRARY) $(LDAP_LIBLUTIL_A) XXLIBS = NT_LINK_LIBS = $(AC_LIBS) UNIX_LINK_LIBS = $(AC_LIBS) +ifneq (,$(VERSION_OPTION)) + VERSION_FLAGS = "$(VERSION_OPTION)$(srcdir)/liblber.map" +endif dtest: $(XLIBS) dtest.o $(LTLINK) -o $@ dtest.o $(LIBS) diff --git a/libraries/liblber/liblber.map b/libraries/liblber/liblber.map new file mode 100644 index 00000000..b54853c0 --- /dev/null +++ b/libraries/liblber/liblber.map @@ -0,0 +1,8 @@ +OPENLDAP_2.4_2 { + global: + ber_*; + der_alloc; + lutil_*; + local: + *; +}; diff --git a/libraries/libldap/Makefile.in b/libraries/libldap/Makefile.in index a70190e4..672ccfda 100644 --- a/libraries/libldap/Makefile.in +++ b/libraries/libldap/Makefile.in @@ -52,6 +52,9 @@ XLIBS = $(LIBRARY) $(LDAP_LIBLBER_LA) $(LDAP_LIBLUTIL_A) XXLIBS = $(SECURITY_LIBS) $(LUTIL_LIBS) NT_LINK_LIBS = $(LDAP_LIBLBER_LA) $(AC_LIBS) $(SECURITY_LIBS) UNIX_LINK_LIBS = $(LDAP_LIBLBER_LA) $(AC_LIBS) $(SECURITY_LIBS) +ifneq (,$(VERSION_OPTION)) + VERSION_FLAGS = $(VERSION_OPTION)$(srcdir)/libldap.map +endif apitest: $(XLIBS) apitest.o $(LTLINK) -o $@ apitest.o $(LIBS) diff --git a/libraries/libldap/libldap.map b/libraries/libldap/libldap.map new file mode 100644 index 00000000..605dcffa --- /dev/null +++ b/libraries/libldap/libldap.map @@ -0,0 +1,7 @@ +OPENLDAP_2.4_2 { + global: + ldap_*; + ldif_*; + local: + *; +}; diff --git a/libraries/libldap_r/Makefile.in b/libraries/libldap_r/Makefile.in index 0bebda71..b5784119 100644 --- a/libraries/libldap_r/Makefile.in +++ b/libraries/libldap_r/Makefile.in @@ -61,6 +61,9 @@ XXLIBS = $(SECURITY_LIBS) $(LUTIL_LIBS) XXXLIBS = $(LTHREAD_LIBS) NT_LINK_LIBS = $(LDAP_LIBLBER_LA) $(AC_LIBS) $(SECURITY_LIBS) UNIX_LINK_LIBS = $(LDAP_LIBLBER_LA) $(AC_LIBS) $(SECURITY_LIBS) $(LTHREAD_LIBS) +ifneq (,$(VERSION_OPTION)) + VERSION_FLAGS = "$(VERSION_OPTION)$(XXDIR)/libldap.map" +endif .links : Makefile @for i in $(XXSRCS); do \ -- 2.30.2