Bug 4958

Summary: Qt 4.7.4 build crashes with Linux 2.6.29
Product: buildroot Reporter: Jérémie Scheer <jeremie.scheer>
Component: OtherAssignee: unassigned
Status: RESOLVED WONTFIX    
Severity: normal CC: buildroot
Priority: P5    
Version: 2012.02   
Target Milestone: ---   
Hardware: PC   
OS: Linux   
Host: x86_64 Target: arm
Build:
Attachments: Omit accept4 when not supported by the kernel.

Description Jérémie Scheer 2012-03-21 10:54:00 UTC
I'm using Linux 2.6.29.6 kernel and headers and I compile rootfs for ARM.

When Qt is being compiled, it crashed on this error:

linking ../../lib/libQtNetwork.so.4.7.4
.obj/debug-shared-emb-arm/qnativesocketengine_unix.o: In function `qt_safe_accept':
/srv/developpements/armadeus_4-1/buildroot/output/build/qt-4.7.4/src/network/../../include/QtNetwork/private/../../../src/network/socket/qnet_unix_p.h:121: undefined reference to `accept4'
.obj/debug-shared-emb-arm/qlocalserver_unix.o: In function `qt_safe_accept':
/srv/developpements/armadeus_4-1/buildroot/output/build/qt-4.7.4/src/network/socket/qnet_unix_p.h:121: undefined reference to `accept4'
collect2: ld returned 1 exit status
make[3]: *** [../../lib/libQtNetwork.so.4.7.4] Error 1
make[3]: Leaving directory `/srv/developpements/armadeus_4-1/buildroot/output/build/qt-4.7.4/src/network'
make[2]: *** [sub-network-make_default-ordered] Error 2
make[2]: Leaving directory `/srv/developpements/armadeus_4-1/buildroot/output/build/qt-4.7.4'
make[1]: *** [/srv/developpements/armadeus_4-1/buildroot/output/build/qt-4.7.4/.stamp_built] Error 2
make[1]: Leaving directory `/srv/developpements/armadeus_4-1/buildroot'
make: *** [all] Error 2

The problem is that the function 'accept4' doesn't exist in Linux 2.6.29. It is only defined in Linux 2.6.36 or more.
So when I rebuild all rootfs and Qt against Linux 2.6.38.8, it finished successfully.
Comment 1 Thomas Petazzoni 2012-03-21 12:27:37 UTC
There's not much we can do about this. Qt requires this accept4 system call, which isn't available in 2.6.29, so it doesn't build if the kernel headers of such kernel version are used.

What would like us to do here?
Comment 2 Jérémie Scheer 2012-03-21 14:40:11 UTC
Created attachment 4178 [details]
Omit accept4 when not supported by the kernel.
Comment 3 Jérémie Scheer 2012-03-21 14:43:52 UTC
Thank you for your answer. In fact, that's not really a Buildroot problem.
But I found a patch for uClibc that omits accept4 when the kernel version is too old to support it.

If that can be of any help, I attached this patch to the bug.
Comment 4 Peter Korsgaard 2012-03-21 22:16:17 UTC
(In reply to comment #3)

Do notice that just using new kernel headers is not enough if your kernel doesn't handle sys_accept4. Qt is also not the only program using accep4, udev is a another well known one.
Comment 5 Thomas Petazzoni 2012-04-23 21:54:59 UTC
Not a Buildroot bug per se: 2.6.29 is old now, and many userspace components depend on system calls that have been added since then, and therefore recent enough kernel headers are needed to build several userspace packages (qt, udev, etc.)