[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