[PATCH] Differentiate between linking a DSO and linking a shared lib [Was: Problems compiling samba3 from 3.4.0pre1]

Steve Langasek vorlon at debian.org
Sat May 16 22:40:19 GMT 2009


On Thu, May 14, 2009 at 01:05:34AM -0700, Steve Langasek wrote:
> On Thu, May 14, 2009 at 09:35:06AM +0200, Volker Lendecke wrote:
> > On Thu, May 14, 2009 at 07:21:18AM +0200, Christian Perrier wrote:
> > > Quoting Christian Perrier (bubulle at debian.org):

> > > I'm worried that no followup happened on this one and 3.4.0-pre2 is
> > > being prepared....

> > > Michael, this is why I'm cc'ing you as that seems to be a build
> > > infrastructure problem (Steve Langasek told me "upstream bug" and
> > > something about missing something with zlib).

> > > So, I really apologize to insist but is there a chance that someone
> > > looks at this?

> > What is the exact platform we need to install to reproduce
> > this?

> The failure is only reproducible when linking libsmbclient with -Wl,-z,defs
> (or equivalent).  We have a patch in the Debian package which does this.

Here's a fixed up version of that patch, which I think should be suitable
for inclusion upstream.  It still doesn't address the problem of the missing
-lz on Debian, but it does guard against any future mislinking of shared
libs.



Shared libraries should never have references to symbols that can't be
resolved via the NEEDED entries in the ELF header, but undefined symbols are
perfectly fine for a DSO - so distinguish the linker commands for the two
types of objects, using -Wl,-z,defs for the former on Linux systems to
prevent accidental mislinking of libs.
---
 source3/Makefile.in  |   30 ++++++++++++++++--------------
 source3/configure.in |   22 ++++++++++++++++------
 2 files changed, 32 insertions(+), 20 deletions(-)

diff --git a/source3/Makefile.in b/source3/Makefile.in
index 8f1d1a5..8f390ef 100644
--- a/source3/Makefile.in
+++ b/source3/Makefile.in
@@ -30,7 +30,7 @@ LIB_PATH_VAR=@LIB_PATH_VAR@
 ## Dynamic shared libraries build settings
 DSO_EXPORTS_CMD=-Wl,--version-script,$(srcdir)/exports/`basename $@ | sed 's/@SHLIBEXT@\(.[0-9]\{1,\}\)\{0,1\}$$/@SYMSEXT@/'`
 DSO_EXPORTS=@DSO_EXPORTS@
-SHLD_DSO = $(SHLD) $(LDSHFLAGS) $(DSO_EXPORTS) -o $@
+SHLD_LIBS = $(SHLD) $(LDSHFLAGS) $(DSO_EXPORTS) -o $@
 
 # The MODULE_EXPORTS variable contains the platform-specific linker flags
 # needed to restrict the exports for VFS, IDMAP, RPC and PASSDB modules.
@@ -46,6 +46,7 @@ CPPFLAGS=-DHAVE_CONFIG_H @CPPFLAGS@
 EXEEXT=@EXEEXT@
 AR=@AR@
 LDSHFLAGS=@LDSHFLAGS@ @RELRO_LDFLAGS@ @LDFLAGS@
+LDDSOFLAGS=@LDDSOFLAGS@ @RELRO_LDFLAGS@ @LDFLAGS@
 LDFLAGS=@PIE_LDFLAGS@ @RELRO_LDFLAGS@ @LDFLAGS@
 
 WINBIND_NSS_LDSHFLAGS=@WINBIND_NSS_LDSHFLAGS@ @LDFLAGS@
@@ -1273,6 +1274,7 @@ SHOWFLAGS::
 	@echo "      LDFLAGS    = $(LDFLAGS)"
 	@echo "      DYNEXP     = $(DYNEXP)"
 	@echo "      LDSHFLAGS  = $(LDSHFLAGS)"
+	@echo "      LDDSOFLAGS = $(LDDSOFLAGS)"
 	@echo "      SHLIBEXT   = @SHLIBEXT@"
 	@echo "      SONAMEFLAG = @SONAMEFLAG@"
 
@@ -1663,7 +1665,7 @@ $(LIBTALLOC_SYMS): $(LIBTALLOC_HEADERS)
 
 $(LIBTALLOC_SHARED_TARGET_SONAME): $(BINARY_PREREQS) $(LIBTALLOC_OBJ) $(LIBTALLOC_SYMS)
 	@echo Linking shared library $@
-	@$(SHLD_DSO) $(LIBTALLOC_OBJ) @SONAMEFLAG@`basename $@`
+	@$(SHLD_LIBS) $(LIBTALLOC_OBJ) @SONAMEFLAG@`basename $@`
 
 $(LIBTALLOC_SHARED_TARGET): $(LIBTALLOC_SHARED_TARGET_SONAME)
 	@rm -f $@
@@ -1728,7 +1730,7 @@ $(LIBTDB_SYMS): $(LIBTDB_HEADERS)
 
 $(LIBTDB_SHARED_TARGET_SONAME): $(BINARY_PREREQS) $(LIBTDB_OBJ) $(LIBTDB_SYMS)
 	@echo Linking shared library $@
-	@$(SHLD_DSO) $(LIBTDB_OBJ) \
+	@$(SHLD_LIBS) $(LIBTDB_OBJ) \
 		@SONAMEFLAG@`basename $@`
 
 $(LIBTDB_SHARED_TARGET): $(LIBTDB_SHARED_TARGET_SONAME)
@@ -1803,7 +1805,7 @@ $(LIBWBCLIENT_SYMS): $(LIBWBCLIENT_HEADERS)
 
 $(LIBWBCLIENT_SHARED_TARGET_SONAME): $(BINARY_PREREQS) $(LIBWBCLIENT_OBJ) $(LIBWBCLIENT_SYMS) @LIBTALLOC_SHARED@
 	@echo Linking shared library $@
-	@$(SHLD_DSO) $(LIBTALLOC_LIBS) $(LIBWBCLIENT_OBJ) \
+	@$(SHLD_LIBS) $(LIBTALLOC_LIBS) $(LIBWBCLIENT_OBJ) \
 		@SONAMEFLAG@`basename $@`
 
 $(LIBWBCLIENT_SHARED_TARGET): $(LIBWBCLIENT_SHARED_TARGET_SONAME)
@@ -1863,7 +1865,7 @@ LIBADDNS_HEADERS=$(srcdir)/libaddns/addns.h
 
 $(LIBADDNS_SHARED_TARGET_SONAME): $(BINARY_PREREQS) $(LIBADDNS_OBJ) @LIBTALLOC_SHARED@
 	@echo Linking shared library $@
-	@$(SHLD_DSO) $(LIBADDNS_OBJ) $(LIBS) \
+	@$(SHLD_LIBS) $(LIBADDNS_OBJ) $(LIBS) \
 		$(KRB5LIBS) $(UUID_LIBS) $(LIBTALLOC_LIBS) \
 		@SONAMEFLAG@`basename $@`
 
@@ -1948,7 +1950,7 @@ $(LIBNETAPI_SYMS): $(LIBNETAPI_HEADERS)
 
 $(LIBNETAPI_SHARED_TARGET_SONAME): $(BINARY_PREREQS) $(LIBNETAPI_OBJ) $(LIBNETAPI_SYMS) @LIBTALLOC_SHARED@ @LIBTDB_SHARED@ @LIBWBCLIENT_SHARED@
 	@echo Linking shared library $@
-	@$(SHLD_DSO) $(LIBNETAPI_OBJ) \
+	@$(SHLD_LIBS) $(LIBNETAPI_OBJ) \
 		$(LIBTALLOC_LIBS) $(LIBTDB_LIBS) $(WINBIND_LIBS) $(LIBS) \
 		$(LDAP_LIBS) $(KRB5LIBS) $(NSCD_LIBS) \
 		@SONAMEFLAG@`basename $@`
@@ -2013,7 +2015,7 @@ $(LIBSMBCLIENT_SYMS): $(LIBSMBCLIENT_HEADERS)
 
 $(LIBSMBCLIENT_SHARED_TARGET_SONAME): $(BINARY_PREREQS) $(LIBSMBCLIENT_OBJ) $(LIBSMBCLIENT_SYMS) @LIBTALLOC_SHARED@ @LIBTDB_SHARED@ @LIBWBCLIENT_SHARED@
 	@echo Linking shared library $@
-	@$(SHLD_DSO) $(LIBSMBCLIENT_OBJ) \
+	@$(SHLD_LIBS) $(LIBSMBCLIENT_OBJ) \
 		$(LIBTALLOC_LIBS) $(LIBTDB_LIBS) $(WINBIND_LIBS) $(LIBS) \
 		$(KRB5LIBS) $(LDAP_LIBS) $(NSCD_LIBS) \
 		@SONAMEFLAG@`basename $@`
@@ -2085,7 +2087,7 @@ $(LIBSMBSHAREMODES_SYMS): $(LIBSMBSHAREMODES_HEADERS)
 
 $(LIBSMBSHAREMODES_SHARED_TARGET_SONAME): $(BINARY_PREREQS) $(LIBSMBSHAREMODES_OBJ) $(LIBSMBSHAREMODES_SYMS) @LIBTALLOC_SHARED@ @LIBTDB_SHARED@
 	@echo Linking shared library $@
-	@$(SHLD_DSO) $(LIBSMBSHAREMODES_OBJ) \
+	@$(SHLD_LIBS) $(LIBSMBSHAREMODES_OBJ) \
 		$(LIBS) $(LIBTALLOC_LIBS) $(LIBTDB_LIBS) \
 		$(KRB5LIBS) $(LDAP_LIBS) \
 		@SONAMEFLAG@`basename $@`
@@ -2182,7 +2184,7 @@ LIBLUA_HEADERS=$(srcdir)/lua-5.1.4/src/lua.h
 
 $(LIBLUA_SHARED_TARGET_SONAME): $(BINARY_PREREQS) $(LIBLUA_OBJ) $(LIBLUA_SYMS) @LIBTALLOC_SHARED@ @LIBTDB_SHARED@
 	@echo Linking shared library $@
-	@$(SHLD_DSO) $(LIBLUA_OBJ) \
+	@$(SHLD_LIBS) $(LIBLUA_OBJ) \
 		$(LIBS) $(LIBTALLOC_LIBS) $(LIBTDB_LIBS) \
 		$(KRB5LIBS) $(LDAP_LIBS) \
 		@SONAMEFLAG@`basename $@`
@@ -2235,7 +2237,7 @@ shlibs test_shlibs: @LIBLUA_SHARED@
 #####################################################################
 
 # Linker command to link a RPC, VFS, AUTH, CHARSET or PASSDB module.
-SHLD_MODULE = $(SHLD) $(LDSHFLAGS) $(MODULE_EXPORTS) \
+SHLD_MODULE = $(SHLD) $(LDDSOFLAGS) $(MODULE_EXPORTS) \
 	      -o $@ @SONAMEFLAG@`basename $@`
 
 bin/librpc_lsarpc. at SHLIBEXT@: $(BINARY_PREREQS) $(RPC_LSA_OBJ)
@@ -2317,18 +2319,18 @@ bin/vlp at EXEEXT@: $(BINARY_PREREQS) $(VLP_OBJ) @LIBTALLOC_SHARED@ @LIBTDB_SHARED@
 
 @WINBIND_WINS_NSS@: $(BINARY_PREREQS) $(WINBIND_WINS_NSS_OBJ) @LIBTALLOC_SHARED@ @LIBTDB_SHARED@
 	@echo "Linking $@"
-	@$(SHLD) $(LDSHFLAGS) -o $@ $(WINBIND_WINS_NSS_OBJ) \
+	@$(SHLD) $(LDDSOFLAGS) -o $@ $(WINBIND_WINS_NSS_OBJ) \
 		$(LDAP_LIBS) $(KRB5LIBS) $(LIBS) $(LIBTALLOC_LIBS) $(LIBTDB_LIBS) \
 		@SONAMEFLAG@`basename $@`@NSSSONAMEVERSIONSUFFIX@
 
 bin/winbind_krb5_locator. at SHLIBEXT@: $(BINARY_PREREQS) $(WINBIND_KRB5_LOCATOR_OBJ) @LIBWBCLIENT_SHARED@
 	@echo "Linking $@"
-	@$(SHLD) $(LDSHFLAGS) -o $@ $(WINBIND_KRB5_LOCATOR_OBJ) $(WINBIND_LIBS) \
+	@$(SHLD) $(LDDSOFLAGS) -o $@ $(WINBIND_KRB5_LOCATOR_OBJ) $(WINBIND_LIBS) \
 		@SONAMEFLAG@`basename $@`
 
 bin/pam_winbind. at SHLIBEXT@: $(BINARY_PREREQS) $(PAM_WINBIND_OBJ) @LIBTALLOC_SHARED@ @LIBWBCLIENT_SHARED@
 	@echo "Linking shared library $@"
-	@$(SHLD) $(LDSHFLAGS) -o $@ $(PAM_WINBIND_OBJ) -lpam @INIPARSERLIBS@ \
+	@$(SHLD) $(LDDSOFLAGS) -o $@ $(PAM_WINBIND_OBJ) -lpam @INIPARSERLIBS@ \
 		$(PAM_WINBIND_EXTRA_LIBS) $(LIBTALLOC_LIBS) $(WINBIND_LIBS) @SONAMEFLAG@`basename $@`
 
 bin/builtin. at SHLIBEXT@: $(BINARY_PREREQS) $(AUTH_BUILTIN_OBJ)
@@ -2628,7 +2630,7 @@ bin/ntlm_auth at EXEEXT@: $(BINARY_PREREQS) $(NTLM_AUTH_OBJ) $(PARAM_OBJ) \
 
 bin/pam_smbpass. at SHLIBEXT@: $(BINARY_PREREQS) $(PAM_SMBPASS_OBJ) @LIBTALLOC_SHARED@ @LIBWBCLIENT_SHARED@ @LIBTDB_SHARED@
 	@echo "Linking shared library $@"
-	@$(SHLD) $(LDSHFLAGS) -o $@ $(PAM_SMBPASS_OBJ) -lpam $(DYNEXP) \
+	@$(SHLD) $(LDDSOFLAGS) -o $@ $(PAM_SMBPASS_OBJ) -lpam $(DYNEXP) \
 		$(LIBS) $(LDAP_LIBS) $(KRB5LIBS) $(NSCD_LIBS) \
 		$(LIBTALLOC_LIBS) $(LIBTDB_LIBS) $(WINBIND_LIBS)
 
diff --git a/source3/configure.in b/source3/configure.in
index d67fecc..bb9dd21 100644
--- a/source3/configure.in
+++ b/source3/configure.in
@@ -76,6 +76,7 @@ dnl Unique-to-Samba variables we'll be playing with.
 AC_SUBST(SAMBA_CPPFLAGS)
 AC_SUBST(SHELL)
 AC_SUBST(LDSHFLAGS)
+AC_SUBST(LDDSOFLAGS)
 AC_SUBST(SONAMEFLAG)
 AC_SUBST(SHLD)
 AC_SUBST(MODULE_EXPORTS)
@@ -1510,6 +1511,7 @@ BLDSHARED="false"
 # these are the defaults, good for lots of systems
 HOST_OS="$host_os"
 LDSHFLAGS="-shared"
+LDDSOFLAGS="-shared"
 MODULE_EXPORTS=""
 SONAMEFLAG="#"
 SHLD="\${CC} \${CFLAGS}"
@@ -1528,9 +1530,11 @@ DSO_EXPORTS=""
 		*linux*)   AC_DEFINE(LINUX,1,[Whether the host os is linux])
 			BLDSHARED="true"
 			if test "${ac_cv_gnu_ld_no_default_allow_shlib_undefined}" = "yes"; then
-				LDSHFLAGS="-shared -Wl,-Bsymbolic -Wl,--allow-shlib-undefined"
-			else
+				LDDSOFLAGS="-shared -Wl,-Bsymbolic -Wl,--allow-shlib-undefined"
 				LDSHFLAGS="-shared -Wl,-Bsymbolic"
+			else
+				LDDSOFLAGS="-shared -Wl,-Bsymbolic"
+				LDSHFLAGS="-shared -Wl,-Bsymbolic -Wl,-z,defs"
 			fi
 			DYNEXP="-Wl,--export-dynamic"
 			PICFLAG="-fPIC"
@@ -1540,6 +1544,7 @@ DSO_EXPORTS=""
 		*solaris*) AC_DEFINE(SUNOS5,1,[Whether the host os is solaris])
 			BLDSHARED="true"
 			LDSHFLAGS="-G"
+			LDDSOFLAGS="$LDSHFLAGS"
 			SONAMEFLAG="-h "
 			if test "${GCC}" = "yes"; then
 				PICFLAG="-fPIC"
@@ -1552,6 +1557,7 @@ DSO_EXPORTS=""
 				## ${CFLAGS} added for building 64-bit shared
 				## libs using Sun's Compiler
 				LDSHFLAGS="-G \${CFLAGS}"
+				LDDSOFLAGS="$LDSHFLAGS"
 			fi
 			AC_DEFINE(STAT_ST_BLOCKSIZE,512,[The size of a block])
 			AC_DEFINE(BROKEN_GETGRNAM,1,[Does getgrnam work correctly])
@@ -1559,6 +1565,7 @@ DSO_EXPORTS=""
 		*sunos*) AC_DEFINE(SUNOS4,1,[Whether the host os is sunos4])
 			BLDSHARED="true"
 			LDSHFLAGS="-G"
+			LDDSOFLAGS="$LDSHFLAGS"
 			SONAMEFLAG="-Wl,-h,"
 			PICFLAG="-KPIC"   # Is this correct for SunOS
 			AC_DEFINE(STAT_ST_BLOCKSIZE,512)
@@ -1566,7 +1573,6 @@ DSO_EXPORTS=""
 			;;
 		*netbsd* | *freebsd* | *dragonfly* )
 			BLDSHARED="true"
-			LDSHFLAGS="-shared"
 			DYNEXP="-Wl,--export-dynamic"
 			SONAMEFLAG="-Wl,-soname,"
 			PICFLAG="-fPIC -DPIC"
@@ -1574,7 +1580,6 @@ DSO_EXPORTS=""
 			AC_DEFINE(BROKEN_GETGRNAM,1,[Does getgrnam work correctly])
 			;;
 		*openbsd*)  BLDSHARED="true"
-			LDSHFLAGS="-shared"
 			DYNEXP="-Wl,-Bdynamic"
 			SONAMEFLAG="-Wl,-soname,"
 			PICFLAG="-fPIC"
@@ -1588,6 +1593,7 @@ DSO_EXPORTS=""
 			esac
 			BLDSHARED="true"
 			LDSHFLAGS="-set_version sgi1.0 -shared"
+			LDDSOFLAGS="$LDSHFLAGS"
 			SONAMEFLAG="-soname "
 			SHLD="\${LD}"
 			if test "${GCC}" = "yes"; then
@@ -1602,6 +1608,7 @@ DSO_EXPORTS=""
 			# use expfull to export underscored symbols
 			# add rtl to remove /lib/crt0.o warning
 			LDSHFLAGS="-Wl,-G,-bexpfull,-bbigtoc,-brtl"
+			LDDSOFLAGS="$LDSHFLAGS"
 			DYNEXP="-Wl,-brtl,-bexpfull,-bbigtoc"
 			PICFLAG="-O2"
 			# as AIX code is always position independent...
@@ -1620,6 +1627,7 @@ DSO_EXPORTS=""
 				BLDSHARED="true"
 				SHLD="cc"
 				LDSHFLAGS="-b -Wl,-B,symbolic,-b,-z"
+				LDDSOFLAGS="$LDSHFLAGS"
 				SONAMEFLAG="-Wl,+h "
 				PICFLAG="+z"
 			if test "${GCC}" = "yes"; then
@@ -1643,7 +1651,6 @@ DSO_EXPORTS=""
 			;;
 		*osf*) AC_DEFINE(OSF1,1,[Whether the host os is osf1])
 			BLDSHARED="true"
-			LDSHFLAGS="-shared"
 			SONAMEFLAG="-Wl,-soname,"
 			PICFLAG="-fPIC"
 			AC_DEFINE(STAT_ST_BLOCKSIZE,512)
@@ -1654,7 +1661,6 @@ DSO_EXPORTS=""
 			;;
 		*unixware*) AC_DEFINE(UNIXWARE,1,[Whether the host os is unixware])
 			BLDSHARED="true"
-			LDSHFLAGS="-shared"
 			SONAMEFLAG="-Wl,-soname,"
 			PICFLAG="-KPIC"
 			AC_DEFINE(STAT_ST_BLOCKSIZE,512)
@@ -1671,6 +1677,7 @@ DSO_EXPORTS=""
 						AC_DEFINE(HAVE_MEMSET,1,[Whether memset() is available])
 					fi
 					LDSHFLAGS="-G"
+					LDDSOFLAGS="$LDSHFLAGS"
                              		DYNEXP="-Bexport"
 				;;
 				*mips-sni-sysv4*) AC_DEFINE(RELIANTUNIX,1,[Whether the host os is reliantunix]);;
@@ -1683,16 +1690,19 @@ DSO_EXPORTS=""
 				AC_DEFINE(HAVE_MEMSET,1,[Whether memset() is available])
 			fi
 			LDSHFLAGS="-G"
+			LDDSOFLAGS="$LDSHFLAGS"
 			AC_DEFINE(STAT_ST_BLOCKSIZE,512)
 			;;
 		*vos*) AC_DEFINE(STAT_ST_BLOCKSIZE,4096)
 			BLDSHARED="false"
 			LDSHFLAGS=""
+			LDDSOFLAGS="$LDSHFLAGS"
 			;;
 
 		*darwin*)   AC_DEFINE(DARWINOS,1,[Whether the host os is Darwin/MacOSX])
 			BLDSHARED="true"
 			LDSHFLAGS="-dynamiclib -flat_namespace -undefined suppress"
+			LDDSOFLAGS="$LDSHFLAGS"
 			CFLAGS="$CFLAGS -fno-common"
 			SHLD="\${CC}"
 			SHLIBEXT="dylib"

-- 
Steve Langasek                   Give me a lever long enough and a Free OS
Debian Developer                   to set it on, and I can move the world.
Ubuntu Developer                                    http://www.debian.org/
slangasek at ubuntu.com                                     vorlon at debian.org


More information about the samba-technical mailing list