[OE-core] [PATCH] glibc: Support building with 2.6.32 kernels on x86 / x86_64

Khem Raj raj.khem at gmail.com
Wed Mar 29 00:03:00 UTC 2017



On 3/28/17 11:57 AM, Serhii Popovych wrote:
> While glibc states that 2.6.32 kernels still supported
> for x86 / x86_64 builds are failing due to out of date
> LIBC_LINUX_VERSION macro checks for such architectures.
> 
> This macro statically defined to 3.2.0 with commit 5b4ecd3
> (Require Linux 3.2 except on x86 / x86_64, 3.2 headers everywhere.)
> and additionally checked before --enable-kernel.
> 
> Since both --enable-kernel and LIBC_LINUX_VERSION checks
> are the same and there is no users of last one we can
> safely get rid of it enabling glibc builds with 2.6.32
> kernel headers.
> 
> Also add --enable-kernel to glibc-initial build so that we
> build it correctly with old headers.
> 
> Cc: XE-Linux <xe-linux-external at cisco.com>
> Signed-off-by: Serhii Popovych <spopovyc at cisco.com>
> ---
>  meta/recipes-core/glibc/glibc-initial.inc          |   1 +
>  .../glibc/0028-Kill-LIBC_LINUX_VERSION-macro.patch | 113 +++++++++++++++++++++
>  meta/recipes-core/glibc/glibc_2.25.bb              |   1 +
>  3 files changed, 115 insertions(+)
>  create mode 100644 meta/recipes-core/glibc/glibc/0028-Kill-LIBC_LINUX_VERSION-macro.patch
> 
> diff --git a/meta/recipes-core/glibc/glibc-initial.inc b/meta/recipes-core/glibc/glibc-initial.inc
> index f94603c..60b25dd 100644
> --- a/meta/recipes-core/glibc/glibc-initial.inc
> +++ b/meta/recipes-core/glibc/glibc-initial.inc
> @@ -12,6 +12,7 @@ do_configure () {
>  	find ${S} -name "configure" | xargs touch
>  	cfgscript=`python3 -c "import os; print(os.path.relpath('${S}', '.'))"`/configure
>  	$cfgscript --host=${TARGET_SYS} --build=${BUILD_SYS} \
> +		--enable-kernel=${OLDEST_KERNEL} \
>  		--prefix=/usr \
>  		--without-cvs --disable-sanity-checks \
>  		--with-headers=${STAGING_DIR_TARGET}${includedir} \
> diff --git a/meta/recipes-core/glibc/glibc/0028-Kill-LIBC_LINUX_VERSION-macro.patch b/meta/recipes-core/glibc/glibc/0028-Kill-LIBC_LINUX_VERSION-macro.patch
> new file mode 100644
> index 0000000..f5eaf1c
> --- /dev/null
> +++ b/meta/recipes-core/glibc/glibc/0028-Kill-LIBC_LINUX_VERSION-macro.patch
> @@ -0,0 +1,113 @@
> +From 88f83e4b5a8929dac9095ed264700fcb62d5e4dd Mon Sep 17 00:00:00 2001
> +From: Serhii Popovych <spopovyc at cisco.com>
> +Date: Fri, 17 Mar 2017 15:48:34 +0000
> +Subject: Kill LIBC_LINUX_VERSION macro
> +
> +After commit 5b4ecd3 (Require Linux 3.2 except on x86 / x86_64,
> +3.2 headers everywhere.) minimal kernel version raised from
> +2.6.32 to 3.2.0 for all architectures except x86 and x86_64
> +unless newer already used for architecture.
> +
> +However LIBC_LINUX_VERSION macro still is in effect and fails
> +configure even with --enable-kernel=2.6.32.
> +
> +While it is present in configure.ac it does not affect anything
> +except LINUX_VERSION_CODE check which already performed by
> +--enable-kernel.
> +

--enable-kernel is forces the minimum kernel for glibc to configure for
kernel interfaces if not set it defaults to arch specific value but it
wont check for version of linux headers during compile time. Whereas
this check is checking and errors out during build time if minimum
kernel version is not met. If you were to make the LIBC_LINUX_VERSION
have a value that matches the arch_minimum_kernel version that would be
an improvement.

As such if you want to do quick fix then lower the value of
LIBC_LINUX_VERSION to 2.6.32 when building for x86/x86_64, we can accept
such a patch with a bit less happiness.


> +Upstream-Status: Pending
> +Signed-off-by: Serhii Popovych <spopovyc at cisco.com>
> +---
> + sysdeps/unix/sysv/linux/configure    | 39 ------------------------------------
> + sysdeps/unix/sysv/linux/configure.ac | 21 -------------------
> + 2 files changed, 60 deletions(-)
> +
> +diff --git a/sysdeps/unix/sysv/linux/configure b/sysdeps/unix/sysv/linux/configure
> +index cace758..ab5fabe 100644
> +--- a/sysdeps/unix/sysv/linux/configure
> ++++ b/sysdeps/unix/sysv/linux/configure
> +@@ -6,45 +6,6 @@ if test -n "$sysheaders"; then
> +   CPPFLAGS="$CPPFLAGS $SYSINCLUDES"
> + fi
> + 
> +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking installed Linux kernel header files" >&5
> +-$as_echo_n "checking installed Linux kernel header files... " >&6; }
> +-if ${libc_cv_linux320+:} false; then :
> +-  $as_echo_n "(cached) " >&6
> +-else
> +-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
> +-/* end confdefs.h.  */
> +-#include <linux/version.h>
> +-#if !defined LINUX_VERSION_CODE || LINUX_VERSION_CODE <  (3 *65536+ 2 *256+ 0) /* 3.2.0 */
> +-# error kernel headers missing or too old
> +-#endif
> +-int
> +-main ()
> +-{
> +-
> +-  ;
> +-  return 0;
> +-}
> +-_ACEOF
> +-if ac_fn_c_try_compile "$LINENO"; then :
> +-  libc_cv_linux320='3.2.0 or later'
> +-else
> +-  libc_cv_linux320='missing or too old!'
> +-fi
> +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
> +-fi
> +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_linux320" >&5
> +-$as_echo "$libc_cv_linux320" >&6; }
> +-if test "$libc_cv_linux320" != '3.2.0 or later'; then
> +-  as_fn_error $? "GNU libc requires kernel header files from
> +-Linux 3.2.0 or later to be installed before configuring.
> +-The kernel header files are found usually in /usr/include/asm and
> +-/usr/include/linux; make sure these directories use files from
> +-Linux 3.2.0 or later.  This check uses <linux/version.h>, so
> +-make sure that file was built correctly when installing the kernel header
> +-files.  To use kernel headers not from /usr/include/linux, use the
> +-configure option --with-headers." "$LINENO" 5
> +-fi
> +-
> + # If the user gave a minimal version number test whether the available
> + # kernel headers are young enough.  Additionally we have minimal
> + # kernel versions for some architectures.  If a previous configure fragment
> +diff --git a/sysdeps/unix/sysv/linux/configure.ac b/sysdeps/unix/sysv/linux/configure.ac
> +index 13abda0..5b47db5 100644
> +--- a/sysdeps/unix/sysv/linux/configure.ac
> ++++ b/sysdeps/unix/sysv/linux/configure.ac
> +@@ -1,31 +1,10 @@
> + GLIBC_PROVIDES dnl See aclocal.m4 in the top level source directory.
> + # Local configure fragment for sysdeps/unix/sysv/linux.
> + 
> +-define([LIBC_LINUX_VERSION],[3.2.0])dnl
> + if test -n "$sysheaders"; then
> +   OLD_CPPFLAGS=$CPPFLAGS
> +   CPPFLAGS="$CPPFLAGS $SYSINCLUDES"
> + fi
> +-define([libc_cv_linuxVER], [libc_cv_linux]patsubst(LIBC_LINUX_VERSION,[\.]))dnl
> +-AC_CACHE_CHECK(installed Linux kernel header files, libc_cv_linuxVER, [dnl
> +-AC_TRY_COMPILE([#include <linux/version.h>
> +-#if !defined LINUX_VERSION_CODE || LINUX_VERSION_CODE < ]dnl
> +-patsubst(LIBC_LINUX_VERSION,[^\([^.]*\)\.\([^.]*\)\.\([^.]*\)$],dnl
> +-[ (\1 *65536+ \2 *256+ \3) /* \1.\2.\3 */])[
> +-# error kernel headers missing or too old
> +-#endif], [],
> +-	       [libc_cv_linuxVER='LIBC_LINUX_VERSION or later'],
> +-	       [libc_cv_linuxVER='missing or too old!'])])
> +-if test "$libc_cv_linuxVER" != 'LIBC_LINUX_VERSION or later'; then
> +-  AC_MSG_ERROR([GNU libc requires kernel header files from
> +-Linux LIBC_LINUX_VERSION or later to be installed before configuring.
> +-The kernel header files are found usually in /usr/include/asm and
> +-/usr/include/linux; make sure these directories use files from
> +-Linux LIBC_LINUX_VERSION or later.  This check uses <linux/version.h>, so
> +-make sure that file was built correctly when installing the kernel header
> +-files.  To use kernel headers not from /usr/include/linux, use the
> +-configure option --with-headers.])
> +-fi
> + 
> + # If the user gave a minimal version number test whether the available
> + # kernel headers are young enough.  Additionally we have minimal
> +-- 
> +2.7.4
> +
> diff --git a/meta/recipes-core/glibc/glibc_2.25.bb b/meta/recipes-core/glibc/glibc_2.25.bb
> index cf9c4f7..869d023 100644
> --- a/meta/recipes-core/glibc/glibc_2.25.bb
> +++ b/meta/recipes-core/glibc/glibc_2.25.bb
> @@ -42,6 +42,7 @@ SRC_URI = "${GLIBC_GIT_URI};branch=${SRCBRANCH};name=glibc \
>             file://0025-Define-DUMMY_LOCALE_T-if-not-defined.patch \
>             file://0026-elf-dl-deps.c-Make-_dl_build_local_scope-breadth-fir.patch \
>             file://0027-locale-fix-hard-coded-reference-to-gcc-E.patch \
> +           file://0028-Kill-LIBC_LINUX_VERSION-macro.patch \
>  "
>  
>  NATIVESDKFIXES ?= ""
> 

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 204 bytes
Desc: OpenPGP digital signature
URL: <http://lists.openembedded.org/pipermail/openembedded-core/attachments/20170328/6025636e/attachment-0002.sig>


More information about the Openembedded-core mailing list