]> granicus.if.org Git - postgresql/commitdiff
Arrange to strip libpq.so of symbols that aren't officially supposed to
authorTom Lane <tgl@sss.pgh.pa.us>
Fri, 28 Apr 2006 02:53:20 +0000 (02:53 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Fri, 28 Apr 2006 02:53:20 +0000 (02:53 +0000)
be exported on Linux and Darwin.  We already did this on Windows but
that's not enough, as evidenced by the fact that libecpg had an unexpected
dependency on one such symbol.  We should try to do it on more platforms.
Fix ecpg's oversight, and bump libpq's major .so version number to reflect
the unwanted but nonetheless real ABI break.

src/Makefile.shlib
src/interfaces/ecpg/ecpglib/Makefile
src/interfaces/libpq/Makefile

index 732338caa431b2e6fa42781715908061c3df1702..8efa69db1d542549393de87c06f9022cde4bb198 100644 (file)
@@ -6,7 +6,7 @@
 # Copyright (c) 1998, Regents of the University of California
 #
 # IDENTIFICATION
-#    $PostgreSQL: pgsql/src/Makefile.shlib,v 1.103 2006/04/19 16:32:08 tgl Exp $
+#    $PostgreSQL: pgsql/src/Makefile.shlib,v 1.104 2006/04/28 02:53:20 tgl Exp $
 #
 #-------------------------------------------------------------------------
 
@@ -107,11 +107,11 @@ ifeq ($(PORTNAME), darwin)
   ifeq ($(DLTYPE), library)
     # linkable library
     DLSUFFIX           := .dylib
-    LINK.shared                = $(COMPILER) -dynamiclib -install_name $(libdir)/lib$(NAME).$(SO_MAJOR_VERSION)$(DLSUFFIX) $(version_link) -multiply_defined suppress
+    LINK.shared                = $(COMPILER) -dynamiclib -install_name $(libdir)/lib$(NAME).$(SO_MAJOR_VERSION)$(DLSUFFIX) $(version_link) $(exported_symbols_list) -multiply_defined suppress
   else
     # loadable module (default case)
     DLSUFFIX           := .so
-    LINK.shared                = $(COMPILER) -bundle
+    LINK.shared                = $(COMPILER) -bundle -multiply_defined suppress
   endif
   shlib                        = lib$(NAME).$(SO_MAJOR_VERSION).$(SO_MINOR_VERSION)$(DLSUFFIX)
   shlib_major          = lib$(NAME).$(SO_MAJOR_VERSION)$(DLSUFFIX)
@@ -186,7 +186,7 @@ ifeq ($(PORTNAME), irix)
 endif
 
 ifeq ($(PORTNAME), linux)
-  LINK.shared          = $(COMPILER) -shared -Wl,-soname,$(soname)
+  LINK.shared          = $(COMPILER) -shared -Wl,-soname,$(soname) $(exported_symbols_list)
 endif
 
 ifeq ($(PORTNAME), solaris)
index a5ce3b39c087cb94d46fff3d18510ab31910bc30..91542fe297f6c503b62ab4acc50c86329ff0c46e 100644 (file)
@@ -4,7 +4,7 @@
 #
 # Copyright (c) 1994, Regents of the University of California
 #
-# $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/Makefile,v 1.38 2006/01/17 19:49:23 meskes Exp $
+# $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/Makefile,v 1.39 2006/04/28 02:53:20 tgl Exp $
 #
 #-------------------------------------------------------------------------
 
@@ -25,7 +25,7 @@ override CFLAGS += $(PTHREAD_CFLAGS)
 LIBS := $(filter-out -lpgport, $(LIBS))
 
 OBJS= execute.o typename.o descriptor.o data.o error.o prepare.o memory.o \
-       connect.o misc.o path.o exec.o \
+       connect.o misc.o path.o exec.o thread.o \
        $(filter snprintf.o, $(LIBOBJS))
 
 SHLIB_LINK = -L../pgtypeslib -lpgtypes $(libpq) \
@@ -46,7 +46,7 @@ include $(top_srcdir)/src/Makefile.shlib
 # necessarily use the same object files as the backend uses. Instead,
 # symlink the source files in here and build our own object file.
 
-path.c exec.c snprintf.c: % : $(top_srcdir)/src/port/%
+path.c exec.c snprintf.c thread.c: % : $(top_srcdir)/src/port/%
        rm -f $@ && $(LN_S) $< .
 
 path.o: path.c $(top_builddir)/src/port/pg_config_paths.h
@@ -62,7 +62,7 @@ installdirs:
 uninstall: uninstall-lib
 
 clean distclean maintainer-clean: clean-lib
-       rm -f $(OBJS) path.c exec.c snprintf.c
+       rm -f $(OBJS) path.c exec.c snprintf.c thread.c
 
 depend dep:
        $(CC) -MM $(CFLAGS) *.c >depend
index ff29e7c12aa16f59ad8556bcf95a21533accb4fd..2a1f76e71229b6d07e672fb1a11572aae1fdd6ba 100644 (file)
@@ -5,7 +5,7 @@
 # Portions Copyright (c) 1996-2006, PostgreSQL Global Development Group
 # Portions Copyright (c) 1994, Regents of the University of California
 #
-# $PostgreSQL: pgsql/src/interfaces/libpq/Makefile,v 1.143 2006/04/11 20:26:40 neilc Exp $
+# $PostgreSQL: pgsql/src/interfaces/libpq/Makefile,v 1.144 2006/04/28 02:53:20 tgl Exp $
 #
 #-------------------------------------------------------------------------
 
@@ -16,8 +16,8 @@ include $(top_builddir)/src/Makefile.global
 
 # shared library parameters
 NAME= pq
-SO_MAJOR_VERSION= 4
-SO_MINOR_VERSION= 2
+SO_MAJOR_VERSION= 5
+SO_MINOR_VERSION= 0
 DLTYPE= library
 
 override CPPFLAGS :=  -DFRONTEND -I$(srcdir) $(CPPFLAGS) -I$(top_builddir)/src/port
@@ -125,6 +125,31 @@ $(srcdir)/blibpqdll.def: exports.txt
        echo '; Aliases for MS compatible names' >> $@
        sed -e '/^#/d' -e 's/^\(.* \)\([0-9][0-9]*\)/    \1= _\1/' < $< | sed 's/ *$$//' >> $@
 
+# Where possible, restrict the symbols exported by the library to just the
+# official list, so as to avoid unintentional ABI changes.  On recent Darwin
+# this also quiets multiply-defined-symbol warnings in programs that use
+# libpgport along with libpq.
+
+ifeq ($(PORTNAME), darwin)
+$(shlib): exports.list
+
+exports.list: exports.txt
+       $(AWK) '/^[^#]/ {printf "_%s\n",$$1}' $< >$@
+
+exported_symbols_list = -exported_symbols_list exports.list
+endif
+
+ifeq ($(PORTNAME), linux)
+$(shlib): exports.list
+
+exports.list: exports.txt
+       echo '{ global:' >$@
+       $(AWK) '/^[^#]/ {printf "%s;\n",$$1}' $< >>$@
+       echo ' local: *; };' >>$@
+
+exported_symbols_list = -Wl,--version-script=exports.list
+endif
+
 # depend on Makefile.global to force rebuild on re-run of configure
 $(srcdir)/libpq.rc: libpq.rc.in $(top_builddir)/src/Makefile.global
        sed -e 's/\(VERSION.*\),0 *$$/\1,'`date '+%y%j' | sed 's/^0*//'`'/' < $< > $@
@@ -147,7 +172,7 @@ uninstall: uninstall-lib
        rm -f '$(DESTDIR)$(includedir)/libpq-fe.h' '$(DESTDIR)$(includedir_internal)/libpq-int.h' '$(DESTDIR)$(includedir_internal)/pqexpbuffer.h' '$(DESTDIR)$(datadir)/pg_service.conf.sample'
 
 clean distclean: clean-lib
-       rm -f $(OBJS) pg_config_paths.h crypt.c getaddrinfo.c inet_aton.c noblock.c pgstrcasecmp.c snprintf.c strerror.c open.c thread.c md5.c ip.c encnames.c wchar.c pthread.h
+       rm -f $(OBJS) pg_config_paths.h crypt.c getaddrinfo.c inet_aton.c noblock.c pgstrcasecmp.c snprintf.c strerror.c open.c thread.c md5.c ip.c encnames.c wchar.c pthread.h exports.list
        rm -f pg_config_paths.h # Might be left over from a Win32 client-only build
 
 maintainer-clean: distclean