backports: fix mconf compilation library assumptions
authorLuis R. Rodriguez <mcgrof@suse.com>
Sun, 14 Sep 2014 13:05:29 +0000 (06:05 -0700)
committerLuis R. Rodriguez <mcgrof@do-not-panic.com>
Tue, 23 Sep 2014 07:39:24 +0000 (00:39 -0700)
On OpenSUSE factory 'make menuconfig' fails to compile with:

cc -Wall -Wmissing-prototypes -Wstrict-prototypes -O2
-fomit-frame-pointer -DCURSES_LOC="<ncurses.h>" -DLOCALE   -c -o
lxdialog/yesno.o lxdialog/yesno.c
cc -Wl,--no-as-needed -lncursesw  mconf.o zconf.tab.o
lxdialog/checklist.o lxdialog/inputbox.o lxdialog/menubox.o
lxdialog/textbox.o lxdialog/util.o lxdialog/yesno.o   -o mconf
/usr/lib64/gcc/x86_64-suse-linux/4.8/../../../../x86_64-suse-linux/bin/ld:
/lib64/libncursesw.so.5: undefined reference to symbol 'acs_map'
/usr/lib64/gcc/x86_64-suse-linux/4.8/../../../../lib64/libtinfo.so:
error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status

Although this can be fixed by linking with -ltinfo after a bit
further investigation I've traced this issue down to how we speak
to the linker and ask it to link and when. For instance if one
were to compile and link mconf by specifying the linker requirements
before the final object file things fail and if we ask for it after
things work. For instance if we ask for the libraries before:

gcc  -lncursesw -o
kconf/mconf
kconf/mconf.o
kconf/zconf.tab.o
kconf/lxdialog/checklist.o
kconf/lxdialog/util.o
kconf/lxdialog/inputbox.o
kconf/lxdialog/textbox.o
kconf/lxdialog/yesno.o
kconf/lxdialog/menubox.o  -lncursesw

Passing the linker requirements at the end makes the gcc happy:

gcc  -o kconf/mconf
kconf/mconf.o
kconf/zconf.tab.o
kconf/lxdialog/checklist.o
kconf/lxdialog/util.o
kconf/lxdialog/inputbox.o
kconf/lxdialog/textbox.o
kconf/lxdialog/yesno.o
kconf/lxdialog/menubox.o  -lncursesw

It seems that using -Wl,--no-as-needed does not do what we wish with regards
to the above requirements, this could be a bug but the kernel treats things
a bit differently so we need to adopt, fix this by being explicit by
using -Wl,--add-needed and letting it figure things out automagically.

This has been tested on Debian and OpenSUSE factory.

Signed-off-by: Luis R. Rodriguez <mcgrof@suse.com>
backport/kconf/Makefile

index dfd793aeac209c9804c8832e3b847b7ec5af47a7..b307c6570fd0a3ec232a424b9c245a2aee2d5e86 100644 (file)
@@ -3,7 +3,7 @@ CFLAGS=-Wall -Wmissing-prototypes -Wstrict-prototypes -O2 -fomit-frame-pointer
 LXDIALOG := lxdialog/checklist.o lxdialog/inputbox.o lxdialog/menubox.o lxdialog/textbox.o lxdialog/util.o lxdialog/yesno.o
 
 conf: conf.o zconf.tab.o
-mconf: LDFLAGS = -Wl,--no-as-needed $(shell ./lxdialog/check-lxdialog.sh -ldflags $(CC))
+mconf: LDFLAGS = -Wl,--add-needed $(shell ./lxdialog/check-lxdialog.sh -ldflags $(CC))
 mconf: CFLAGS += -DCURSES_LOC="<ncurses.h>" -DLOCALE
 mconf: mconf.o zconf.tab.o $(LXDIALOG)