The argument for reinstating --as-needed

From: Martijn van Oosterhout <kleptog(at)svana(dot)org>
To: pgsql-hackers(at)postgresql(dot)org
Subject: The argument for reinstating --as-needed
Date: 2005-10-29 18:28:43
Message-ID: 20051029182843.GE17490@svana.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

As some of you may remember, a patch for adding --as-needed to the GNU
linker command line was added [1] and subsequently removed [2] under
the mistaken assumption that it was a linker bug [3]. It isn't.

The bug is actually in readline, in that it doesn't declare its
dependancy on termcap/ncurses. Note: this bug was fixed back in 2002 in
Debian (so no Debian systems are affected by this problem) but is still
present in the latest Redhat release and probably many other places.

I propose we add a workaround for readline and add the flag back again.
The benefits are obvious, from 228 to 87 DT_NEEDED records across a
normal PostgreSQL installation, and the server will no longer depend on
readline (always an odd point). The patch is attached: it basically
adds a reference to termcap/ncurses directly so the psql binary links
to it. psql is the only binary that uses readline so this solves the
problem.

Just a quick note as to why it's not a bug in the linker. The
--as-needed flag includes DT_NEEDED records only for libraries
referenced by the objects. The issue is that ld removed termcap, needed
by readline but not by psql directly.

To see why this is not a bug, think about what the -l options are for.
They are for resolving symbols not found in the objects you are
linking. The linker *does not* look for the symbols needed by the
shared libraries given. Static libraries (being sets of objects) yes,
shared libraries no. Shared libraries have their own DT_NEEDED records
to say what they depend on, they don't need to be checked again.

On my Debian system where readline is configured correctly, ncurses is
not mentioned on the link line and the linker doesn't look for it
either. It is used at runtime though.

Other issues:

(a) won't this happen again with some other library? Well, unlikely.
Obviously this can only affect libraries we list on our link line.
Note, a library having this problem would fail autoconf tests also, so
we'd know about it. We already have a hack in the autoconf stuff for
readline already, I just don't think people expected it to apply to
Redhat.

(b) it wastes 4 bytes. Well yes, but I think the benefits outweigh the
costs. I added it to input.c but it could be a seperate file.

(c) an autoconf test to test for this condition. Well, I thought about
it but the cost and effort of maintaining such a test is far higher
than just forcing the reference.

Have a nice day,

[1] http://archives.postgresql.org/pgsql-committers/2005-05/msg00042.php
[2] http://archives.postgresql.org/pgsql-hackers/2005-05/msg00488.php
[3] https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=157126
--
Martijn van Oosterhout <kleptog(at)svana(dot)org> http://svana.org/kleptog/
> Patent. n. Genius is 5% inspiration and 95% perspiration. A patent is a
> tool for doing 5% of the work and then sitting around waiting for someone
> else to do the other 95% so you can sue them.

Attachment Content-Type Size
psql-readline.patch text/plain 710 bytes

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Bruce Momjian 2005-10-29 18:47:17 Re: The argument for reinstating --as-needed
Previous Message Tom Lane 2005-10-29 17:42:42 Re: FKs on temp tables: hard, or just omitted?