Bug 7574

Summary: quota-4.01 fails to build statically
Product: buildroot Reporter: Alexey Brodkin <abrodkin>
Component: OtherAssignee: Thomas Petazzoni <thomas.petazzoni>
Status: RESOLVED FIXED    
Severity: minor CC: abrodkin, buildroot, thomas.petazzoni
Priority: P5    
Version: 2014.08   
Target Milestone: ---   
Hardware: PC   
OS: Linux   
Host: Target:
Build:
Attachments: Defconfig

Description Alexey Brodkin 2014-10-28 13:08:31 UTC
--->---
.../arm-buildroot-linux-uclibcgnueabi-gcc -static -lintl  quotastats.o common.o pot.o   -o quotastats
.../arm-buildroot-linux-uclibcgnueabi-gcc -static -lintl  xqmstats.o common.o pot.o   -o xqmstats
quotastats.o: In function `get_proc_num':
quotastats.c:(.text+0x58): undefined reference to `libintl_gettext'
quotastats.o: In function `main':
quotastats.c:(.text.startup+0x138): undefined reference to `libintl_gettext'
quotastats.c:(.text.startup+0x1b4): undefined reference to `libintl_gettext'
quotastats.c:(.text.startup+0x1c4): undefined reference to `libintl_gettext'
quotastats.c:(.text.startup+0x228): undefined reference to `libintl_gettext'
quotastats.o:quotastats.c:(.text.startup+0x238): more undefined references to `libintl_gettext' follow
pot.o: In function `gettexton':
pot.c:(.text+0x1c): undefined reference to `libintl_bindtextdomain'
pot.c:(.text+0x28): undefined reference to `libintl_textdomain'
collect2: error: ld returned 1 exit status
make[2]: *** [quotastats] Error 1
make[2]: *** Waiting for unfinished jobs....
xqmstats.o: In function `main':
xqmstats.c:(.text.startup+0x70): undefined reference to `libintl_gettext'
xqmstats.c:(.text.startup+0x100): undefined reference to `libintl_gettext'
xqmstats.c:(.text.startup+0x10c): undefined reference to `libintl_gettext'
xqmstats.c:(.text.startup+0x11c): undefined reference to `libintl_gettext'
xqmstats.c:(.text.startup+0x12c): undefined reference to `libintl_gettext'
xqmstats.o:xqmstats.c:(.text.startup+0x13c): more undefined references to `libintl_gettext' follow
--->---

The reason seems to be in improper location of "-lintl".
Incase of static linkage it should be after (on left side) object files that call symbols of the library.

In other words following command line will work:
--->---
arm-buildroot-linux-uclibcgnueabi-gcc -static quotastats.o common.o pot.o -lintl  -o quotastats
--->---

In its turn "-lintl" is put in the beginning of command line because it's a part of LDFLAGS in quota's Makefile. And in "package/quota/quota.mk" we explicitly set it with "QUOTA_LDFLAGS += -lintl".

So the only proper fix I may think of is modification of quota's Makefile.in so that libraries are appended in the end of link command separately from LDFLAGS or move LDFLAGS in the end.
Comment 1 Alexey Brodkin 2014-10-28 13:09:31 UTC
Created attachment 5750 [details]
Defconfig

This defconfig could be used for reproduction of the issue with up-to-date master branch of Buildroot
Comment 2 Thomas De Schampheleire 2014-10-28 18:15:27 UTC
Normally, a separate variable LDLIBS is used for that purpose. This variable is then included at the end of the link command line, unlike LDFLAGS. At least this is the case in the implicit make recipes. I would assume that autotools has a similar distinction.
Comment 3 Thomas Petazzoni 2014-11-09 13:20:38 UTC
Patch series sent at http://lists.busybox.net/pipermail/buildroot/2014-November/111618.html to fix this bug.
Comment 4 Thomas Petazzoni 2014-11-10 09:16:18 UTC
Patch applied as of http://git.buildroot.net/buildroot/commit/?id=06d310e7a172a3dc61e30a4e5937e4455f6d340b, bug fixed.