AIX: Fix missing libpq symbols by respecting SHLIB_EXPORTS.
authorNoah Misch <noah@leadboat.com>
Mon, 6 Sep 2021 18:27:59 +0000 (11:27 -0700)
committerNoah Misch <noah@leadboat.com>
Mon, 6 Sep 2021 18:28:02 +0000 (11:28 -0700)
We make each AIX shared library export all globals found in .o files
that originate in the library.  That doesn't include symbols acquired by
-lpgcommon_shlib.  That is good on average, but it became a problem for
libpq when commit e6afa8918c461c1dd80c5063a950518fa4e950cd moved five
official libpq API symbols into src/common.  Fix this by implementing
the SHLIB_EXPORTS mechanism for AIX, so affected libraries export the
same symbols that they export on Linux.  This reintroduces symbols
pg_encoding_to_char, pg_utf_mblen, pg_char_to_encoding,
pg_valid_server_encoding, and pg_valid_server_encoding_id.  Back-patch
to v13, where the aforementioned commit first appeared.  While a minor
release is usually the wrong time to add or remove symbol exports in
libpq or libecpg, we should expect users to want each documented symbol.

Tony Reix

Discussion: https://postgr.es/m/PR3PR02MB6396742E2FC3E77D37A920BC86C79@PR3PR02MB6396.eurprd02.prod.outlook.com

src/Makefile.shlib
src/port/README

index 1e08698b497554580460ddd78b6330efc170db47..b8cbc96b28ba826f9d335690fe39b7fec8170960 100644 (file)
@@ -329,7 +329,11 @@ $(shlib): $(OBJS) | $(SHLIB_PREREQS)
    rm -f $(stlib)
    $(LINK.static) $(stlib) $^
    $(RANLIB) $(stlib)
+ifeq (,$(SHLIB_EXPORTS))
    $(MKLDEXPORT) $(stlib) $(shlib) >$(exports_file)
+else
+   ( echo '#! $(shlib)'; $(AWK) '/^[^#]/ {printf "%s\n",$$1}' $(SHLIB_EXPORTS) ) >$(exports_file)
+endif
    $(COMPILER) -o $(shlib) $(stlib) -Wl,-bE:$(exports_file) $(LDFLAGS) $(LDFLAGS_SL) $(SHLIB_LINK)
    rm -f $(stlib)
    $(AR) $(AROPT) $(stlib) $(shlib)
index c446b46e26ef3f1243f73a4d9b330f2690bc569d..97f18a623382ae6bf7ece9424c526e90ac44bea7 100644 (file)
@@ -28,5 +28,5 @@ applications.
 from libpgport are linked first.  This avoids having applications
 dependent on symbols that are _used_ by libpq, but not intended to be
 exported by libpq.  libpq's libpgport usage changes over time, so such a
-dependency is a problem.  Windows, Linux, and macOS use an export list to
-control the symbols exported by libpq.
+dependency is a problem.  Windows, Linux, AIX, and macOS use an export
+list to control the symbols exported by libpq.