Hi Noah, Yes, trying to use the create lib$(NAME).exp from $(SHLIB_EXPORTS) when it exists was my first idea, too. However, I do not master (or I forgot) this kind of "if...." in a Makefile and I was unable to find a solution by reading Makefile manuals or by searching for a similar example. So, I did it in an easier (to me!) and quicker way: merge with a new command line in the Makefile rule. Now that we have a clear understanding of what is happenning, I may have a deeper look at a clean Makefile solution. However, if you know how to manage this, I would really appreciate some example. I'm asking my colleague too if he can help me here.
Thx Tony ________________________________ De : Noah Misch <n...@leadboat.com> Envoyé : lundi 30 août 2021 16:52 À : REIX, Tony <tony.r...@atos.net> Cc : pgsql-hackers@lists.postgresql.org <pgsql-hackers@lists.postgresql.org> Objet : Re: AIX: Symbols are missing in libpq.a Caution! External email. Do not open attachments or click links, unless this email comes from a known sender and you know the content is safe. On Mon, Aug 30, 2021 at 02:33:32PM +0000, REIX, Tony wrote: > It appears that the Makefile in src/interfaces/libpq has been modified > between v12 and v13, removing encnames.o (and wchar.o) from the object files > being used for creating the static libpq.a file which is used for creating > the libpq.so and libpq.a AIX shared-library files. > And, since pg_encoding_to_char() is defined in encnames.o , it has > disappeared from the libpq.exp file . > > # diff postgresql-12.8/32bit/src/interfaces/libpq/Makefile > postgresql-13.1/32bit/src/interfaces/libpq/Makefile | grep encnames > < OBJS += encnames.o wchar.o > < encnames.c wchar.c: % : $(backend_src)/utils/mb/% > < rm -f encnames.c wchar.c > > Remember how the final libpq.a is built on AIX: > > rm -f libpq.a > /usr/bin/ar crs libpq.a fe-auth-scram.o ... > touch libpq.a > ../../../src/backend/port/aix/mkldexport.sh libpq.a libpq.so.5 >libpq.exp > /opt/freeware/bin/gcc -maix64 -O3 ..... -o libpq.so.5 libpq.a > -Wl,-bE:libpq.exp ....... > rm -f libpq.a > /usr/bin/ar crs libpq.a libpq.so.5 > > 12.8 : /usr/bin/ar crs libpq.a fe-auth.o fe-auth-scram.o fe-connect.o > fe-exec.o fe-lobj.o fe-misc.o fe-print.o fe-protocol2.o fe-protocol3.o > pqexpbuffer.o fe-secure.o legacy-pqsignal.o > libpq-events.o encnames.o wchar.o fe-secure-openssl.o fe-secure-common.o > > 13.1 : /usr/bin/ar crs libpq.a fe-auth.o fe-auth-scram.o fe-connect.o > fe-exec.o fe-lobj.o fe-misc.o fe-print.o fe-protocol2.o fe-protocol3.o > pqexpbuffer.o fe-secure.o legacy-pqsignal.o > libpq-events.o fe-secure-common.o fe-secure-openssl.o > > > Maybe you can discover why these changes were made in v13 for > src/interfaces/libpq/Makefile . > And mkldexport.sh , unchanged between v12 and v13, works perfectly. Thanks; that makes sense. Those files moved to libpgcommon_shlib.a. The $(MKLDEXPORT) call sees symbols in the .o files, but it doesn't see symbols pulled in via libpg*.a. Let's fix this by having Makefile.shlib skip $(MKLDEXPORT) when a $(SHLIB_EXPORTS) file is available and have it instead create lib$(NAME).exp from $(SHLIB_EXPORTS). That's more correct than merging, and it's simpler. Would you like to try that?