--as-needed and undefined non-weak symbols

Ville Skyttä ville.skytta at iki.fi
Thu Oct 26 14:31:13 UTC 2006


I'm wondering if I've stumbled upon a bug in ld's --as-needed or
something I was not aware of, here's an example, foo.c:

extern void gtk_main();
int main() {
    gtk_main();
}

Now, libgtk (as of FC5) contains lots of undefined gdk_* symbols, so
trying "gcc -lgtk foo.c" on the above fails as expected, and "gcc -lgdk
-lgtk foo.c" succeeds, again as expected.  However, to my surprise, "gcc
-Wl,--as-needed -lgdk -lgtk foo.c" fails:

/tmp/ccImoouo.o: In function `main':
foo.c:(.text+0xa): undefined reference to `gtk_main'
collect2: ld returned 1 exit status

Is this how --as-needed should behave?  Ie. the linker does not appear
to notice that linking with libgdk is actually needed in this case and
drops it -> boom.

gtk+ is just an easy-to-find example in Fedora, and in its case,
eliminating the non-weak symbols in libgtk by linking it with libgdk
would most likely be the correct way around the problem, ditto with the
majority of other undefined-non-weak-symbols-in-shared-libs cases out
there.  But don't pay attention to those details, I'm curious whether
the above demonstrates a problem in --as-needed or not.




More information about the fedora-devel-list mailing list