aix: when building with gcc, tell gcc we're building a shared library

Not passing -shared to gcc when building a shared library triggers linking to
the wrong libgcc (libgcc.a instead of libgcc_s.a) and prevents emitting
correct unwind information. It's somewhat surprising that this hasn't caused
known problems so far.

Doing so requires adding path to libgcc to libpath, or linking statically to
libgcc - as the latter increases .so size substantially (for not entirely
obvious reasons), shared linking seems preferrable.  It likely is worth
building executables with -shared-libgcc too, but I've not done that here.

Discussion: https://postgr.es/m/20220820174213.d574qde4ptwdzoqz@awork3.anarazel.de
This commit is contained in:
Andres Freund 2022-09-01 11:49:36 -07:00
parent a1b9b14cc8
commit e5484554ba
1 changed files with 11 additions and 0 deletions

View File

@ -8,10 +8,21 @@ AROPT = crs
# -blibpath must contain ALL directories where we should look for libraries
libpath := $(shell echo $(subst -L,:,$(filter -L/%,$(LDFLAGS))) | sed -e's/ //g'):/usr/lib:/lib
# when building with gcc, need to make sure that libgcc can be found
ifeq ($(GCC), yes)
libpath := $(libpath):$(dir $(shell gcc -print-libgcc-file-name))
endif
rpath = -Wl,-blibpath:'$(rpathdir)$(libpath)'
LDFLAGS_SL += -Wl,-bnoentry -Wl,-H512 -Wl,-bM:SRE
# gcc needs to know it's building a shared lib, otherwise it'll not emit
# correct code / link to the right support libraries
ifeq ($(GCC), yes)
LDFLAGS_SL += -shared
endif
# env var name to use in place of LD_LIBRARY_PATH
ld_library_path_var = LIBPATH