uclibc-ng & ARC developers:
I'm trying to use buildroot to build the latest ARC toolchain
(arc-2016.09-eng007) against our vendor-provided 2.6.35.12 ARC Linux
kernel. (Yes, it is an ancient kernel, but that's what I have to work
with for now, unfortunately.)
The buildroot config is:
BR2_arcle=y
BR2_arc750d=y
BR2_ENABLE_DEBUG=y
BR2_PACKAGE_HOST_LINUX_HEADERS_CUSTOM_REALLY_OLD=y
BR2_TOOLCHAIN_BUILDROOT_INET_RPC=y
BR2_TOOLCHAIN_BUILDROOT_WCHAR=y
BR2_TOOLCHAIN_BUILDROOT_LOCALE=y
BR2_PTHREAD_DEBUG=y
BR2_TOOLCHAIN_BUILDROOT_USE_SSP=y
BR2_TOOLCHAIN_BUILDROOT_CXX=y
BR2_LINUX_KERNEL=y
BR2_LINUX_KERNEL_CUSTOM_LOCAL=y
BR2_LINUX_KERNEL_CUSTOM_LOCAL_PATH="/path/to/vendor/2.6.35.12/kernel"
BR2_LINUX_KERNEL_VERSION="2.6.35.12"
With this setup, I'm running into various uclibc-ng 1.0.17 build errors:
1) ./include/sys/procfs.h:30:28: error: invalid application of
'sizeof' to incomplete type 'struct user_regs_struct'
#define ELF_NGREG (sizeof (struct user_regs_struct) / sizeof(elf_greg_t))
QUICK FIX:
Copied 'struct user_regs_struct' definition from corresponding
2.6.35.12 kernel header to libc/sysdeps/linux/arc/sys/user.h
2) ./include/sys/cachectl.h:13:26: fatal error: asm/cachectl.h: No
such file or directory
#include <asm/cachectl.h>
QUICK FIX:
Commented the above line out in libc/sysdeps/linux/arc/sys/cachectl.h
3) In file included from
.../buildroot/output/build/linux-headers-custom/usr/include/linux/posix_types.h:47:0,
from
.../buildroot/output/build/linux-headers-custom/usr/include/linux/types.h:8,
from
.../buildroot/output/build/linux-headers-custom/usr/include/linux/rtnetlink.h:4,
from libc/inet/netlinkaccess.h:26,
from libc/inet/ifaddrs.c:36:
.../buildroot/output/build/linux-headers-custom/usr/include/asm/posix_types.h:22:25:
error: conflicting types for '__kernel_mode_t'
typedef unsigned short __kernel_mode_t;
^
In file included from ./include/bits/types.h:30:0,
from ./include/sys/types.h:30,
from ./include/sys/uio.h:23,
from ./include/sys/socket.h:27,
from ./include/ifaddrs.h:23,
from libc/inet/ifaddrs.c:22:
./include/bits/kernel_types.h:25:23: note: previous declaration of
'__kernel_mode_t' was here
typedef unsigned int __kernel_mode_t;
^
QUICK FIX:
Added #include <asm/posix_types.h> on top of
libc/sysdeps/linux/arc/bits/kernel_types.h and wrapped the uclibc
definitions with #ifndef _ASM_ARC_POSIX_TYPES_H ... #define
_ASM_ARC_POSIX_TYPES_H ... #endif to match the kernel header wrappers.
Also, needed to add #ifndef ... #define ... #endif wraps to __FD_*
definitions in libc/sysdeps/linux/common/bits/select.h
4) /usr/bin/make -j1 -C .../buildroot/output/build/uclibc-1.0.17
CC=".../buildroot/output/host/usr/bin/arc-buildroot-linux-uclibc-gcc"
CPP=".../buildroot/output/host/usr/bin/arc-buildroot-linux-uclibc-cpp"
LD=".../buildroot/output/host/usr/bin/arc-buildroot-linux-uclibc-ld"
ARCH="arc" PREFIX=.../buildroot/output/target utils install_utils
make[3]: Nothing to be done for `locale_headers'.
CC utils/getconf
../lib/libc.so.1: undefined reference to `__xstat32_conv'
../lib/libc.so.1: undefined reference to `__xstat64_conv'
collect2: error: ld returned 1 exit status
make[3]: *** [../utils/getconf] Error 1
make[2]: *** [utils] Error 2
make[1]: ***
[/usr/local/google/home/pgynther/clients/buildroot/output/build/uclibc-1.0.17/.stamp_target_installed]
Error 2
make: *** [_all] Error 2
QUICK FIX:
Created libc/sysdeps/linux/arc/bits/kernel_stat.h file from
corresponding kernel definitions and also added 'select
ARCH_HAS_DEPRECATED_SYSCALLS' in extra/Configs/Config.arc
After the above 4 patches have been applied, buildroot is able to
build the toolchain successfully.
And then, using this new toolchain, I'm able to build our internal
2.6.35.12 kernel + initramfs image.
However:
Once I boot the newly built image, the kernel boots fine, but /init
(busybox) crashes every time. And same happens with /bin/sh (dash).
Basically, no userland binary built with this toolchain runs on top of
2.6.35.12 kernel.
No matter what I provide on kernel command line parameter
"rdinit=/path/to/binary", the boot always ends with "Attempted to kill
init!" because the kernel doesn't like the userland binaries.
[ 2.070000] TCP cubic registered
[ 2.075000] NET: Registered protocol family 10
[ 2.080000] NET: Registered protocol family 17
[ 2.085000] 802.1Q VLAN Support v1.8 Ben Greear <greearb(a)candelatech.com>
[ 2.090000] All bugs added by David S. Miller <davem(a)redhat.com>
[ 2.100000] Freeing unused kernel memory: 19904k freed [84938000]
TO [85ca8000]
[ 2.105000] Common mmap addr-space starts 2c0f0000
[ 2.115000] Kernel panic - not syncing: Attempted to kill init!
Questions:
1) Does the latest ARC toolchain use some new ABI for binaries that
makes them incompatible with 2.6.35.12 kernel?
2) Is uclibc-ng 1.0.17 supposed to be compatible with 2.6.x kernel headers?
Any help is greatly appreciated. Thanks.
-- Petri