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

Serhii Popovych spopovyc at cisco.com
Fri Mar 31 15:19:29 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.
>>
>> But why in configure.ac
>> define([LIBC_LINUX_VERSION],[3.2.0])
>> sets to version 3.2.0?
>>
>> and then AC_TRY_COMPILE() sets libc_cv_linuxVER='missing or too old!'
>> causing configure to fail due to missing kheaders >= 3.2.0, not 2.6.32.
>>
>> Later in configure.ac I see minimum_kernel being checked with
>> AC_TRY_COMPILE() and same code as for LIBC_LINUX_VERSION.
>>
>> So we check for 3.2.0 and then check for minimum_kernel (--enable-
>> kernel) 2.6.32 after this?
> 
> By looking at commit 5b4ecd3 (Require Linux 3.2 except on x86 / x86_64,
> 3.2 headers everywhere.) contents closer I found answer for this
> question.
> 
> In NEWS file we have:
> 
> +  unchanged).  Linux 3.2 or later kernel headers are required on all
> +  architectures.
> 
> For me that means we should use kernel headers from 3.2 to build glibc,
> but for x86 / x86_64 we still may force minimum supported kernel version
> of 2.6.32 with --enable-kernel.
> 
> I will submit v2 without patch to remove LIBC_LINUX_VERSION check (i.e.
> just add --enable-kernel=${OLDEST_KERNEL}.

It seems even change to add --enable-kernel=${OLDEST_KERNEL} for
glibc-initial isn't necessary.

This whole patch *should* be skipped.

> 
> Thanks,
> Serhii
> 
>>
>>
>>> If you were to make the LIBC_LINUX_VERSION
>>> have a value that matches the arch_minimum_kernel version that would be
>>> an improvement.
>>
>> configure.ac (and thus configure) is only place where
>> LIBC_LINUX_VERSION is used, so I decided to remove it as remnant from
>> pre --enable-kernel option ages.
>>
>>>
>>> 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.
>>
>> I do not want to get quick fix. I want to find way to fix it right.
>>
>> Thanks.
>>
>>>
>>>
>>>> +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 ?= ""
>>>>
>>>



More information about the Openembedded-core mailing list