aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2006-04-28 02:53:20 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2006-04-28 02:53:20 +0000
commit1e7bb2da573e8e58941c89d20a07b7f8331800e4 (patch)
treee08bb4bc16d3cf1fe2bf03a87bb602989f82f86a
parent35a0601d0ae0b1ce64bb34ee8df65802f9b1265f (diff)
downloadpostgresql-1e7bb2da573e8e58941c89d20a07b7f8331800e4.tar.gz
postgresql-1e7bb2da573e8e58941c89d20a07b7f8331800e4.zip
Arrange to strip libpq.so of symbols that aren't officially supposed to
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.
-rw-r--r--src/Makefile.shlib8
-rw-r--r--src/interfaces/ecpg/ecpglib/Makefile8
-rw-r--r--src/interfaces/libpq/Makefile33
3 files changed, 37 insertions, 12 deletions
diff --git a/src/Makefile.shlib b/src/Makefile.shlib
index 732338caa43..8efa69db1d5 100644
--- a/src/Makefile.shlib
+++ b/src/Makefile.shlib
@@ -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)
diff --git a/src/interfaces/ecpg/ecpglib/Makefile b/src/interfaces/ecpg/ecpglib/Makefile
index a5ce3b39c08..91542fe297f 100644
--- a/src/interfaces/ecpg/ecpglib/Makefile
+++ b/src/interfaces/ecpg/ecpglib/Makefile
@@ -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
diff --git a/src/interfaces/libpq/Makefile b/src/interfaces/libpq/Makefile
index ff29e7c12aa..2a1f76e7122 100644
--- a/src/interfaces/libpq/Makefile
+++ b/src/interfaces/libpq/Makefile
@@ -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