On Wed, Nov 16, 2016 at 11:28 PM, Michael Paquier <michael.paqu...@gmail.com> wrote: > On Wed, Nov 16, 2016 at 8:04 PM, Michael Paquier > <michael.paqu...@gmail.com> wrote: >> In the current set of patches, the sha2 functions would not get used >> until the main patch for SCRAM gets committed so that's a couple of >> steps and many months ahead.. And --as-needed/--no-as-needed are not >> supported in macos. So I would believe that the best route is just to >> use this patch with the way it does things, and once SCRAM gets in we >> could switch the build into more appropriate linking. At least that's >> far less ugly than having fake objects in the backend code. Of course >> a comment in pgcrypo's Makefile would be appropriate. > > Or a comment with a "ifeq ($(PORTNAME), darwin)" containing the > additional objects to make clear that this is proper to only OSX. > Other ideas are welcome.
So, the problem isn't Darwin-specific. I experimented with this on Linux and found Linux does the same thing with libpgcommon_srv.a that macOS does: a file in the archive that is totally unused is omitted from the postgres binary. In Linux, however, that doesn't prevent pgcrypto from compiling anyway. It does, however, prevent it from working. Instead of failing at compile time with a complaint about missing symbols, it fails at load time. I think that's because macOS has -bundle-loader and we use it; without that, I think we'd get the same behavior on macOS that we get on Windows. The fundamental problem here is that the archive-member-dropping behavior that we're getting here is not really what we want, and I think that's going to happen on most or all architectures. For GNU ld, we could add -Wl,--whole-archive, and macOS has -all_load, but I that this is just a nest of portability problems waiting to happen. I think there are two things we can do here that are far simpler: 1. Rejigger things so that we don't build libpgcommon_srv.a in the first place, and instead add $(top_builddir)/src/common to src/backend/Makefile's value of SUBDIRS. With appropriate adjustments to src/common/Makefile, this should allow us to include all of the object files on the linker command line individually instead of building an archive library that is then used only for the postgres binary itself anyway. Then, things wouldn't get dropped. 2. Just postpone committing this patch until we're ready to use the new code in the backend someplace (or add a dummy reference to it someplace). -- Robert Haas EnterpriseDB: http://www.enterprisedb.com The Enterprise PostgreSQL Company -- Sent via pgsql-hackers mailing list (email@example.com) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers