[parted-devel] --as-needed linker option causes trouble with -lreadline/-ltermcap

Ralf Wildenhues Ralf.Wildenhues at gmx.de
Sat Mar 28 16:03:49 UTC 2009


Hi Jim,

* Jim Meyering wrote on Sat, Mar 28, 2009 at 03:22:14PM CET:
> When testing for the readline library, this works fine:
> 
>     echo 'char readline (); int main () { return readline (); }' > k.c
>     gcc k.c -lreadline -ltermcap
> 
> but in order to work around portability problems years ago, gnulib's
> lib-ignore.m4 makes it so the linker uses the --as-needed option:
> 
>     gcc k.c -Wl,--as-needed -lreadline -ltermcap
> 
> and that fails on RHEL 5.3
> (with binutils-2.17.50.0.6-9.el5.x86_64 and gcc-4.1.2-44.el5.x86_64):
> 
>     /usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../lib64/libreadline.so: undefined reference to `PC'
>     /usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../lib64/libreadline.so: undefined reference to `tgetflag'

libreadline depends upon libtermcap, but does not announce this
dependency with a DT_NEEDED entry (i.e., -ltermcap was not passed
to the command creating libreadline.so).  This is arguably a bug
in libreadline (but probably done intentionally to allow choosing
either termcap or ncurses or so).

To work around it in the test, I suppose you can link a program
that also requires a symbol from termcap.

Anyway, I thought CVS binutils had a patch to deal with this setup,
but reading the ld/NEWS entry, I'm not so sure anymore whether it
is sufficient:

  * --as-needed now links in a dynamic library if it satisfies undefined
    symbols in regular objects, or in other dynamic libraries.  In the
    latter case the library is not linked if it is found in a DT_NEEDED
    entry of one of the libraries already linked.

Hope that helps.

Cheers,
Ralf



More information about the parted-devel mailing list