From cd47c091ba6f7d6d9a98c85fc5729a434c99d4ea Mon Sep 17 00:00:00 2001 From: Bryan Hundven Date: Tue, 27 Jan 2015 22:43:25 -0800 Subject: eglibc: Remove eglibc support As posted on http://www.eglibc.org/ ==================== EGLIBC is no longer developed and such goals are now being addressed directly in GLIBC. ==================== I'm not interested in maintaining build support for unsupported software. Older branches of crosstool-ng continue to have eglibc support. If you find issues with older branches, I'm always open to pull requests. Removing eglibc also frees up glibc cleanup and build optimization. Signed-off-by: Bryan Hundven diff --git a/config/arch/microblaze.in b/config/arch/microblaze.in index fb38e1f..c664498 100644 --- a/config/arch/microblaze.in +++ b/config/arch/microblaze.in @@ -19,4 +19,4 @@ ## help ## help Support is being added for a modern gcc, ## help binutils and gdb along with nptl threading -## help in eglibc for microblaze. +## help in glibc for microblaze. diff --git a/config/binutils/binutils.in b/config/binutils/binutils.in index 9800004..8c1bf87 100644 --- a/config/binutils/binutils.in +++ b/config/binutils/binutils.in @@ -160,8 +160,8 @@ config BINUTILS_HAS_PKGVERSION_BUGURL bool # Force using the BFD linker if needed -# This is the case for some C libraries (eg. glibc and -# eglibc at least) and affected components can select this +# This is the case for some C libraries (eg. glibc at least) and affected +# components can select this config BINUTILS_FORCE_LD_BFD bool @@ -219,7 +219,7 @@ endchoice # Enable linkers if BINUTILS_LINKER_GOLD comment "WARNING! gold is not capable of" -comment "| building glibc/eglibc!" +comment "| building glibc!" endif # BINUTILS_LINKER_GOLD config BINUTILS_GOLD_INSTALLED diff --git a/config/libc/eglibc.in.2 b/config/libc/eglibc.in.2 deleted file mode 100644 index 84553f3..0000000 --- a/config/libc/eglibc.in.2 +++ /dev/null @@ -1 +0,0 @@ -source "config/libc/glibc-eglibc.in-common" diff --git a/config/libc/glibc-eglibc.in-common b/config/libc/glibc-eglibc.in-common deleted file mode 100644 index f199e3a..0000000 --- a/config/libc/glibc-eglibc.in-common +++ /dev/null @@ -1,268 +0,0 @@ -# This file contains the common configuration options -# that apply to both glibc and eglibc. - -# Some architectures require the ports addon. List them one by one here: -# This list must be carefully in sync with the architectures names -# we can find in config/arch/* - -config LIBC_GLIBC_PORTS_EXTERNAL - bool - default n - -config LIBC_GLIBC_MAY_FORCE_PORTS - bool - default y if ARCH_arm - default y if ARCH_mips - select LIBC_GLIBC_USE_PORTS - depends on !LIBC_GLIBC_2_20_or_later - -# Force using the BFD linker during the toolchain build -config LIBC_glibc_familly - bool - default y - select BINUTILS_FORCE_LD_BFD - -config LIBC_GLIBC_EXTRA_CONFIG_ARRAY - string - prompt "extra config" - default "" - help - Extra flags to pass onto ./configure when configuring. - - You can enter multiple arguments here, and arguments can contain spaces - if they are properly quoted (or escaped, but prefer quotes). Eg.: - --with-foo="1st arg with 4 spaces" --with-bar=2nd-arg-without-space - -config LIBC_GLIBC_CONFIGPARMS - string - prompt "Extra config params (READ HELP)" - default "" if ! ARCH_sh - default "no-z-defs=yes" if ARCH_sh - help - Some architectures need to set options in the file configparms. - This is the case for sh3/4, which really need to set configparms - to "no-z-defs=yes" as of gcc-3.4/glibc-2.3.2. - - Unless you are building a toolchain for sh3/4, you should leave that empty. - - Note: If you need to pass more than one value, separate them with - '\n'. Eg.: var1=val1\nvar2=val2 - -config LIBC_GLIBC_EXTRA_CFLAGS - string - prompt "extra target CFLAGS" - default "" - help - Extra target CFLAGS to use when building. - -config LIBC_EXTRA_CC_ARGS - string - prompt "gcc extra flags" - default "" - help - Extra flags to pass gcc when building. - - Seldom used, except for sparc64 which seems to need the flag -64 - to be passed onto gcc. - -config LIBC_ENABLE_FORTIFIED_BUILD - bool - prompt "Enable fortified build (EXPERIMENTAL)" - depends on EXPERIMENTAL - help - If you say 'y' here, then glibc will be using fortified versions - of functions with format arguments (eg. vsyslog, printf...), and - do a sanity check on the format at runtime, to avoid some of the - common format string attacks. - - This is currently not supported, and will most probably result in - a broken build, with an error message like: - ../misc/syslog.c: In function '__vsyslog_chk': - ../misc/syslog.c:123: sorry, unimplemented: inlining failed in - call to 'syslog': function body not available - - If you are brave enough and want to debug the issue, then say 'y' - here. Otherwise, be still and say 'n' (the default). ;-) - - -config LIBC_DISABLE_VERSIONING - bool - prompt "Disable symbols versioning" - help - Do not include versioning information in the library objects. - -config LIBC_OLDEST_ABI - string - prompt "Oldest supported ABI" - default "" - help - Set the oldest ABI supported by the C library. - - Setting this option, for example, to 2.2 will provide ABI support - back to (e)glibc-2.2. - - If this option is not set, (e)glibc will choose for you. - -config LIBC_GLIBC_FORCE_UNWIND - bool - prompt "Force unwind support (READ HELP!)" - default y - help - If your toolchain fails building while building the C library - start files, or the complete C library, with a message like: - configure: error: forced unwind support is required - - then you may try changing this option. Otherwise, leave it to - the default 'y'. - - The issue seems to be related to building NPTL on old versions - of glibc (and possibly eglibc as well) on some architectures - (seen on s390, s390x and x86_64). - -config LIBC_GLIBC_USE_PORTS - bool - prompt "Use the ports addon" - depends on !LIBC_GLIBC_2_20_or_later - help - The ports addon contains some architecture ports that are not available - in the official distribution. - - For example, this is the case for ARM with glibc-2.4 and above. - - Say n only if you're sure that your architecture is in the official - distribution for your chosen version. - -config LIBC_ADDONS_LIST - string - prompt "Extra addons" - default "" - help - Extra addons to include. Space separated list. - - You need to specify neither linuxthreads nor nptl, as they are added - automagically for you depending on the threading model you chose - earlier. - - Eg.: crypt (for very old libces) - -if LIBC_GLIBC_USE_PORTS || ( LIBC_ADDONS_LIST != "" ) -comment "WARNING !!! " -comment "| For glibc >= 2.8, it can happen that the tarballs " -comment "| for the addons are not available for download. " -comment "| If that happens, bad luck... Try a previous version " -comment "| or try again later... :-( " -endif - -config LIBC_LOCALES - bool - prompt "Build and install locales" - help - Whether to build and install the libc locale files for the target, - which is required in order to support internationalization. - -if LIBC_glibc && LIBC_LOCALES -comment "WARNING! " -comment "| The built locales will be usable if and only if the build " -comment "| machine and the target: " -comment "| - have the same endianness, " -comment "| - and have the same alignment requirements for uint32_t. " -comment "| You will have to check by yourself (for now). " -endif # LIBC_glibc && LIBC_LOCALES - -if KERNEL_linux - -choice LIBC_GLIBC_SUPPORTED_KERNEL - bool - prompt "Minimum supported kernel version" - default LIBC_GLIBC_KERNEL_VERSION_AS_HEADERS - -config LIBC_GLIBC_KERNEL_VERSION_NONE - bool - prompt "Let ./configure decide" - help - Let ./configure decide what minimum kernel version glibc/eglibc - will be able to run against. - - This will include legacy compatibility code for older kernels in - the C library, thus ensuring that it will run on a large number - of old kernels. - - The minimum kernel version supported will be dependent upon the - target you build for. For example: - alpha*-*-linux-gnu Requires Linux 2.6.9 for NPTL - sh[34]-*-linux-gnu Requires Linux 2.6.11 - powerpc* Requires Linux 2.4.19 - arm*-*-linux-*gnueabi Requires Linux 2.6.16 - -config LIBC_GLIBC_KERNEL_VERSION_AS_HEADERS - bool - prompt "Same as kernel headers (default)" - help - Normally, you'll want glibc/eglibc to run against the same kernel - version as the one used for the headers. - - This is the default. - - If enabled, crosstool-ng will use the chosen version of kernel - headers for the glibc minimum kernel version supported, which is - what gets passed to "--enable-kernel=" when configuring glibc. - - Enabling this will ensure that no legacy compatibility code for - older kernels is built into your C libraries, but it will - be unable to run on kernel versions older than whichever kernel - headers version you've built the toolchain for. - - If you know for sure that your toolchain will never need to build - applications that will run under a kernel version older than your - chosen kernel headers version (CT_KERNEL_VERSION), you can choose - "y" here. - -config LIBC_GLIBC_KERNEL_VERSION_CHOSEN - bool - prompt "Specific kernel version" - help - Specify the earliest Linux kernel version you want glibc to - include support for. This does not have to match the kernel - headers version used for your toolchain. This controls what is - passed to the "--enable-kernel=" option to the glibc configure - script. - - If you want to be able to statically link programs with your - toolchain's C library, make sure this kernel version is lower than - all kernels you wish to support to avoid "FATAL: kernel too old" - errors. The higher the version you specify, the less legacy code - will be built into libc. - - Most people can leave this at the default value of "2.6.9". - -if LIBC_GLIBC_KERNEL_VERSION_CHOSEN - -config LIBC_GLIBC_MIN_KERNEL_VERSION - string - prompt "Minimum kernel version to support" - default "2.6.9" - help - Enter here the lowest kernel version glibc/eglibc will be able to - run against. - - The minimum kernel version supported will be dependent upon the - target you build for. For example: - alpha*-*-linux-gnu Requires Linux 2.6.9 for NPTL - sh[34]-*-linux-gnu Requires Linux 2.6.11 - powerpc* Requires Linux 2.4.19 - arm*-*-linux-*gnueabi Requires Linux 2.6.16 - - Note that no sanity check is performed by crosstool-NG to ensure - that the value you enter here is appropriate for your target. - -endif # LIBC_GLIBC_KERNEL_VERSION_CHOSEN - -endchoice - -config LIBC_GLIBC_MIN_KERNEL - string - default "" if LIBC_GLIBC_KERNEL_VERSION_NONE - default KERNEL_VERSION if LIBC_GLIBC_KERNEL_VERSION_AS_HEADERS - default LIBC_GLIBC_MIN_KERNEL_VERSION if LIBC_GLIBC_KERNEL_VERSION_CHOSEN - -endif # KERNEL_linux diff --git a/config/libc/glibc.in.2 b/config/libc/glibc.in.2 index 84553f3..346f9b7 100644 --- a/config/libc/glibc.in.2 +++ b/config/libc/glibc.in.2 @@ -1 +1,267 @@ -source "config/libc/glibc-eglibc.in-common" +# This file contains the common configuration options +# that apply to both glibc. + +# Some architectures require the ports addon. List them one by one here: +# This list must be carefully in sync with the architectures names +# we can find in config/arch/* + +config LIBC_GLIBC_PORTS_EXTERNAL + bool + default n + +config LIBC_GLIBC_MAY_FORCE_PORTS + bool + default y if ARCH_arm + default y if ARCH_mips + select LIBC_GLIBC_USE_PORTS + depends on !LIBC_GLIBC_2_20_or_later + +# Force using the BFD linker during the toolchain build +config LIBC_glibc_familly + bool + default y + select BINUTILS_FORCE_LD_BFD + +config LIBC_GLIBC_EXTRA_CONFIG_ARRAY + string + prompt "extra config" + default "" + help + Extra flags to pass onto ./configure when configuring. + + You can enter multiple arguments here, and arguments can contain spaces + if they are properly quoted (or escaped, but prefer quotes). Eg.: + --with-foo="1st arg with 4 spaces" --with-bar=2nd-arg-without-space + +config LIBC_GLIBC_CONFIGPARMS + string + prompt "Extra config params (READ HELP)" + default "" if ! ARCH_sh + default "no-z-defs=yes" if ARCH_sh + help + Some architectures need to set options in the file configparms. + This is the case for sh3/4, which really need to set configparms + to "no-z-defs=yes" as of gcc-3.4/glibc-2.3.2. + + Unless you are building a toolchain for sh3/4, you should leave that empty. + + Note: If you need to pass more than one value, separate them with + '\n'. Eg.: var1=val1\nvar2=val2 + +config LIBC_GLIBC_EXTRA_CFLAGS + string + prompt "extra target CFLAGS" + default "" + help + Extra target CFLAGS to use when building. + +config LIBC_EXTRA_CC_ARGS + string + prompt "gcc extra flags" + default "" + help + Extra flags to pass gcc when building. + + Seldom used, except for sparc64 which seems to need the flag -64 + to be passed onto gcc. + +config LIBC_ENABLE_FORTIFIED_BUILD + bool + prompt "Enable fortified build (EXPERIMENTAL)" + depends on EXPERIMENTAL + help + If you say 'y' here, then glibc will be using fortified versions + of functions with format arguments (eg. vsyslog, printf...), and + do a sanity check on the format at runtime, to avoid some of the + common format string attacks. + + This is currently not supported, and will most probably result in + a broken build, with an error message like: + ../misc/syslog.c: In function '__vsyslog_chk': + ../misc/syslog.c:123: sorry, unimplemented: inlining failed in + call to 'syslog': function body not available + + If you are brave enough and want to debug the issue, then say 'y' + here. Otherwise, be still and say 'n' (the default). ;-) + + +config LIBC_DISABLE_VERSIONING + bool + prompt "Disable symbols versioning" + help + Do not include versioning information in the library objects. + +config LIBC_OLDEST_ABI + string + prompt "Oldest supported ABI" + default "" + help + Set the oldest ABI supported by the C library. + + Setting this option, for example, to 2.2 will provide ABI support + back to (e)glibc-2.2. + + If this option is not set, (e)glibc will choose for you. + +config LIBC_GLIBC_FORCE_UNWIND + bool + prompt "Force unwind support (READ HELP!)" + default y + help + If your toolchain fails building while building the C library + start files, or the complete C library, with a message like: + configure: error: forced unwind support is required + + then you may try changing this option. Otherwise, leave it to + the default 'y'. + + The issue seems to be related to building NPTL on old versions + of glibc on some architectures + (seen on s390, s390x and x86_64). + +config LIBC_GLIBC_USE_PORTS + bool + prompt "Use the ports addon" + depends on !LIBC_GLIBC_2_20_or_later + help + The ports addon contains some architecture ports that are not available + in the official distribution. + + For example, this is the case for ARM with glibc-2.4 and above. + + Say n only if you're sure that your architecture is in the official + distribution for your chosen version. + +config LIBC_ADDONS_LIST + string + prompt "Extra addons" + default "" + help + Extra addons to include. Space separated list. + + You need to specify neither linuxthreads nor nptl, as they are added + automagically for you depending on the threading model you chose + earlier. + + Eg.: crypt (for very old libces) + +if LIBC_GLIBC_USE_PORTS || ( LIBC_ADDONS_LIST != "" ) +comment "WARNING !!! " +comment "| For glibc >= 2.8, it can happen that the tarballs " +comment "| for the addons are not available for download. " +comment "| If that happens, bad luck... Try a previous version " +comment "| or try again later... :-( " +endif + +config LIBC_LOCALES + bool + prompt "Build and install locales" + help + Whether to build and install the libc locale files for the target, + which is required in order to support internationalization. + +if LIBC_glibc && LIBC_LOCALES +comment "WARNING! " +comment "| The built locales will be usable if and only if the build " +comment "| machine and the target: " +comment "| - have the same endianness, " +comment "| - and have the same alignment requirements for uint32_t. " +comment "| You will have to check by yourself (for now). " +endif # LIBC_glibc && LIBC_LOCALES + +if KERNEL_linux + +choice LIBC_GLIBC_SUPPORTED_KERNEL + bool + prompt "Minimum supported kernel version" + default LIBC_GLIBC_KERNEL_VERSION_AS_HEADERS + +config LIBC_GLIBC_KERNEL_VERSION_NONE + bool + prompt "Let ./configure decide" + help + Let ./configure decide what minimum kernel version glibc will be + able to run against. + + This will include legacy compatibility code for older kernels in + the C library, thus ensuring that it will run on a large number + of old kernels. + + The minimum kernel version supported will be dependent upon the + target you build for. For example: + alpha*-*-linux-gnu Requires Linux 2.6.9 for NPTL + sh[34]-*-linux-gnu Requires Linux 2.6.11 + powerpc* Requires Linux 2.4.19 + arm*-*-linux-*gnueabi Requires Linux 2.6.16 + +config LIBC_GLIBC_KERNEL_VERSION_AS_HEADERS + bool + prompt "Same as kernel headers (default)" + help + Normally, you'll want glibc to run against the same kernel + version as the one used for the headers. + + This is the default. + + If enabled, crosstool-ng will use the chosen version of kernel + headers for the glibc minimum kernel version supported, which is + what gets passed to "--enable-kernel=" when configuring glibc. + + Enabling this will ensure that no legacy compatibility code for + older kernels is built into your C libraries, but it will + be unable to run on kernel versions older than whichever kernel + headers version you've built the toolchain for. + + If you know for sure that your toolchain will never need to build + applications that will run under a kernel version older than your + chosen kernel headers version (CT_KERNEL_VERSION), you can choose + "y" here. + +config LIBC_GLIBC_KERNEL_VERSION_CHOSEN + bool + prompt "Specific kernel version" + help + Specify the earliest Linux kernel version you want glibc to + include support for. This does not have to match the kernel + headers version used for your toolchain. This controls what is + passed to the "--enable-kernel=" option to the glibc configure + script. + + If you want to be able to statically link programs with your + toolchain's C library, make sure this kernel version is lower than + all kernels you wish to support to avoid "FATAL: kernel too old" + errors. The higher the version you specify, the less legacy code + will be built into libc. + + Most people can leave this at the default value of "2.6.9". + +if LIBC_GLIBC_KERNEL_VERSION_CHOSEN + +config LIBC_GLIBC_MIN_KERNEL_VERSION + string + prompt "Minimum kernel version to support" + default "2.6.9" + help + Enter here the lowest kernel version glibc will be able to run against. + + The minimum kernel version supported will be dependent upon the + target you build for. For example: + alpha*-*-linux-gnu Requires Linux 2.6.9 for NPTL + sh[34]-*-linux-gnu Requires Linux 2.6.11 + powerpc* Requires Linux 2.4.19 + arm*-*-linux-*gnueabi Requires Linux 2.6.16 + + Note that no sanity check is performed by crosstool-NG to ensure + that the value you enter here is appropriate for your target. + +endif # LIBC_GLIBC_KERNEL_VERSION_CHOSEN + +endchoice + +config LIBC_GLIBC_MIN_KERNEL + string + default "" if LIBC_GLIBC_KERNEL_VERSION_NONE + default KERNEL_VERSION if LIBC_GLIBC_KERNEL_VERSION_AS_HEADERS + default LIBC_GLIBC_MIN_KERNEL_VERSION if LIBC_GLIBC_KERNEL_VERSION_CHOSEN + +endif # KERNEL_linux diff --git a/config/toolchain.in b/config/toolchain.in index b242444..5048e91 100644 --- a/config/toolchain.in +++ b/config/toolchain.in @@ -77,7 +77,7 @@ config TOOLCHAIN_PKGVERSION help Specify a string that identifies your package. You may wish to include a build number or build date. This version string will be included in - the output of gcc --version, and also in binutils, eglibc, gdb and + the output of gcc --version, and also in binutils, glibc, gdb and gdbserver. If this string is left empty, the actual package version will be: diff --git a/docs/0 - Table of content.txt b/docs/0 - Table of content.txt index ebac851..13e298b 100644 --- a/docs/0 - Table of content.txt +++ b/docs/0 - Table of content.txt @@ -59,7 +59,7 @@ B- Known issues - gcc is not found, although I *do* have gcc installed - The extract and/or path steps fail under Cygwin - uClibc fails to build under Cygwin - - On 64-bit build systems, the glibc (possibly eglibc too) build + - On 64-bit build systems, the glibc build fails for 64-bit targets, because it can not find libgcc - libtool.m4: error: problem compiling FC test program - unable to detect the exception model diff --git a/docs/7 - Contributing to crosstool-NG.txt b/docs/7 - Contributing to crosstool-NG.txt index a1c0121..a103554 100644 --- a/docs/7 - Contributing to crosstool-NG.txt +++ b/docs/7 - Contributing to crosstool-NG.txt @@ -32,7 +32,7 @@ Here is the (mostly-complete) list of categories and components: arch | alpha, arm, mips, powerpc... cc | gcc binutils | binutils, elf2flt, sstrip - libc | eglibc, uClibc, glibc, newlib, mingw, none + libc | uClibc, glibc, newlib, mingw, none kernel | linux, mingw32, bare-metal debug | dmalloc, duma, gdb, ltrace, strace complibs | gmp, mpfr, ppl, cloog, mpc, libelf diff --git a/docs/8 - Internals.txt b/docs/8 - Internals.txt index d919a77..0eefd1b 100644 --- a/docs/8 - Internals.txt +++ b/docs/8 - Internals.txt @@ -247,8 +247,7 @@ The kernel's ".sh" file API: - CT_DoGet Eg.: CT_DoGet linux-2.6.26.5 ftp://ftp.kernel.org/pub/linux/kernel/v2.6 Note: retrieving sources from svn, cvs, git and the likes is not supported - by CT_DoGet. You'll have to do this by hand, as it is done for eglibc in - "scripts/build/libc/eglibc.sh" + by CT_DoGet. For now, you'll have to do this by hand. > defines the function "do_kernel_extract": + parameters: none diff --git a/docs/9 - How is a toolchain constructed.txt b/docs/9 - How is a toolchain constructed.txt index 353c0a2..a358b9e 100644 --- a/docs/9 - How is a toolchain constructed.txt +++ b/docs/9 - How is a toolchain constructed.txt @@ -51,8 +51,8 @@ thereof, running on the target, we also need the C library. The C library provides a standard abstraction layer that performs basic tasks (such as allocating memory, printing output on a terminal, managing file access...). There are many C libraries, each targeted to different systems. For the -Linux /desktop/, there is glibc or eglibc or even uClibc, for embedded Linux, -you have a choice of eglibc or uClibc, while for system without an Operating +Linux /desktop/, there is glibc or even uClibc, for embedded Linux, +you have a choice of uClibc, while for system without an Operating System, you may use newlib, dietlibc, or even none at all. There a few other C libraries, but they are not as widely used, and/or are targeted to very specific needs (eg. klibc is a very small subset of the C library aimed at diff --git a/docs/B - Known issues.txt b/docs/B - Known issues.txt index 271ce09..656ac34 100644 --- a/docs/B - Known issues.txt +++ b/docs/B - Known issues.txt @@ -111,7 +111,7 @@ Workaround: -------------------------------- Symptoms: - On 64-bit build systems, the glibc (possibly eglibc too) build fails for + On 64-bit build systems, the glibc build fails for 64-bit targets, because it can not find libgcc. Explanations: @@ -180,8 +180,7 @@ Symptoms: Explanations: The issue seems to be related to building NPTL on old versions - of glibc (and possibly eglibc as well) on some architectures - (seen on powerpc, s390, s390x and x86_64). + of glibc on some architectures (seen on powerpc, s390, s390x and x86_64). Status: CURRENT @@ -197,13 +196,13 @@ Symptoms: glibc start files and headers fail with: [/usr/include/limits.h] Error 1 Explanations: - Old glibc (and eglibc) Makefiles break with make-3.82. + Old glibc Makefiles break with make-3.82. Status: CURRENT Fix: - None so far. It would require some glibc/eglibc hacking. + None so far. It would require some glibc hacking. Workaround: There two possible workarounds: @@ -221,7 +220,7 @@ Symptoms: The build fails with "mixed implicit and normal rules. Stop." Explanations: - Old glibc (and eglibc) Makefiles break with make-3.82. + Old glibc Makefiles break with make-3.82. Status: CURRENT diff --git a/patches/eglibc/2_10/100-powerpc-8xx-CPU15-errata.patch b/patches/eglibc/2_10/100-powerpc-8xx-CPU15-errata.patch deleted file mode 100644 index 4fe1bb2..0000000 --- a/patches/eglibc/2_10/100-powerpc-8xx-CPU15-errata.patch +++ /dev/null @@ -1,49 +0,0 @@ -diff -ru eglibc-2_9_orig/sysdeps/powerpc/powerpc32/memset.S eglibc-2_9/sysdeps/powerpc/powerpc32/memset.S ---- eglibc-2_9_orig/sysdeps/powerpc/powerpc32/memset.S 2007-04-13 08:35:45.000000000 -0700 -+++ eglibc-2_9/sysdeps/powerpc/powerpc32/memset.S 2009-05-06 16:52:04.000000000 -0700 -@@ -112,11 +112,13 @@ - clrrwi. rALIGN, rLEN, 5 - mtcrf 0x01, rLEN /* 40th instruction from .align */ - -+#ifndef BROKEN_PPC_8xx_CPU15 - /* Check if we can use the special case for clearing memory using dcbz. - This requires that we know the correct cache line size for this - processor. Getting the __cache_line_size may require establishing GOT - addressability, so branch out of line to set this up. */ - beq cr1, L(checklinesize) -+#endif - - /* Store blocks of 32-bytes (256-bits) starting on a 32-byte boundary. - Can't assume that rCHR is zero or that the cache line size is either -@@ -158,6 +160,7 @@ - add rMEMP, rMEMP, rALIGN - b L(medium_tail2) /* 72nd instruction from .align */ - -+#ifndef BROKEN_PPC_8xx_CPU15 - .align 5 - nop - /* Clear cache lines of memory in 128-byte chunks. -@@ -191,6 +194,7 @@ - bdnz L(zloop) - beqlr cr5 - b L(medium_tail2) -+#endif /* ! BROKEN_PPC_8xx_CPU15 */ - - .align 5 - L(small): -@@ -248,6 +252,7 @@ - stw rCHR, -8(rMEMP) - blr - -+#ifndef BROKEN_PPC_8xx_CPU15 - L(checklinesize): - #ifdef SHARED - mflr rTMP -@@ -329,6 +334,7 @@ - L(handletail32): - clrrwi. rALIGN, rLEN, 5 - b L(nondcbz) -+#endif /* ! BROKEN_PPC_8xx_CPU15 */ - - END (BP_SYM (memset)) - libc_hidden_builtin_def (memset) diff --git a/patches/eglibc/2_15/100-Remove-test-for-__builtin_expect.patch b/patches/eglibc/2_15/100-Remove-test-for-__builtin_expect.patch deleted file mode 100644 index ed2d1ce..0000000 --- a/patches/eglibc/2_15/100-Remove-test-for-__builtin_expect.patch +++ /dev/null @@ -1,78 +0,0 @@ -diff --git a/configure b/configure -index e5e0184..85da2bc 100755 ---- a/configure -+++ b/configure -@@ -7567,40 +7567,6 @@ _ACEOF - fi - fi - --{ $as_echo "$as_me:$LINENO: checking for __builtin_expect" >&5 --$as_echo_n "checking for __builtin_expect... " >&6; } --if test "${libc_cv_gcc_builtin_expect+set}" = set; then -- $as_echo_n "(cached) " >&6 --else -- cat > conftest.c <&5 -- (eval $ac_try) 2>&5 -- ac_status=$? -- $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 -- (exit $ac_status); }; }; then -- libc_cv_gcc_builtin_expect=yes --else -- libc_cv_gcc_builtin_expect=no --fi --rm -f conftest* --fi --{ $as_echo "$as_me:$LINENO: result: $libc_cv_gcc_builtin_expect" >&5 --$as_echo "$libc_cv_gcc_builtin_expect" >&6; } --if test "$libc_cv_gcc_builtin_expect" = no; then -- { { $as_echo "$as_me:$LINENO: error: support for __builtin_expect needed" >&5 --$as_echo "$as_me: error: support for __builtin_expect needed" >&2;} -- { (exit 1); exit 1; }; } --fi -- - { $as_echo "$as_me:$LINENO: checking for __builtin_memset" >&5 - $as_echo_n "checking for __builtin_memset... " >&6; } - if test "${libc_cv_gcc_builtin_memset+set}" = set; then -diff --git a/configure.in b/configure.in -index 4655c8a..596443d 100644 ---- a/configure.in -+++ b/configure.in -@@ -2134,28 +2134,6 @@ if test "$libc_cv_c_asmcr0_bug" != 'no'; then - fi - fi - --dnl Check whether compiler understands __builtin_expect. --AC_CACHE_CHECK(for __builtin_expect, libc_cv_gcc_builtin_expect, --[cat > conftest.c <&AS_MESSAGE_LOG_FD]); then -- libc_cv_gcc_builtin_expect=yes --else -- libc_cv_gcc_builtin_expect=no --fi --rm -f conftest*]) --if test "$libc_cv_gcc_builtin_expect" = no; then -- AC_MSG_ERROR([support for __builtin_expect needed]) --fi -- - AC_CACHE_CHECK(for __builtin_memset, libc_cv_gcc_builtin_memset, [dnl - cat > conftest.c <<\EOF - void zero (void *x) diff --git a/patches/eglibc/2_16/001-Avoid-use-of-libgcc_s-and-libgcc_eh-when-building-gl.patch b/patches/eglibc/2_16/001-Avoid-use-of-libgcc_s-and-libgcc_eh-when-building-gl.patch deleted file mode 100644 index 5dd6941..0000000 --- a/patches/eglibc/2_16/001-Avoid-use-of-libgcc_s-and-libgcc_eh-when-building-gl.patch +++ /dev/null @@ -1,322 +0,0 @@ -Upstream-Status: Backport -Signed-off-by: Khem Raj - -From 95f5a9a866695da4e038aa4e6ccbbfd5d9cf63b7 Mon Sep 17 00:00:00 2001 -From: Joseph Myers -Date: Tue, 3 Jul 2012 19:14:59 +0000 -Subject: [PATCH] Avoid use of libgcc_s and libgcc_eh when building glibc. - ---- - ChangeLog | 47 ++++++++++++++++++++++++++++++ - Makeconfig | 68 ++++++++++++++++++++++++++++++++++++++------ - Rules | 45 ++++++++++++++++++++++------- - elf/Makefile | 6 +++- - elf/static-stubs.c | 46 ++++++++++++++++++++++++++++++ - ports/ChangeLog.arm | 7 +++++ - ports/sysdeps/arm/Makefile | 8 ++++++ - 7 files changed, 206 insertions(+), 21 deletions(-) - create mode 100644 elf/static-stubs.c - -Index: a/Makeconfig -=================================================================== ---- a/Makeconfig 2012-07-04 18:26:22.000000000 -0700 -+++ b/Makeconfig 2012-08-14 20:16:10.197093639 -0700 -@@ -415,9 +415,9 @@ - LDFLAGS-rtld += $(hashstyle-LDFLAGS) - endif - --# Command for linking programs with the C library. -+# Commands for linking programs with the C library. - ifndef +link --+link = $(CC) -nostdlib -nostartfiles -o $@ \ -++link-before-libc = $(CC) -nostdlib -nostartfiles -o $@ \ - $(sysdep-LDFLAGS) $(config-LDFLAGS) $(LDFLAGS) $(LDFLAGS-$(@F)) \ - $(combreloc-LDFLAGS) $(relro-LDFLAGS) $(hashstyle-LDFLAGS) \ - $(addprefix $(csu-objpfx),$(start-installed-name)) \ -@@ -426,7 +426,10 @@ - $(start-installed-name))\ - $(+preinit) $(link-extra-libs) \ - $(common-objpfx)libc% $(+postinit),$^) \ -- $(link-extra-libs) $(link-libc) $(+postctor) $(+postinit) -+ $(link-extra-libs) -++link-after-libc = $(+postctor) $(+postinit) -++link = $(+link-before-libc) $(link-libc) $(+link-after-libc) -++link-tests = $(+link-before-libc) $(link-libc-tests) $(+link-after-libc) - endif - # Command for linking PIE programs with the C library. - ifndef +link-pie -@@ -443,7 +446,7 @@ - endif - # Command for statically linking programs with the C library. - ifndef +link-static --+link-static = $(CC) -nostdlib -nostartfiles -static -o $@ \ -++link-static-before-libc = $(CC) -nostdlib -nostartfiles -static -o $@ \ - $(sysdep-LDFLAGS) $(LDFLAGS) $(LDFLAGS-$(@F)) \ - $(addprefix $(csu-objpfx),$(static-start-installed-name)) \ - $(+preinit) $(+prector) \ -@@ -451,7 +454,12 @@ - $(start-installed-name))\ - $(+preinit) $(link-extra-libs-static) \ - $(common-objpfx)libc% $(+postinit),$^) \ -- $(link-extra-libs-static) $(link-libc-static) $(+postctor) $(+postinit) -+ $(link-extra-libs-static) $(link-libc-static) -++link-static-after-libc = $(+postctor) $(+postinit) -++link-static = $(+link-static-before-libc) $(link-libc-static) \ -+ $(+link-static-after-libc) -++link-static-tests = $(+link-static-before-libc) $(link-libc-static-tests) \ -+ $(+link-static-after-libc) - endif - # Command for statically linking bounded-pointer programs with the C library. - ifndef +link-bounded -@@ -475,10 +483,12 @@ - # We need the versioned name of libc.so in the deps of $(others) et al - # so that the symlink to libc.so is created before anything tries to - # run the linked programs. --link-libc = -Wl,-rpath-link=$(rpath-link) \ -+link-libc-before-gnulib = -Wl,-rpath-link=$(rpath-link) \ - $(common-objpfx)libc.so$(libc.so-version) \ - $(common-objpfx)$(patsubst %,$(libtype.oS),c) \ -- $(as-needed) $(common-objpfx)elf/ld.so $(no-as-needed) $(gnulib) -+ $(as-needed) $(common-objpfx)elf/ld.so $(no-as-needed) -+link-libc = $(link-libc-before-gnulib) $(gnulib) -+link-libc-tests = $(link-libc-before-gnulib) $(gnulib-tests) - # This is how to find at build-time things that will be installed there. - rpath-dirs = math elf dlfcn nss nis rt resolv crypt - rpath-link = \ -@@ -488,6 +498,7 @@ - nssobjdir := $(patsubst ../$(subdir),.,$(common-objpfx)nss) - resolvobjdir := $(patsubst ../$(subdir),.,$(common-objpfx)resolv) - link-libc = $(common-objpfx)libc.a $(otherlibs) $(gnulib) $(common-objpfx)libc.a $(gnulib) -+link-libc-tests = $(common-objpfx)libc.a $(otherlibs) $(gnulib-tests) $(common-objpfx)libc.a $(gnulib-tests) - endif - endif - -@@ -513,8 +524,43 @@ - - # The static libraries. - link-libc-static = -Wl,--start-group $(common-objpfx)libc.a $(static-gnulib) -Wl,--end-group -+link-libc-static-tests = -Wl,--start-group $(common-objpfx)libc.a $(static-gnulib-tests) -Wl,--end-group - link-libc-bounded = $(common-objpfx)libc_b.a $(gnulib) $(common-objpfx)libc_b.a - -+# How to link against libgcc. Some libgcc functions, such as those -+# for "long long" arithmetic or software floating point, can always be -+# built without use of C library headers and do not have any global -+# state so can safely be linked statically into any executable or -+# shared library requiring them; these functions are in libgcc.a. -+# Other functions, relating to exception handling, may require C -+# library headers to build and it may not be safe to have more than -+# one copy of them in a process; these functions are only in -+# libgcc_s.so and libgcc_eh.a. -+# -+# To avoid circular dependencies when bootstrapping, it is desirable -+# to avoid use of libgcc_s and libgcc_eh in building glibc. Where any -+# glibc functionality (in particular, thread cancellation) requires -+# exception handling, this is implemented through dlopen of libgcc_s -+# to avoid unnecessary dependencies on libgcc_s by programs not using -+# that functionality; executables built with glibc do not use -+# exception handling other than through thread cancellation. -+# -+# Undefined references to functions from libgcc_eh or libgcc_s may -+# arise for code built with -fexceptions. In the case of statically -+# linked programs installed by glibc, unwinding will never actually -+# occur at runtime and the use of elf/static-stubs.c to resolve these -+# references is safe. In the case of statically linked test programs -+# and test programs built with -fexceptions, unwinding may occur in -+# some cases and it is preferable to link with libgcc_eh or libgcc_s -+# so that the testing is as similar as possible to how programs will -+# be built with the installed glibc. -+# -+# Some architectures have architecture-specific systems for exception -+# handling that may involve undefined references to -+# architecture-specific functions. On those architectures, -+# gnulib-arch and static-gnulib-arch may be defined in sysdeps -+# makefiles to use additional libraries for linking executables and -+# shared libraries built by glibc. - ifndef gnulib - ifneq ($(have-cc-with-libunwind),yes) - libunwind = -@@ -522,8 +568,12 @@ - libunwind = -lunwind - endif - libgcc_eh := -Wl,--as-needed -lgcc_s $(libunwind) -Wl,--no-as-needed --gnulib := -lgcc $(libgcc_eh) --static-gnulib := -lgcc -lgcc_eh $(libunwind) -+gnulib-arch = -+gnulib = -lgcc $(gnulib-arch) -+gnulib-tests := -lgcc $(libgcc_eh) -+static-gnulib-arch = -+static-gnulib = -lgcc $(static-gnulib-arch) -+static-gnulib-tests := -lgcc -lgcc_eh $(libunwind) - libc.so-gnulib := -lgcc - endif - +preinit = $(addprefix $(csu-objpfx),crti.o) -Index: a/Rules -=================================================================== ---- a/Rules 2012-07-04 18:25:47.000000000 -0700 -+++ b/Rules 2012-08-14 20:16:10.197093639 -0700 -@@ -1,5 +1,4 @@ --# Copyright (C) 1991-2000,2002,2003,2004,2005,2006,2011 --# Free Software Foundation, Inc. -+# Copyright (C) 1991-2012 Free Software Foundation, Inc. - # This file is part of the GNU C Library. - - # The GNU C Library is free software; you can redistribute it and/or -@@ -103,29 +102,46 @@ - # eglibc: endif - - ifeq ($(build-programs),yes) --binaries-all = $(others) $(sysdep-others) $(tests) $(xtests) $(test-srcs) --binaries-static = $(others-static) $(tests-static) $(xtests-static) -+binaries-all-notests = $(others) $(sysdep-others) -+binaries-all-tests = $(tests) $(xtests) $(test-srcs) -+binaries-all = $(binaries-all-notests) $(binaries-all-tests) -+binaries-static-notests = $(others-static) -+binaries-static-tests = $(tests-static) $(xtests-static) -+binaries-static = $(binaries-static-notests) $(binaries-static-tests) - ifeq (yesyes,$(have-fpie)$(build-shared)) - binaries-pie = $(others-pie) $(tests-pie) $(xtests-pie) - else - binaries-pie = - endif - else --binaries-all = $(tests) $(xtests) $(test-srcs) -+binaries-all-notests = -+binaries-all-tests = $(tests) $(xtests) $(test-srcs) -+binaries-all = $(binaries-all-tests) -+binaries-static-notests = -+binaries-static-tests = - binaries-static = - binaries-pie = - endif - --binaries-shared = $(filter-out $(binaries-pie) $(binaries-static), \ -- $(binaries-all)) -+binaries-shared-tests = $(filter-out $(binaries-pie) $(binaries-static), \ -+ $(binaries-all-tests)) -+binaries-shared-notests = $(filter-out $(binaries-pie) $(binaries-static), \ -+ $(binaries-all-notests)) - --ifneq "$(strip $(binaries-shared))" "" --$(addprefix $(objpfx),$(binaries-shared)): %: %.o \ -+ifneq "$(strip $(binaries-shared-notests))" "" -+$(addprefix $(objpfx),$(binaries-shared-notests)): %: %.o \ - $(sort $(filter $(common-objpfx)lib%,$(link-libc))) \ - $(addprefix $(csu-objpfx),start.o) $(+preinit) $(+postinit) - $(+link) - endif - -+ifneq "$(strip $(binaries-shared-tests))" "" -+$(addprefix $(objpfx),$(binaries-shared-tests)): %: %.o \ -+ $(sort $(filter $(common-objpfx)lib%,$(link-libc))) \ -+ $(addprefix $(csu-objpfx),start.o) $(+preinit) $(+postinit) -+ $(+link-tests) -+endif -+ - ifneq "$(strip $(binaries-pie))" "" - $(addprefix $(objpfx),$(binaries-pie)): %: %.o \ - $(sort $(filter $(common-objpfx)lib%,$(link-libc))) \ -@@ -133,13 +149,20 @@ - $(+link-pie) - endif - --ifneq "$(strip $(binaries-static))" "" --$(addprefix $(objpfx),$(binaries-static)): %: %.o \ -+ifneq "$(strip $(binaries-static-notests))" "" -+$(addprefix $(objpfx),$(binaries-static-notests)): %: %.o \ - $(sort $(filter $(common-objpfx)lib%,$(link-libc-static))) \ - $(addprefix $(csu-objpfx),start.o) $(+preinit) $(+postinit) - $(+link-static) - endif - -+ifneq "$(strip $(binaries-static-tests))" "" -+$(addprefix $(objpfx),$(binaries-static-tests)): %: %.o \ -+ $(sort $(filter $(common-objpfx)lib%,$(link-libc-static-tests))) \ -+ $(addprefix $(csu-objpfx),start.o) $(+preinit) $(+postinit) -+ $(+link-static-tests) -+endif -+ - ifeq ($(build-bounded),yes) - binaries-bounded = $(addsuffix -bp,$(tests) $(xtests) $(test-srcs)) - $(addprefix $(objpfx),$(binaries-bounded)): %-bp: %.ob \ -Index: a/elf/Makefile -=================================================================== ---- a/elf/Makefile 2012-07-04 18:26:34.000000000 -0700 -+++ b/elf/Makefile 2012-08-14 20:16:10.197093639 -0700 -@@ -71,6 +71,8 @@ - install-bin = sprof pldd - others-static = sln - install-rootsbin = sln -+sln-modules := static-stubs -+extra-objs += $(sln-modules:=.o) - - ifeq (yes,$(use-ldconfig)) - ifeq (yes,$(build-shared)) -@@ -78,7 +80,7 @@ - others += ldconfig - install-rootsbin += ldconfig - --ldconfig-modules := cache readlib xmalloc xstrdup chroot_canon -+ldconfig-modules := cache readlib xmalloc xstrdup chroot_canon static-stubs - extra-objs += $(ldconfig-modules:=.o) - endif - endif -@@ -417,6 +419,8 @@ - - $(objpfx)sprof: $(libdl) - -+$(objpfx)sln: $(sln-modules:%=$(objpfx)%.o) -+ - $(objpfx)ldconfig: $(ldconfig-modules:%=$(objpfx)%.o) - - $(objpfx)pldd: $(pldd-modules:%=$(objpfx)%.o) -Index: a/elf/static-stubs.c -=================================================================== ---- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ a/elf/static-stubs.c 2012-08-14 20:16:10.197093639 -0700 -@@ -0,0 +1,46 @@ -+/* Stub implementations of functions to link into statically linked -+ programs without needing libgcc_eh. -+ Copyright (C) 2012 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ -+ The GNU C Library is free software; you can redistribute it and/or -+ modify it under the terms of the GNU Lesser General Public -+ License as published by the Free Software Foundation; either -+ version 2.1 of the License, or (at your option) any later version. -+ -+ The GNU C Library is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ Lesser General Public License for more details. -+ -+ You should have received a copy of the GNU Lesser General Public -+ License along with the GNU C Library; if not, see -+ . */ -+ -+/* Avoid backtrace (and so _Unwind_Backtrace) dependencies from -+ sysdeps/unix/sysv/linux/libc_fatal.c. */ -+#include -+ -+#include -+#include -+ -+/* These programs do not use thread cancellation, so _Unwind_Resume -+ and the personality routine are never actually called. */ -+ -+void -+_Unwind_Resume (struct _Unwind_Exception *exc __attribute__ ((unused))) -+{ -+ abort (); -+} -+ -+_Unwind_Reason_Code -+__gcc_personality_v0 (int version __attribute__ ((unused)), -+ _Unwind_Action actions __attribute__ ((unused)), -+ _Unwind_Exception_Class exception_class -+ __attribute__ ((unused)), -+ struct _Unwind_Exception *ue_header -+ __attribute__ ((unused)), -+ struct _Unwind_Context *context __attribute__ ((unused))) -+{ -+ abort (); -+} diff --git a/patches/eglibc/2_8/100-powerpc-private_futex.patch b/patches/eglibc/2_8/100-powerpc-private_futex.patch deleted file mode 100644 index 3016529..0000000 --- a/patches/eglibc/2_8/100-powerpc-private_futex.patch +++ /dev/null @@ -1,15 +0,0 @@ -2008-04-28 Hiroki Kaminaga - - [BZ 6740] - nptl/sysdeps/powerpc/tcb-offsets.sym (PRIVATE_FUTEX_OFFSET): - Guard sym definition with #ifndef __ASSUME_PRIVATE_FUTEX. - ---- a/nptl/sysdeps/powerpc/tcb-offsets.sym -+++ b/nptl/sysdeps/powerpc/tcb-offsets.sym -@@ -15,4 +15,6 @@ - PID thread_offsetof (pid) - TID thread_offsetof (tid) - POINTER_GUARD (offsetof (tcbhead_t, pointer_guard) - TLS_TCB_OFFSET - sizeof (tcbhead_t)) -+#ifndef __ASSUME_PRIVATE_FUTEX - PRIVATE_FUTEX_OFFSET thread_offsetof (header.private_futex) -+#endif diff --git a/patches/eglibc/2_9/100-powerpc-8xx-CPU15-errata.patch b/patches/eglibc/2_9/100-powerpc-8xx-CPU15-errata.patch deleted file mode 100644 index 4fe1bb2..0000000 --- a/patches/eglibc/2_9/100-powerpc-8xx-CPU15-errata.patch +++ /dev/null @@ -1,49 +0,0 @@ -diff -ru eglibc-2_9_orig/sysdeps/powerpc/powerpc32/memset.S eglibc-2_9/sysdeps/powerpc/powerpc32/memset.S ---- eglibc-2_9_orig/sysdeps/powerpc/powerpc32/memset.S 2007-04-13 08:35:45.000000000 -0700 -+++ eglibc-2_9/sysdeps/powerpc/powerpc32/memset.S 2009-05-06 16:52:04.000000000 -0700 -@@ -112,11 +112,13 @@ - clrrwi. rALIGN, rLEN, 5 - mtcrf 0x01, rLEN /* 40th instruction from .align */ - -+#ifndef BROKEN_PPC_8xx_CPU15 - /* Check if we can use the special case for clearing memory using dcbz. - This requires that we know the correct cache line size for this - processor. Getting the __cache_line_size may require establishing GOT - addressability, so branch out of line to set this up. */ - beq cr1, L(checklinesize) -+#endif - - /* Store blocks of 32-bytes (256-bits) starting on a 32-byte boundary. - Can't assume that rCHR is zero or that the cache line size is either -@@ -158,6 +160,7 @@ - add rMEMP, rMEMP, rALIGN - b L(medium_tail2) /* 72nd instruction from .align */ - -+#ifndef BROKEN_PPC_8xx_CPU15 - .align 5 - nop - /* Clear cache lines of memory in 128-byte chunks. -@@ -191,6 +194,7 @@ - bdnz L(zloop) - beqlr cr5 - b L(medium_tail2) -+#endif /* ! BROKEN_PPC_8xx_CPU15 */ - - .align 5 - L(small): -@@ -248,6 +252,7 @@ - stw rCHR, -8(rMEMP) - blr - -+#ifndef BROKEN_PPC_8xx_CPU15 - L(checklinesize): - #ifdef SHARED - mflr rTMP -@@ -329,6 +334,7 @@ - L(handletail32): - clrrwi. rALIGN, rLEN, 5 - b L(nondcbz) -+#endif /* ! BROKEN_PPC_8xx_CPU15 */ - - END (BP_SYM (memset)) - libc_hidden_builtin_def (memset) diff --git a/patches/eglibc/ports-2_16/001-Avoid-use-of-libgcc_s-and-libgcc_eh-when-building-gl.patch b/patches/eglibc/ports-2_16/001-Avoid-use-of-libgcc_s-and-libgcc_eh-when-building-gl.patch deleted file mode 100644 index 0e58a76..0000000 --- a/patches/eglibc/ports-2_16/001-Avoid-use-of-libgcc_s-and-libgcc_eh-when-building-gl.patch +++ /dev/null @@ -1,40 +0,0 @@ -Upstream-Status: Backport -Signed-off-by: Khem Raj - -From 95f5a9a866695da4e038aa4e6ccbbfd5d9cf63b7 Mon Sep 17 00:00:00 2001 -From: Joseph Myers -Date: Tue, 3 Jul 2012 19:14:59 +0000 -Subject: [PATCH] Avoid use of libgcc_s and libgcc_eh when building glibc. - ---- - ChangeLog | 47 ++++++++++++++++++++++++++++++ - Makeconfig | 68 ++++++++++++++++++++++++++++++++++++++------ - Rules | 45 ++++++++++++++++++++++------- - elf/Makefile | 6 +++- - elf/static-stubs.c | 46 ++++++++++++++++++++++++++++++ - ports/ChangeLog.arm | 7 +++++ - ports/sysdeps/arm/Makefile | 8 ++++++ - 7 files changed, 206 insertions(+), 21 deletions(-) - create mode 100644 elf/static-stubs.c - --Index: a/ports/sysdeps/arm/Makefile -=================================================================== ---- a/ports/sysdeps/arm/Makefile 2012-07-04 18:25:41.000000000 -0700 -+++ b/ports/sysdeps/arm/Makefile 2012-08-14 20:16:10.201093638 -0700 -@@ -1,8 +1,16 @@ -+gnulib-arch = $(elfobjdir)/libgcc-stubs.a -+static-gnulib-arch = $(elfobjdir)/libgcc-stubs.a -+ - ifeq ($(subdir),elf) - sysdep-dl-routines += tlsdesc dl-tlsdesc - sysdep_routines += aeabi_unwind_cpp_pr1 find_exidx tlsdesc dl-tlsdesc - sysdep-rtld-routines += aeabi_unwind_cpp_pr1 tlsdesc dl-tlsdesc - shared-only-routines += aeabi_unwind_cpp_pr1 -+ -+$(objpfx)libgcc-stubs.a: $(objpfx)aeabi_unwind_cpp_pr1.os -+ $(build-extra-lib) -+ -+lib-noranlib: $(objpfx)libgcc-stubs.a - endif - - ifeq ($(subdir),csu) diff --git a/patches/eglibc/ports-2_16/002-Add-ARM-specific-static-stubs.c.patch b/patches/eglibc/ports-2_16/002-Add-ARM-specific-static-stubs.c.patch deleted file mode 100644 index 3a30621..0000000 --- a/patches/eglibc/ports-2_16/002-Add-ARM-specific-static-stubs.c.patch +++ /dev/null @@ -1,27 +0,0 @@ -Upstream-Status: Backport - -Signed-off-by: Khem Raj - -From c57a67e03368687fc0d2ae8354cd1b347a61ea44 Mon Sep 17 00:00:00 2001 -From: Joseph Myers -Date: Thu, 5 Jul 2012 22:16:03 +0000 -Subject: [PATCH] Add ARM-specific static-stubs.c. - ---- - ports/ChangeLog.arm | 4 ++++ - ports/sysdeps/arm/static-stubs.c | 7 +++++++ - 2 files changed, 11 insertions(+) - create mode 100644 ports/sysdeps/arm/static-stubs.c - -Index: a/ports/sysdeps/arm/static-stubs.c -=================================================================== ---- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ b/ports/sysdeps/arm/static-stubs.c 2012-08-15 15:04:59.687669241 -0700 -@@ -0,0 +1,7 @@ -+/* When building with GCC with static-only libgcc, the dummy -+ _Unwind_Resume from static-stubs.c needs to be used together with -+ the dummy __aeabi_unwind_cpp_pr* from aeabi_unwind_cpp_pr1.c -+ instead of the copies from libgcc. */ -+ -+#include -+#include diff --git a/patches/eglibc/ports-2_16/003-mips-rld-map-check.patch b/patches/eglibc/ports-2_16/003-mips-rld-map-check.patch deleted file mode 100644 index 19cb838..0000000 --- a/patches/eglibc/ports-2_16/003-mips-rld-map-check.patch +++ /dev/null @@ -1,26 +0,0 @@ - -On mips target, binutils currently sets DT_MIPS_RLD_MAP to 0 in dynamic -section if a --version-script sets _RLD_MAP to local. This is apparently -a binutils bug, but libc shouldn't segfault in this case. - -see also: http://sourceware.org/bugilla/show_bug.cgi?id=11615 - -Upstream-Status: Pending - -9/19/2010 - added by Qing He - - ---- -diff -ru glibc-2.10.1.orig/ports/sysdeps/mips/dl-machine.h glibc-2.10.1/sysdeps/mips/dl-machine.h ---- glibc-2.10.1.orig/ports/sysdeps/mips/dl-machine.h 2009-05-16 16:36:20.000000000 +0800 -+++ glibc-2.10.1/ports/sysdeps/mips/dl-machine.h 2010-09-19 09:11:53.000000000 +0800 -@@ -70,7 +70,8 @@ - /* If there is a DT_MIPS_RLD_MAP entry in the dynamic section, fill it in - with the run-time address of the r_debug structure */ - #define ELF_MACHINE_DEBUG_SETUP(l,r) \ --do { if ((l)->l_info[DT_MIPS (RLD_MAP)]) \ -+do { if ((l)->l_info[DT_MIPS (RLD_MAP)] && \ -+ (l)->l_info[DT_MIPS (RLD_MAP)]->d_un.d_ptr) \ - *(ElfW(Addr) *)((l)->l_info[DT_MIPS (RLD_MAP)]->d_un.d_ptr) = \ - (ElfW(Addr)) (r); \ - } while (0) diff --git a/samples/nios2-elf-mingw32/crosstool.config b/samples/nios2-elf-mingw32/crosstool.config index 107cf58..2eabf0d 100644 --- a/samples/nios2-elf-mingw32/crosstool.config +++ b/samples/nios2-elf-mingw32/crosstool.config @@ -263,7 +263,6 @@ CT_LIBC="newlib" CT_LIBC_VERSION="2.2.0" CT_LIBC_newlib=y # CT_LIBC_none is not set -CT_LIBC_eglibc_AVAILABLE=y CT_THREADS="none" CT_LIBC_glibc_AVAILABLE=y CT_LIBC_mingw_AVAILABLE=y diff --git a/samples/powerpc-e500v2-linux-gnuspe/reported.by b/samples/powerpc-e500v2-linux-gnuspe/reported.by index 9022019..1a507dc 100644 --- a/samples/powerpc-e500v2-linux-gnuspe/reported.by +++ b/samples/powerpc-e500v2-linux-gnuspe/reported.by @@ -1,7 +1,7 @@ reporter_name="Anthony Foiani " reporter_url="http://sourceware.org/ml/crossgcc/2010-09/msg00100.html" reporter_comment="This is a sample config file for Freescale e500v2 processors (e.g., MPC8548, -MPC8572). It uses eglibc (for e500/SPE patches) and a recent gcc (4.6.0, +MPC8572). It uses glibc (for e500/SPE support) and a recent gcc (4.6.0, for e500v2 DPFP support) and will generate appropriate dual-precision floating point instructions by default. diff --git a/scripts/addToolVersion.sh b/scripts/addToolVersion.sh index 34f42eb..ba73963 100755 --- a/scripts/addToolVersion.sh +++ b/scripts/addToolVersion.sh @@ -16,7 +16,7 @@ doHelp() { cat <<-EOF Usage: ${myname} <--tool> <[options] version [...]> ... 'tool' in one of: - gcc, binutils, glibc, eglibc, uClibc, newlib, linux, gdb, dmalloc, + gcc, binutils, glibc, uClibc, newlib, linux, gdb, dmalloc, duma, strace, ltrace, libelf, gmp, mpfr, ppl, cloog, mpc Valid options for all tools: @@ -131,14 +131,6 @@ addToolVersion() { SedExpr1="${SedExpr1}\n select BINUTILS_2_18_or_later" fi ;; - eglibc) - # Extract 'M'ajor and 'm'inor from version string - ver_M=$(getVersionField "${version}" _ 1) - ver_m=$(getVersionField "${version}" _ 2) - if [ \( ${ver_M} -eq 2 -a ${ver_m} -ge 16 \) ]; then - SedExpr1="${SedExpr1}\n select LIBC_EGLIBC_2_16_or_later" - fi - ;; uClibc) # uClibc-0.9.30 and above need some love ver_M=$(getVersionField "${version}" . 1) @@ -186,7 +178,6 @@ while [ $# -gt 0 ]; do --gcc) EXP=; OBS=; cat=CC; tool=gcc; tool_prefix=cc; dot2suffix=;; --binutils) EXP=; OBS=; cat=BINUTILS; tool=binutils; tool_prefix=binutils; dot2suffix=;; --glibc) EXP=; OBS=; cat=LIBC_GLIBC; tool=glibc; tool_prefix=libc; dot2suffix=;; - --eglibc) EXP=; OBS=; cat=LIBC_EGLIBC; tool=eglibc; tool_prefix=libc; dot2suffix=;; --uClibc) EXP=; OBS=; cat=LIBC_UCLIBC; tool=uClibc; tool_prefix=libc; dot2suffix=;; --newlib) EXP=; OBS=; cat=LIBC_NEWLIB; tool=newlib; tool_prefix=libc; dot2suffix=;; --linux) EXP=; OBS=; cat=KERNEL; tool=linux; tool_prefix=kernel; dot2suffix=;; diff --git a/scripts/build/libc/eglibc.sh b/scripts/build/libc/eglibc.sh deleted file mode 100644 index 704ef7c..0000000 --- a/scripts/build/libc/eglibc.sh +++ /dev/null @@ -1,189 +0,0 @@ -# eglibc build functions (initially by Thomas JOURDAN). - -# Add the definitions common to glibc and eglibc -# do_libc_extract -# do_libc_start_files -# do_libc -# do_libc_add_ons_list -# do_libc_min_kernel_config -. "${CT_LIB_DIR}/scripts/build/libc/glibc-eglibc.sh-common" - -# Download glibc -# eglibc is only available through subversion, there are no -# snapshots available. -do_libc_get() { - local addon - local -a extra_addons - local svn_base - - if echo ${CT_LIBC_VERSION} |grep -q linaro; then - # Linaro eglibc releases come from regular downloads... - YYMM=`echo ${CT_LIBC_VERSION} |cut -d- -f3 |${sed} -e 's,^..,,'` - CT_GetFile "eglibc-${CT_LIBC_VERSION}" \ - https://releases.linaro.org/${YYMM}/components/toolchain/eglibc-linaro \ - http://cbuild.validation.linaro.org/snapshots - return - fi - - if [ "${CT_EGLIBC_HTTP}" = "y" ]; then - svn_base="http://www.eglibc.org/svn" - else - svn_base="svn://svn.eglibc.org" - fi - - case "${CT_LIBC_VERSION}" in - trunk) svn_base+="/trunk";; - *) svn_base+="/branches/eglibc-${CT_LIBC_VERSION}";; - esac - - if [ "${CT_LIBC_CUSTOM}" = "y" ]; then - CT_GetCustom "eglibc" "${CT_LIBC_VERSION}" "${CT_LIBC_EGLIBC_CUSTOM_LOCATION}" - CT_LIBC_CUSTOM_LOCATION="${CT_SRC_DIR}/eglibc-${CT_LIBC_VERSION}" - else - CT_GetSVN "eglibc-${CT_LIBC_VERSION}" \ - "${svn_base}/libc" \ - "${CT_EGLIBC_REVISION:-HEAD}" - fi - - if [ "${CT_LIBC_LOCALES}" = "y" ]; then - extra_addons+=("localedef") - fi - - for addon in $(do_libc_add_ons_list " ") "${extra_addons[@]}"; do - # Never ever try to download these add-ons, - # they've always been internal - case "${addon}" in - nptl) continue;; - esac - - case "${addon}:${CT_LIBC_GLIBC_PORTS_EXTERNAL}" in - ports:y) ;; - ports:*) continue;; - esac - - if ! CT_GetSVN "eglibc-${addon}-${CT_LIBC_VERSION}" \ - "${svn_base}/${addon}" \ - "${CT_EGLIBC_REVISION:-HEAD}" - then - # Some add-ons are bundled with the main sources - # so failure to download them is expected - CT_DoLog DEBUG "Addon '${addon}' could not be downloaded." - CT_DoLog DEBUG "We'll see later if we can find it in the source tree" - fi - done -} - -# Copy user provided eglibc configuration file if provided -do_libc_check_config() { - if [ "${CT_EGLIBC_CUSTOM_CONFIG}" != "y" ]; then - return 0 - fi - - CT_DoStep INFO "Checking C library configuration" - - CT_TestOrAbort "You did not provide an eglibc config file!" \ - -n "${CT_EGLIBC_OPTION_GROUPS_FILE}" -a \ - -f "${CT_EGLIBC_OPTION_GROUPS_FILE}" - - CT_DoExecLog ALL cp "${CT_EGLIBC_OPTION_GROUPS_FILE}" "${CT_CONFIG_DIR}/eglibc.config" - - # NSS configuration - if grep -E '^OPTION_EGLIBC_NSSWITCH[[:space:]]*=[[:space:]]*n' "${CT_EGLIBC_OPTION_GROUPS_FILE}" >/dev/null 2>&1; then - CT_DoLog DEBUG "Using fixed-configuration nsswitch facility" - - if [ "${CT_EGLIBC_BUNDLED_NSS_CONFIG}" = "y" ]; then - nss_config="${CT_SRC_DIR}/eglibc-${CT_LIBC_VERSION}/nss/fixed-nsswitch.conf" - else - nss_config="${CT_EGLIBC_NSS_CONFIG_FILE}" - fi - CT_TestOrAbort "NSS config file not found!" -n "${nss_config}" -a -f "${nss_config}" - - CT_DoExecLog ALL cp "${nss_config}" "${CT_CONFIG_DIR}/nsswitch.config" - echo "OPTION_EGLIBC_NSSWITCH_FIXED_CONFIG = ${CT_CONFIG_DIR}/nsswitch.config" \ - >> "${CT_CONFIG_DIR}/eglibc.config" - - if [ "${CT_EGLIBC_BUNDLED_NSS_FUNCTIONS}" = "y" ]; then - nss_functions="${CT_SRC_DIR}/eglibc-${CT_LIBC_VERSION}/nss/fixed-nsswitch.functions" - else - nss_functions="${CT_EGLIBC_NSS_FUNCTIONS_FILE}" - fi - CT_TestOrAbort "NSS functions file not found!" -n "${nss_functions}" -a -f "${nss_functions}" - - CT_DoExecLog ALL cp "${nss_functions}" "${CT_CONFIG_DIR}/nsswitch.functions" - echo "OPTION_EGLIBC_NSSWITCH_FIXED_FUNCTIONS = ${CT_CONFIG_DIR}/nsswitch.functions" \ - >> "${CT_CONFIG_DIR}/eglibc.config" - else - CT_DoLog DEBUG "Using full-blown nsswitch facility" - fi - - CT_EndStep -} - -# Extract the files required for the libc locales -do_libc_locales_extract() { - CT_Extract "eglibc-localedef-${CT_LIBC_VERSION}" - CT_Patch "eglibc" "localedef-${CT_LIBC_VERSION}" -} - -# Build and install the libc locales -do_libc_locales() { - local libc_src_dir="${CT_SRC_DIR}/eglibc-${CT_LIBC_VERSION}" - local src_dir="${CT_SRC_DIR}/eglibc-localedef-${CT_LIBC_VERSION}" - local -a extra_config - local -a localedef_opts - - mkdir -p "${CT_BUILD_DIR}/build-localedef" - cd "${CT_BUILD_DIR}/build-localedef" - - CT_DoLog EXTRA "Configuring C library localedef" - - if [ "${CT_LIBC_EGLIBC_HAS_PKGVERSION_BUGURL}" = "y" ]; then - extra_config+=("--with-pkgversion=${CT_PKGVERSION}") - [ -n "${CT_TOOLCHAIN_BUGURL}" ] && extra_config+=("--with-bugurl=${CT_TOOLCHAIN_BUGURL}") - fi - - CT_DoLog DEBUG "Extra config args passed: '${extra_config[*]}'" - - # ./configure is misled by our tools override wrapper for bash - # so just tell it where the real bash is _on_the_target_! - # Notes: - # - ${ac_cv_path_BASH_SHELL} is only used to set BASH_SHELL - # - ${BASH_SHELL} is only used to set BASH - # - ${BASH} is only used to set the shebang - # in two scripts to run on the target - # So we can safely bypass bash detection at compile time. - # Should this change in a future eglibc release, we'd better - # directly mangle the generated scripts _after_ they get built, - # or even after they get installed... - echo "ac_cv_path_BASH_SHELL=/bin/bash" >>config.cache - - # Configure with --prefix the way we want it on the target... - - CT_DoExecLog CFG \ - CPPFLAGS="-DNOT_IN_libc" \ - "${src_dir}/configure" \ - --prefix=/usr \ - --cache-file="$(pwd)/config.cache" \ - --with-glibc="${libc_src_dir}" \ - "${extra_config[@]}" - - CT_DoLog EXTRA "Building C library localedef" - CT_DoExecLog ALL make ${JOBSFLAGS} - - # Set the localedef endianness option - case "${CT_ARCH_ENDIAN}" in - big) localedef_opts+=(--big-endian);; - little) localedef_opts+=(--little-endian);; - esac - - # Set the localedef option for the target's uint32_t alignment in bytes. - # This is target-specific, but for now, 32-bit alignment should work for all - # supported targets, even 64-bit ones. - localedef_opts+=(--uint32-align=4) - - CT_DoLog EXTRA "Installing C library locales" - CT_DoExecLog ALL make ${JOBSFLAGS} \ - "LOCALEDEF_OPTS=${localedef_opts[*]}" \ - install_root="${CT_SYSROOT_DIR}" \ - install-locales -} diff --git a/scripts/build/libc/glibc-eglibc.sh-common b/scripts/build/libc/glibc-eglibc.sh-common deleted file mode 100644 index 28a36bd..0000000 --- a/scripts/build/libc/glibc-eglibc.sh-common +++ /dev/null @@ -1,540 +0,0 @@ -# This file contains the functions common to glibc and eglibc - -# Extract the C library tarball(s) -do_libc_extract() { - local addon - - # Attempt CT_EXTRACT only if NOT custom, or CUSTOM_LOCATION is not a directory - if [ "${CT_LIBC_CUSTOM}" != "y" \ - -o ! -d "${CT_LIBC_CUSTOM_LOCATION}" ]; then - CT_Extract "${CT_LIBC}-${CT_LIBC_VERSION}" - fi - CT_Pushd "${CT_SRC_DIR}/${CT_LIBC}-${CT_LIBC_VERSION}" - # Attempt CT_PATCH only if NOT custom - if [ "${CT_LIBC_CUSTOM}" != "y" ]; then - CT_Patch nochdir "${CT_LIBC}" "${CT_LIBC_VERSION}" - fi - - # Extract the add-opns - for addon in $(do_libc_add_ons_list " "); do - # If the addon was bundled with the main archive, we do not - # need to extract it. Worse, if we were to try to extract - # it, we'd get an error. - if [ -d "${addon}" ]; then - CT_DoLog DEBUG "Add-on '${addon}' already present, skipping extraction" - continue - fi - - CT_Extract nochdir "${CT_LIBC}-${addon}-${CT_LIBC_VERSION}" - - CT_TestAndAbort "Error in add-on '${addon}': both short and long names in tarball" \ - -d "${addon}" -a -d "${CT_LIBC}-${addon}-${CT_LIBC_VERSION}" - - # Some addons have the 'long' name, while others have the - # 'short' name, but patches are non-uniformly built with - # either the 'long' or 'short' name, whatever the addons name - # but we prefer the 'short' name and avoid duplicates. - if [ -d "${CT_LIBC}-${addon}-${CT_LIBC_VERSION}" ]; then - CT_DoExecLog FILE mv "${CT_LIBC}-${addon}-${CT_LIBC_VERSION}" "${addon}" - fi - - CT_DoExecLog FILE ln -s "${addon}" "${CT_LIBC}-${addon}-${CT_LIBC_VERSION}" - - CT_Patch nochdir "${CT_LIBC}" "${addon}-${CT_LIBC_VERSION}" - - # Remove the long name since it can confuse configure scripts to run - # the same source twice. - rm "${CT_LIBC}-${addon}-${CT_LIBC_VERSION}" - done - - # The configure files may be older than the configure.in files - # if using a snapshot (or even some tarballs). Fake them being - # up to date. - find . -type f -name configure -exec touch {} \; 2>&1 |CT_DoLog ALL - - CT_Popd - - if [ "${CT_LIBC_LOCALES}" = "y" ]; then - do_libc_locales_extract - fi -} - -# Build and install headers and start files -do_libc_start_files() { - # Start files and Headers should be configured the same way as the - # final libc, but built and installed differently. - do_libc_backend libc_mode=startfiles -} - -# This function builds and install the full C library -do_libc() { - do_libc_backend libc_mode=final -} - -# This backend builds the C library once for each multilib -# variant the compiler gives us -# Usage: do_libc_backend param=value [...] -# Parameter : Definition : Type : Default -# libc_mode : 'startfiles' or 'final' : string : (none) -do_libc_backend() { - local libc_mode - local -a multilibs - local multilib - local multi_dir - local multi_flags - local extra_dir - local libc_headers libc_startfiles libc_full - local hdr - local arg - - for arg in "$@"; do - eval "${arg// /\\ }" - done - - case "${libc_mode}" in - startfiles) - CT_DoStep INFO "Installing C library headers & start files" - hdr=y - libc_startfiles=y - libc_full= - ;; - final) - CT_DoStep INFO "Installing C library" - hdr= - libc_startfiles= - libc_full=y - ;; - *) CT_Abort "Unsupported (or unset) libc_mode='${libc_mode}'";; - esac - - # If gcc is not configured for multilib, it still prints - # a single line for the default settings - multilibs=( $("${CT_TARGET}-gcc" -print-multi-lib 2>/dev/null) ) - for multilib in "${multilibs[@]}"; do - multi_dir="${multilib%%;*}" - if [ "${multi_dir}" != "." ]; then - CT_DoStep INFO "Building for multilib subdir='${multi_dir}'" - - extra_flags="$( echo "${multilib#*;}" \ - |${sed} -r -e 's/@/ -/g;' \ - )" - extra_dir="/${multi_dir}" - - # glibc install its files in ${extra_dir}/{usr/,}lib - # while gcc expects them in {,usr/}lib/${extra_dir}. - # Prepare some symlinks so glibc installs in fact in - # the proper place - # We do it in the start-files step, so it is not needed - # to do it in the final step, as the symlinks will - # already exist - if [ "${libc_mode}" = "startfiles" ]; then - CT_Pushd "${CT_SYSROOT_DIR}" - CT_DoExecLog ALL mkdir -p "lib/${multi_dir}" \ - "usr/lib/${multi_dir}" \ - "${multi_dir}" \ - "${multi_dir}/usr" - CT_DoExecLog ALL ln -sf "../lib/${multi_dir}" "${multi_dir}/lib" - CT_DoExecLog ALL ln -sf "../../usr/lib/${multi_dir}" "${multi_dir}/usr/lib" - CT_Popd - fi - libc_headers= - else - extra_dir= - extra_flags= - libc_headers="${hdr}" - fi - - CT_mkdir_pushd "${CT_BUILD_DIR}/build-libc-${libc_mode}${extra_dir//\//_}" - - do_libc_backend_once extra_dir="${extra_dir}" \ - extra_flags="${extra_flags}" \ - libc_headers="${libc_headers}" \ - libc_startfiles="${libc_startfiles}" \ - libc_full="${libc_full}" - - CT_Popd - - if [ "${multi_dir}" != "." ]; then - if [ "${libc_mode}" = "final" ]; then - CT_DoLog EXTRA "Fixing up multilib location" - - # rewrite the library multiplexers - for d in "lib/${multi_dir}" "usr/lib/${multi_dir}"; do - for l in libc libpthread libgcc_s; do - if [ -f "${CT_SYSROOT_DIR}/${d}/${l}.so" \ - -a ! -L ${CT_SYSROOT_DIR}/${d}/${l}.so ] - then - CT_DoExecLog DEBUG ${sed} -r -i \ - -e "s:/lib/:/lib/${multi_dir}/:g;" \ - "${CT_SYSROOT_DIR}/${d}/${l}.so" - fi - done - done - # Remove the multi_dir now it is no longer useful - CT_DoExecLog DEBUG rm -rf "${CT_SYSROOT_DIR}/${multi_dir}" - fi # libc_mode == final - - CT_EndStep - fi - done - - CT_EndStep -} - -# This backend builds the C library once -# Usage: do_libc_backend_once param=value [...] -# Parameter : Definition : Type : Default -# libc_headers : Build libc headers : bool : n -# libc_startfiles : Build libc start-files : bool : n -# libc_full : Build full libc : bool : n -# extra_flags : Extra CFLAGS to use (for multilib) : string : (empty) -# extra_dir : Extra subdir for multilib : string : (empty) -do_libc_backend_once() { - local libc_headers - local libc_startfiles - local libc_full - local extra_flags - local extra_dir - local src_dir="${CT_SRC_DIR}/${CT_LIBC}-${CT_LIBC_VERSION}" - local extra_cc_args - local -a extra_config - local -a extra_make_args - local glibc_cflags - local float_extra - local endian_extra - local arg - - for arg in "$@"; do - eval "${arg// /\\ }" - done - - CT_DoLog EXTRA "Configuring C library" - - case "${CT_LIBC}" in - eglibc) - if [ "${CT_EGLIBC_CUSTOM_CONFIG}" = "y" ]; then - CT_DoExecLog ALL cp "${CT_CONFIG_DIR}/eglibc.config" option-groups.config - fi - if [ "${CT_EGLIBC_OPT_SIZE}" = "y" ]; then - OPTIMIZE=-Os - else - OPTIMIZE=-O2 - fi - ;; - glibc) - # glibc can't be built without -O2 (reference needed!) - OPTIMIZE=-O2 - # Also, if those two are missing, iconv build breaks - extra_config+=( --disable-debug --disable-sanity-checks ) - ;; - esac - - # always include rpc, the user can still override it with TI-RPC - extra_config+=( --enable-obsolete-rpc ) - - # Add some default glibc config options if not given by user. - # We don't need to be conditional on wether the user did set different - # values, as they CT_LIBC_GLIBC_EXTRA_CONFIG_ARRAY is passed after - # extra_config - - extra_config+=("$(do_libc_min_kernel_config)") - - case "${CT_THREADS}" in - nptl) extra_config+=("--with-__thread" "--with-tls");; - linuxthreads) extra_config+=("--with-__thread" "--without-tls" "--without-nptl");; - none) extra_config+=("--without-__thread" "--without-nptl") - case "${CT_LIBC_GLIBC_EXTRA_CONFIG_ARRAY[*]}" in - *-tls*) ;; - *) extra_config+=("--without-tls");; - esac - ;; - esac - - case "${CT_SHARED_LIBS}" in - y) extra_config+=("--enable-shared");; - *) extra_config+=("--disable-shared");; - esac - - float_extra="$( echo "${extra_flags}" \ - |${sed} -r -e '/^(.*[[:space:]])?-m(hard|soft)-float([[:space:]].*)?$/!d;' \ - -e 's//\2/;' \ - )" - case "${float_extra}" in - hard) extra_config+=("--with-fp");; - soft) extra_config+=("--without-fp");; - "") - case "${CT_ARCH_FLOAT}" in - hard|softfp) extra_config+=("--with-fp");; - soft) extra_config+=("--without-fp");; - esac - ;; - esac - - if [ "${CT_LIBC_DISABLE_VERSIONING}" = "y" ]; then - extra_config+=("--disable-versioning") - fi - - if [ "${CT_LIBC_OLDEST_ABI}" != "" ]; then - extra_config+=("--enable-oldest-abi=${CT_LIBC_OLDEST_ABI}") - fi - - case "$(do_libc_add_ons_list ,)" in - "") extra_config+=("--enable-add-ons=no");; - *) extra_config+=("--enable-add-ons=$(do_libc_add_ons_list ,)");; - esac - - extra_config+=("--with-pkgversion=${CT_PKGVERSION}") - [ -n "${CT_TOOLCHAIN_BUGURL}" ] && extra_config+=("--with-bugurl=${CT_TOOLCHAIN_BUGURL}") - - # Extract the endianness options if any - # This should cover all possible endianness options - # in gcc, but it is prone to bit-rot... :-( - endian_extra="$( echo "${extra_flags}" \ - |${sed} -r -e '/^(.*[[:space:]])?-(E[BL]|m((big|little)(-endian)?|e?[bl]))([[:space:]].*)?$/!d;' \ - -e 's//\2/;' \ - )" - case "${endian_extra}" in - EB|mbig-endian|mbig|meb|mb) - extra_cc_args="${extra_cc_args} ${endian_extra}" - ;; - EL|mlittle-endian|mlittle|mel|ml) - extra_cc_args="${extra_cc_args} ${endian_extra}" - ;; - "") extra_cc_args="${extra_cc_args} ${CT_ARCH_ENDIAN_OPT}" - ;; - esac - - touch config.cache - if [ "${CT_LIBC_GLIBC_FORCE_UNWIND}" = "y" ]; then - echo "libc_cv_forced_unwind=yes" >>config.cache - echo "libc_cv_c_cleanup=yes" >>config.cache - fi - - # Pre-seed the configparms file with values from the config option - printf "%s\n" "${CT_LIBC_GLIBC_CONFIGPARMS}" > configparms - - cross_cc=$(CT_Which "${CT_TARGET}-gcc") - extra_cc_args+=" ${extra_flags}" - - case "${CT_LIBC_ENABLE_FORTIFIED_BUILD}" in - y) ;; - *) glibc_cflags+=" -U_FORTIFY_SOURCE";; - esac - glibc_cflags+=" ${CT_TARGET_CFLAGS} ${OPTIMIZE} ${CT_LIBC_GLIBC_EXTRA_CFLAGS}" - - # ./configure is mislead by our tools override wrapper for bash - # so just tell it where the real bash is _on_the_target_! - # Notes: - # - ${ac_cv_path_BASH_SHELL} is only used to set BASH_SHELL - # - ${BASH_SHELL} is only used to set BASH - # - ${BASH} is only used to set the shebang - # in two scripts to run on the target - # So we can safely bypass bash detection at compile time. - # Should this change in a future eglibc release, we'd better - # directly mangle the generated scripts _after_ they get built, - # or even after they get installed... - echo "ac_cv_path_BASH_SHELL=/bin/bash" >>config.cache - - # Configure with --prefix the way we want it on the target... - # There are a whole lot of settings here. You'll probably want - # to read up on what they all mean, and customize a bit, possibly by setting GLIBC_EXTRA_CONFIG_ARRAY - # Compare these options with the ones used when installing the glibc headers above - they're different. - # Adding "--without-gd" option to avoid error "memusagestat.c:36:16: gd.h: No such file or directory" - # See also http://sources.redhat.com/ml/libc-alpha/2000-07/msg00024.html. - # Set BUILD_CC, or we won't be able to build datafiles - # Run explicitly through CONFIG_SHELL, or the build breaks badly (loop-of-death) - # when the shell is not bash... Sigh... :-( - - CT_DoLog DEBUG "Using gcc for target : '${cross_cc}'" - CT_DoLog DEBUG "Configuring with addons : '$(do_libc_add_ons_list ,)'" - CT_DoLog DEBUG "Extra config args passed: '${extra_config[*]}'" - CT_DoLog DEBUG "Extra CC args passed : '${glibc_cflags}'" - CT_DoLog DEBUG "Extra flags (multilib) : '${extra_flags}'" - - CT_DoExecLog CFG \ - BUILD_CC="${CT_BUILD}-gcc" \ - CFLAGS="${glibc_cflags}" \ - CC="${CT_TARGET}-gcc ${CT_LIBC_EXTRA_CC_ARGS} ${extra_cc_args}" \ - AR=${CT_TARGET}-ar \ - RANLIB=${CT_TARGET}-ranlib \ - "${CONFIG_SHELL}" \ - "${src_dir}/configure" \ - --prefix=/usr \ - --build=${CT_BUILD} \ - --host=${CT_TARGET} \ - --cache-file="$(pwd)/config.cache" \ - --without-cvs \ - --disable-profile \ - --without-gd \ - --with-headers="${CT_HEADERS_DIR}" \ - "${extra_config[@]}" \ - "${CT_LIBC_GLIBC_EXTRA_CONFIG_ARRAY[@]}" - - # build hacks - case "${CT_ARCH},${CT_ARCH_CPU}" in - powerpc,8??) - # http://sourceware.org/ml/crossgcc/2008-10/msg00068.html - CT_DoLog DEBUG "Activating support for memset on broken ppc-8xx (CPU15 erratum)" - extra_make_args+=( ASFLAGS="-DBROKEN_PPC_8xx_CPU15" ) - ;; - esac - - if [ "${libc_headers}" = "y" ]; then - CT_DoLog EXTRA "Installing C library headers" - - # use the 'install-headers' makefile target to install the - # headers - CT_DoExecLog ALL make ${JOBSFLAGS} \ - install_root=${CT_SYSROOT_DIR}${extra_dir} \ - install-bootstrap-headers=yes \ - "${extra_make_args[@]}" \ - install-headers - - # For glibc, a few headers need to be manually installed - if [ "${CT_LIBC}" = "glibc" ]; then - # Two headers -- stubs.h and features.h -- aren't installed by install-headers, - # so do them by hand. We can tolerate an empty stubs.h for the moment. - # See e.g. http://gcc.gnu.org/ml/gcc/2002-01/msg00900.html - mkdir -p "${CT_HEADERS_DIR}/gnu" - CT_DoExecLog ALL touch "${CT_HEADERS_DIR}/gnu/stubs.h" - CT_DoExecLog ALL cp -v "${CT_SRC_DIR}/glibc-${CT_LIBC_VERSION}/include/features.h" \ - "${CT_HEADERS_DIR}/features.h" - - # Building the bootstrap gcc requires either setting inhibit_libc, or - # having a copy of stdio_lim.h... see - # http://sources.redhat.com/ml/libc-alpha/2003-11/msg00045.html - CT_DoExecLog ALL cp -v bits/stdio_lim.h "${CT_HEADERS_DIR}/bits/stdio_lim.h" - - # Following error building gcc-4.0.0's gcj: - # error: bits/syscall.h: No such file or directory - # solved by following copy; see http://sourceware.org/ml/crossgcc/2005-05/msg00168.html - # but it breaks arm, see http://sourceware.org/ml/crossgcc/2006-01/msg00091.html - # Of course, only copy it if it does not already exist - case "${CT_ARCH}" in - arm) ;; - *) if [ -f "${CT_HEADERS_DIR}/bits/syscall.h" ]; then - CT_DoLog ALL "Not over-writing existing bits/syscall.h" - elif [ -f "misc/bits/syscall.h" ]; then - CT_DoExecLog ALL cp -v "misc/bits/syscall.h" \ - "${CT_HEADERS_DIR}/bits/syscall.h" - else - # "Old" glibces do not have the above file, - # but provide this one: - CT_DoExecLog ALL cp -v "misc/syscall-list.h" \ - "${CT_HEADERS_DIR}/bits/syscall.h" - fi - ;; - esac - fi - fi # libc_headers == y - - if [ "${libc_startfiles}" = "y" ]; then - if [ "${CT_THREADS}" = "nptl" ]; then - CT_DoLog EXTRA "Installing C library start files" - - # there are a few object files needed to link shared libraries, - # which we build and install by hand - CT_DoExecLog ALL mkdir -p "${CT_SYSROOT_DIR}${extra_dir}/usr/lib" - CT_DoExecLog ALL make ${JOBSFLAGS} \ - "${extra_make_args[@]}" \ - csu/subdir_lib - CT_DoExecLog ALL cp csu/crt1.o csu/crti.o csu/crtn.o \ - "${CT_SYSROOT_DIR}${extra_dir}/usr/lib" - - # Finally, 'libgcc_s.so' requires a 'libc.so' to link against. - # However, since we will never actually execute its code, - # it doesn't matter what it contains. So, treating '/dev/null' - # as a C source file, we produce a dummy 'libc.so' in one step - CT_DoExecLog ALL "${cross_cc}" -nostdlib \ - -nostartfiles \ - -shared \ - -x c /dev/null \ - -o "${CT_SYSROOT_DIR}${extra_dir}/usr/lib/libc.so" - fi # threads == nptl - fi # libc_headers == y - - if [ "${libc_full}" = "y" ]; then - CT_DoLog EXTRA "Building C library" - CT_DoExecLog ALL make ${JOBSFLAGS} \ - "${extra_make_args[@]}" \ - all - - CT_DoLog EXTRA "Installing C library" - CT_DoExecLog ALL make ${JOBSFLAGS} \ - "${extra_make_args[@]}" \ - install_root="${CT_SYSROOT_DIR}${extra_dir}" \ - install - - if [ "${CT_BUILD_MANUALS}" = "y" ]; then - CT_DoLog EXTRA "Building and installing the C library manual" - # Omit JOBSFLAGS as GLIBC has problems building the - # manuals in parallel - CT_DoExecLog ALL make pdf html - # EGLIBC doesn't have a install-{pdf.html}, and older - # versions leave the manuals in the source directory - CT_DoExecLog ALL mkdir -p ${CT_PREFIX_DIR}/share/doc - if [ "${CT_LIBC_EGLIBC_2_16_or_later}" = "y" ]; then - CT_DoExecLog ALL cp -av manual/*.pdf manual/libc \ - ${CT_PREFIX_DIR}/share/doc - else - CT_DoExecLog ALL cp -av ${src_dir}/manual/*.pdf ${src_dir}/manual/libc \ - ${CT_PREFIX_DIR}/share/doc - fi - fi - - if [ "${CT_LIBC_LOCALES}" = "y" ]; then - do_libc_locales - fi - fi # libc_full == y -} - -# Build up the addons list, separated with $1 -do_libc_add_ons_list() { - local sep="$1" - local addons_list="$( echo "${CT_LIBC_ADDONS_LIST}" \ - |sed -r -e "s/[[:space:],]/${sep}/g;" \ - )" - if [ "${CT_LIBC_GLIBC_2_20_or_later}" != "y" ]; then - case "${CT_THREADS}" in - none) ;; - *) addons_list="${addons_list}${sep}${CT_THREADS}";; - esac - fi - [ "${CT_LIBC_GLIBC_USE_PORTS}" = "y" ] && addons_list="${addons_list}${sep}ports" - # Remove duplicate, leading and trailing separators - echo "${addons_list}" |sed -r -e "s/${sep}+/${sep}/g; s/^${sep}//; s/${sep}\$//;" -} - -# Compute up the minimum supported Linux kernel version -do_libc_min_kernel_config() { - local min_kernel_config - - case "${CT_LIBC_GLIBC_EXTRA_CONFIG_ARRAY[*]}" in - *--enable-kernel*) ;; - *) if [ "${CT_LIBC_GLIBC_KERNEL_VERSION_AS_HEADERS}" = "y" ]; then - # We can't rely on the kernel version from the configuration, - # because it might not be available if the user uses pre-installed - # headers. On the other hand, both method will have the kernel - # version installed in "usr/include/linux/version.h" in the sysroot. - # Parse that instead of having two code-paths. - version_code_file="${CT_SYSROOT_DIR}/usr/include/linux/version.h" - if [ ! -f "${version_code_file}" -o ! -r "${version_code_file}" ]; then - CT_Abort "Linux version is unavailable in installed headers files" - fi - version_code="$( grep -E LINUX_VERSION_CODE "${version_code_file}" \ - |cut -d ' ' -f 3 \ - )" - version=$(((version_code>>16)&0xFF)) - patchlevel=$(((version_code>>8)&0xFF)) - sublevel=$((version_code&0xFF)) - min_kernel_config="${version}.${patchlevel}.${sublevel}" - elif [ "${CT_LIBC_GLIBC_KERNEL_VERSION_CHOSEN}" = "y" ]; then - # Trim the fourth part of the linux version, keeping only the first three numbers - min_kernel_config="$( echo "${CT_LIBC_GLIBC_MIN_KERNEL_VERSION}" \ - |sed -r -e 's/^([^.]+\.[^.]+\.[^.]+)(|\.[^.]+)$/\1/;' \ - )" - fi - echo "--enable-kernel=${min_kernel_config}" - ;; - esac -} diff --git a/scripts/build/libc/glibc.sh b/scripts/build/libc/glibc.sh index 971d326..2a0ae83 100644 --- a/scripts/build/libc/glibc.sh +++ b/scripts/build/libc/glibc.sh @@ -2,13 +2,528 @@ # Copyright 2007 Yann E. MORIN # Licensed under the GPL v2. See COPYING in the root of this package -# Add the definitions common to glibc and eglibc -# do_libc_extract -# do_libc_start_files -# do_libc -# do_libc_add_ons_list -# do_libc_min_kernel_config -. "${CT_LIB_DIR}/scripts/build/libc/glibc-eglibc.sh-common" +# Extract the C library tarball(s) +do_libc_extract() { + local addon + + # Attempt CT_EXTRACT only if NOT custom, or CUSTOM_LOCATION is not a directory + if [ "${CT_LIBC_CUSTOM}" != "y" \ + -o ! -d "${CT_LIBC_CUSTOM_LOCATION}" ]; then + CT_Extract "${CT_LIBC}-${CT_LIBC_VERSION}" + fi + CT_Pushd "${CT_SRC_DIR}/${CT_LIBC}-${CT_LIBC_VERSION}" + # Attempt CT_PATCH only if NOT custom + if [ "${CT_LIBC_CUSTOM}" != "y" ]; then + CT_Patch nochdir "${CT_LIBC}" "${CT_LIBC_VERSION}" + fi + + # Extract the add-opns + for addon in $(do_libc_add_ons_list " "); do + # If the addon was bundled with the main archive, we do not + # need to extract it. Worse, if we were to try to extract + # it, we'd get an error. + if [ -d "${addon}" ]; then + CT_DoLog DEBUG "Add-on '${addon}' already present, skipping extraction" + continue + fi + + CT_Extract nochdir "${CT_LIBC}-${addon}-${CT_LIBC_VERSION}" + + CT_TestAndAbort "Error in add-on '${addon}': both short and long names in tarball" \ + -d "${addon}" -a -d "${CT_LIBC}-${addon}-${CT_LIBC_VERSION}" + + # Some addons have the 'long' name, while others have the + # 'short' name, but patches are non-uniformly built with + # either the 'long' or 'short' name, whatever the addons name + # but we prefer the 'short' name and avoid duplicates. + if [ -d "${CT_LIBC}-${addon}-${CT_LIBC_VERSION}" ]; then + CT_DoExecLog FILE mv "${CT_LIBC}-${addon}-${CT_LIBC_VERSION}" "${addon}" + fi + + CT_DoExecLog FILE ln -s "${addon}" "${CT_LIBC}-${addon}-${CT_LIBC_VERSION}" + + CT_Patch nochdir "${CT_LIBC}" "${addon}-${CT_LIBC_VERSION}" + + # Remove the long name since it can confuse configure scripts to run + # the same source twice. + rm "${CT_LIBC}-${addon}-${CT_LIBC_VERSION}" + done + + # The configure files may be older than the configure.in files + # if using a snapshot (or even some tarballs). Fake them being + # up to date. + find . -type f -name configure -exec touch {} \; 2>&1 |CT_DoLog ALL + + CT_Popd + + if [ "${CT_LIBC_LOCALES}" = "y" ]; then + do_libc_locales_extract + fi +} + +# Build and install headers and start files +do_libc_start_files() { + # Start files and Headers should be configured the same way as the + # final libc, but built and installed differently. + do_libc_backend libc_mode=startfiles +} + +# This function builds and install the full C library +do_libc() { + do_libc_backend libc_mode=final +} + +# This backend builds the C library once for each multilib +# variant the compiler gives us +# Usage: do_libc_backend param=value [...] +# Parameter : Definition : Type : Default +# libc_mode : 'startfiles' or 'final' : string : (none) +do_libc_backend() { + local libc_mode + local -a multilibs + local multilib + local multi_dir + local multi_flags + local extra_dir + local libc_headers libc_startfiles libc_full + local hdr + local arg + + for arg in "$@"; do + eval "${arg// /\\ }" + done + + case "${libc_mode}" in + startfiles) + CT_DoStep INFO "Installing C library headers & start files" + hdr=y + libc_startfiles=y + libc_full= + ;; + final) + CT_DoStep INFO "Installing C library" + hdr= + libc_startfiles= + libc_full=y + ;; + *) CT_Abort "Unsupported (or unset) libc_mode='${libc_mode}'";; + esac + + # If gcc is not configured for multilib, it still prints + # a single line for the default settings + multilibs=( $("${CT_TARGET}-gcc" -print-multi-lib 2>/dev/null) ) + for multilib in "${multilibs[@]}"; do + multi_dir="${multilib%%;*}" + if [ "${multi_dir}" != "." ]; then + CT_DoStep INFO "Building for multilib subdir='${multi_dir}'" + + extra_flags="$( echo "${multilib#*;}" \ + |${sed} -r -e 's/@/ -/g;' \ + )" + extra_dir="/${multi_dir}" + + # glibc install its files in ${extra_dir}/{usr/,}lib + # while gcc expects them in {,usr/}lib/${extra_dir}. + # Prepare some symlinks so glibc installs in fact in + # the proper place + # We do it in the start-files step, so it is not needed + # to do it in the final step, as the symlinks will + # already exist + if [ "${libc_mode}" = "startfiles" ]; then + CT_Pushd "${CT_SYSROOT_DIR}" + CT_DoExecLog ALL mkdir -p "lib/${multi_dir}" \ + "usr/lib/${multi_dir}" \ + "${multi_dir}" \ + "${multi_dir}/usr" + CT_DoExecLog ALL ln -sf "../lib/${multi_dir}" "${multi_dir}/lib" + CT_DoExecLog ALL ln -sf "../../usr/lib/${multi_dir}" "${multi_dir}/usr/lib" + CT_Popd + fi + libc_headers= + else + extra_dir= + extra_flags= + libc_headers="${hdr}" + fi + + CT_mkdir_pushd "${CT_BUILD_DIR}/build-libc-${libc_mode}${extra_dir//\//_}" + + do_libc_backend_once extra_dir="${extra_dir}" \ + extra_flags="${extra_flags}" \ + libc_headers="${libc_headers}" \ + libc_startfiles="${libc_startfiles}" \ + libc_full="${libc_full}" + + CT_Popd + + if [ "${multi_dir}" != "." ]; then + if [ "${libc_mode}" = "final" ]; then + CT_DoLog EXTRA "Fixing up multilib location" + + # rewrite the library multiplexers + for d in "lib/${multi_dir}" "usr/lib/${multi_dir}"; do + for l in libc libpthread libgcc_s; do + if [ -f "${CT_SYSROOT_DIR}/${d}/${l}.so" \ + -a ! -L ${CT_SYSROOT_DIR}/${d}/${l}.so ] + then + CT_DoExecLog DEBUG ${sed} -r -i \ + -e "s:/lib/:/lib/${multi_dir}/:g;" \ + "${CT_SYSROOT_DIR}/${d}/${l}.so" + fi + done + done + # Remove the multi_dir now it is no longer useful + CT_DoExecLog DEBUG rm -rf "${CT_SYSROOT_DIR}/${multi_dir}" + fi # libc_mode == final + + CT_EndStep + fi + done + + CT_EndStep +} + +# This backend builds the C library once +# Usage: do_libc_backend_once param=value [...] +# Parameter : Definition : Type : Default +# libc_headers : Build libc headers : bool : n +# libc_startfiles : Build libc start-files : bool : n +# libc_full : Build full libc : bool : n +# extra_flags : Extra CFLAGS to use (for multilib) : string : (empty) +# extra_dir : Extra subdir for multilib : string : (empty) +do_libc_backend_once() { + local libc_headers + local libc_startfiles + local libc_full + local extra_flags + local extra_dir + local src_dir="${CT_SRC_DIR}/${CT_LIBC}-${CT_LIBC_VERSION}" + local extra_cc_args + local -a extra_config + local -a extra_make_args + local glibc_cflags + local float_extra + local endian_extra + local arg + + for arg in "$@"; do + eval "${arg// /\\ }" + done + + CT_DoLog EXTRA "Configuring C library" + + case "${CT_LIBC}" in + glibc) + # glibc can't be built without -O2 (reference needed!) + OPTIMIZE=-O2 + # Also, if those two are missing, iconv build breaks + extra_config+=( --disable-debug --disable-sanity-checks ) + ;; + esac + + # always include rpc, the user can still override it with TI-RPC + extra_config+=( --enable-obsolete-rpc ) + + # Add some default glibc config options if not given by user. + # We don't need to be conditional on wether the user did set different + # values, as they CT_LIBC_GLIBC_EXTRA_CONFIG_ARRAY is passed after + # extra_config + + extra_config+=("$(do_libc_min_kernel_config)") + + case "${CT_THREADS}" in + nptl) extra_config+=("--with-__thread" "--with-tls");; + linuxthreads) extra_config+=("--with-__thread" "--without-tls" "--without-nptl");; + none) extra_config+=("--without-__thread" "--without-nptl") + case "${CT_LIBC_GLIBC_EXTRA_CONFIG_ARRAY[*]}" in + *-tls*) ;; + *) extra_config+=("--without-tls");; + esac + ;; + esac + + case "${CT_SHARED_LIBS}" in + y) extra_config+=("--enable-shared");; + *) extra_config+=("--disable-shared");; + esac + + float_extra="$( echo "${extra_flags}" \ + |${sed} -r -e '/^(.*[[:space:]])?-m(hard|soft)-float([[:space:]].*)?$/!d;' \ + -e 's//\2/;' \ + )" + case "${float_extra}" in + hard) extra_config+=("--with-fp");; + soft) extra_config+=("--without-fp");; + "") + case "${CT_ARCH_FLOAT}" in + hard|softfp) extra_config+=("--with-fp");; + soft) extra_config+=("--without-fp");; + esac + ;; + esac + + if [ "${CT_LIBC_DISABLE_VERSIONING}" = "y" ]; then + extra_config+=("--disable-versioning") + fi + + if [ "${CT_LIBC_OLDEST_ABI}" != "" ]; then + extra_config+=("--enable-oldest-abi=${CT_LIBC_OLDEST_ABI}") + fi + + case "$(do_libc_add_ons_list ,)" in + "") extra_config+=("--enable-add-ons=no");; + *) extra_config+=("--enable-add-ons=$(do_libc_add_ons_list ,)");; + esac + + extra_config+=("--with-pkgversion=${CT_PKGVERSION}") + [ -n "${CT_TOOLCHAIN_BUGURL}" ] && extra_config+=("--with-bugurl=${CT_TOOLCHAIN_BUGURL}") + + # Extract the endianness options if any + # This should cover all possible endianness options + # in gcc, but it is prone to bit-rot... :-( + endian_extra="$( echo "${extra_flags}" \ + |${sed} -r -e '/^(.*[[:space:]])?-(E[BL]|m((big|little)(-endian)?|e?[bl]))([[:space:]].*)?$/!d;' \ + -e 's//\2/;' \ + )" + case "${endian_extra}" in + EB|mbig-endian|mbig|meb|mb) + extra_cc_args="${extra_cc_args} ${endian_extra}" + ;; + EL|mlittle-endian|mlittle|mel|ml) + extra_cc_args="${extra_cc_args} ${endian_extra}" + ;; + "") extra_cc_args="${extra_cc_args} ${CT_ARCH_ENDIAN_OPT}" + ;; + esac + + touch config.cache + if [ "${CT_LIBC_GLIBC_FORCE_UNWIND}" = "y" ]; then + echo "libc_cv_forced_unwind=yes" >>config.cache + echo "libc_cv_c_cleanup=yes" >>config.cache + fi + + # Pre-seed the configparms file with values from the config option + printf "%s\n" "${CT_LIBC_GLIBC_CONFIGPARMS}" > configparms + + cross_cc=$(CT_Which "${CT_TARGET}-gcc") + extra_cc_args+=" ${extra_flags}" + + case "${CT_LIBC_ENABLE_FORTIFIED_BUILD}" in + y) ;; + *) glibc_cflags+=" -U_FORTIFY_SOURCE";; + esac + glibc_cflags+=" ${CT_TARGET_CFLAGS} ${OPTIMIZE} ${CT_LIBC_GLIBC_EXTRA_CFLAGS}" + + # ./configure is mislead by our tools override wrapper for bash + # so just tell it where the real bash is _on_the_target_! + # Notes: + # - ${ac_cv_path_BASH_SHELL} is only used to set BASH_SHELL + # - ${BASH_SHELL} is only used to set BASH + # - ${BASH} is only used to set the shebang + # in two scripts to run on the target + # So we can safely bypass bash detection at compile time. + # Should this change in a future glibc release, we'd better + # directly mangle the generated scripts _after_ they get built, + # or even after they get installed... + echo "ac_cv_path_BASH_SHELL=/bin/bash" >>config.cache + + # Configure with --prefix the way we want it on the target... + # There are a whole lot of settings here. You'll probably want + # to read up on what they all mean, and customize a bit, possibly by setting GLIBC_EXTRA_CONFIG_ARRAY + # Compare these options with the ones used when installing the glibc headers above - they're different. + # Adding "--without-gd" option to avoid error "memusagestat.c:36:16: gd.h: No such file or directory" + # See also http://sources.redhat.com/ml/libc-alpha/2000-07/msg00024.html. + # Set BUILD_CC, or we won't be able to build datafiles + # Run explicitly through CONFIG_SHELL, or the build breaks badly (loop-of-death) + # when the shell is not bash... Sigh... :-( + + CT_DoLog DEBUG "Using gcc for target : '${cross_cc}'" + CT_DoLog DEBUG "Configuring with addons : '$(do_libc_add_ons_list ,)'" + CT_DoLog DEBUG "Extra config args passed: '${extra_config[*]}'" + CT_DoLog DEBUG "Extra CC args passed : '${glibc_cflags}'" + CT_DoLog DEBUG "Extra flags (multilib) : '${extra_flags}'" + + CT_DoExecLog CFG \ + BUILD_CC="${CT_BUILD}-gcc" \ + CFLAGS="${glibc_cflags}" \ + CC="${CT_TARGET}-gcc ${CT_LIBC_EXTRA_CC_ARGS} ${extra_cc_args}" \ + AR=${CT_TARGET}-ar \ + RANLIB=${CT_TARGET}-ranlib \ + "${CONFIG_SHELL}" \ + "${src_dir}/configure" \ + --prefix=/usr \ + --build=${CT_BUILD} \ + --host=${CT_TARGET} \ + --cache-file="$(pwd)/config.cache" \ + --without-cvs \ + --disable-profile \ + --without-gd \ + --with-headers="${CT_HEADERS_DIR}" \ + "${extra_config[@]}" \ + "${CT_LIBC_GLIBC_EXTRA_CONFIG_ARRAY[@]}" + + # build hacks + case "${CT_ARCH},${CT_ARCH_CPU}" in + powerpc,8??) + # http://sourceware.org/ml/crossgcc/2008-10/msg00068.html + CT_DoLog DEBUG "Activating support for memset on broken ppc-8xx (CPU15 erratum)" + extra_make_args+=( ASFLAGS="-DBROKEN_PPC_8xx_CPU15" ) + ;; + esac + + if [ "${libc_headers}" = "y" ]; then + CT_DoLog EXTRA "Installing C library headers" + + # use the 'install-headers' makefile target to install the + # headers + CT_DoExecLog ALL make ${JOBSFLAGS} \ + install_root=${CT_SYSROOT_DIR}${extra_dir} \ + install-bootstrap-headers=yes \ + "${extra_make_args[@]}" \ + install-headers + + # For glibc, a few headers need to be manually installed + if [ "${CT_LIBC}" = "glibc" ]; then + # Two headers -- stubs.h and features.h -- aren't installed by install-headers, + # so do them by hand. We can tolerate an empty stubs.h for the moment. + # See e.g. http://gcc.gnu.org/ml/gcc/2002-01/msg00900.html + mkdir -p "${CT_HEADERS_DIR}/gnu" + CT_DoExecLog ALL touch "${CT_HEADERS_DIR}/gnu/stubs.h" + CT_DoExecLog ALL cp -v "${CT_SRC_DIR}/glibc-${CT_LIBC_VERSION}/include/features.h" \ + "${CT_HEADERS_DIR}/features.h" + + # Building the bootstrap gcc requires either setting inhibit_libc, or + # having a copy of stdio_lim.h... see + # http://sources.redhat.com/ml/libc-alpha/2003-11/msg00045.html + CT_DoExecLog ALL cp -v bits/stdio_lim.h "${CT_HEADERS_DIR}/bits/stdio_lim.h" + + # Following error building gcc-4.0.0's gcj: + # error: bits/syscall.h: No such file or directory + # solved by following copy; see http://sourceware.org/ml/crossgcc/2005-05/msg00168.html + # but it breaks arm, see http://sourceware.org/ml/crossgcc/2006-01/msg00091.html + # Of course, only copy it if it does not already exist + case "${CT_ARCH}" in + arm) ;; + *) if [ -f "${CT_HEADERS_DIR}/bits/syscall.h" ]; then + CT_DoLog ALL "Not over-writing existing bits/syscall.h" + elif [ -f "misc/bits/syscall.h" ]; then + CT_DoExecLog ALL cp -v "misc/bits/syscall.h" \ + "${CT_HEADERS_DIR}/bits/syscall.h" + else + # "Old" glibces do not have the above file, + # but provide this one: + CT_DoExecLog ALL cp -v "misc/syscall-list.h" \ + "${CT_HEADERS_DIR}/bits/syscall.h" + fi + ;; + esac + fi + fi # libc_headers == y + + if [ "${libc_startfiles}" = "y" ]; then + if [ "${CT_THREADS}" = "nptl" ]; then + CT_DoLog EXTRA "Installing C library start files" + + # there are a few object files needed to link shared libraries, + # which we build and install by hand + CT_DoExecLog ALL mkdir -p "${CT_SYSROOT_DIR}${extra_dir}/usr/lib" + CT_DoExecLog ALL make ${JOBSFLAGS} \ + "${extra_make_args[@]}" \ + csu/subdir_lib + CT_DoExecLog ALL cp csu/crt1.o csu/crti.o csu/crtn.o \ + "${CT_SYSROOT_DIR}${extra_dir}/usr/lib" + + # Finally, 'libgcc_s.so' requires a 'libc.so' to link against. + # However, since we will never actually execute its code, + # it doesn't matter what it contains. So, treating '/dev/null' + # as a C source file, we produce a dummy 'libc.so' in one step + CT_DoExecLog ALL "${cross_cc}" -nostdlib \ + -nostartfiles \ + -shared \ + -x c /dev/null \ + -o "${CT_SYSROOT_DIR}${extra_dir}/usr/lib/libc.so" + fi # threads == nptl + fi # libc_headers == y + + if [ "${libc_full}" = "y" ]; then + CT_DoLog EXTRA "Building C library" + CT_DoExecLog ALL make ${JOBSFLAGS} \ + "${extra_make_args[@]}" \ + all + + CT_DoLog EXTRA "Installing C library" + CT_DoExecLog ALL make ${JOBSFLAGS} \ + "${extra_make_args[@]}" \ + install_root="${CT_SYSROOT_DIR}${extra_dir}" \ + install + + if [ "${CT_BUILD_MANUALS}" = "y" ]; then + CT_DoLog EXTRA "Building and installing the C library manual" + # Omit JOBSFLAGS as GLIBC has problems building the + # manuals in parallel + CT_DoExecLog ALL make pdf html + CT_DoExecLog ALL mkdir -p ${CT_PREFIX_DIR}/share/doc + CT_DoExecLog ALL cp -av ${src_dir}/manual/*.pdf \ + ${src_dir}/manual/libc \ + ${CT_PREFIX_DIR}/share/doc + fi + + if [ "${CT_LIBC_LOCALES}" = "y" ]; then + do_libc_locales + fi + fi # libc_full == y +} + +# Build up the addons list, separated with $1 +do_libc_add_ons_list() { + local sep="$1" + local addons_list="$( echo "${CT_LIBC_ADDONS_LIST}" \ + |sed -r -e "s/[[:space:],]/${sep}/g;" \ + )" + if [ "${CT_LIBC_GLIBC_2_20_or_later}" != "y" ]; then + case "${CT_THREADS}" in + none) ;; + *) addons_list="${addons_list}${sep}${CT_THREADS}";; + esac + fi + [ "${CT_LIBC_GLIBC_USE_PORTS}" = "y" ] && addons_list="${addons_list}${sep}ports" + # Remove duplicate, leading and trailing separators + echo "${addons_list}" |sed -r -e "s/${sep}+/${sep}/g; s/^${sep}//; s/${sep}\$//;" +} + +# Compute up the minimum supported Linux kernel version +do_libc_min_kernel_config() { + local min_kernel_config + + case "${CT_LIBC_GLIBC_EXTRA_CONFIG_ARRAY[*]}" in + *--enable-kernel*) ;; + *) if [ "${CT_LIBC_GLIBC_KERNEL_VERSION_AS_HEADERS}" = "y" ]; then + # We can't rely on the kernel version from the configuration, + # because it might not be available if the user uses pre-installed + # headers. On the other hand, both method will have the kernel + # version installed in "usr/include/linux/version.h" in the sysroot. + # Parse that instead of having two code-paths. + version_code_file="${CT_SYSROOT_DIR}/usr/include/linux/version.h" + if [ ! -f "${version_code_file}" -o ! -r "${version_code_file}" ]; then + CT_Abort "Linux version is unavailable in installed headers files" + fi + version_code="$( grep -E LINUX_VERSION_CODE "${version_code_file}" \ + |cut -d ' ' -f 3 \ + )" + version=$(((version_code>>16)&0xFF)) + patchlevel=$(((version_code>>8)&0xFF)) + sublevel=$((version_code&0xFF)) + min_kernel_config="${version}.${patchlevel}.${sublevel}" + elif [ "${CT_LIBC_GLIBC_KERNEL_VERSION_CHOSEN}" = "y" ]; then + # Trim the fourth part of the linux version, keeping only the first three numbers + min_kernel_config="$( echo "${CT_LIBC_GLIBC_MIN_KERNEL_VERSION}" \ + |sed -r -e 's/^([^.]+\.[^.]+\.[^.]+)(|\.[^.]+)$/\1/;' \ + )" + fi + echo "--enable-kernel=${min_kernel_config}" + ;; + esac +} # Download glibc do_libc_get() { @@ -24,7 +539,7 @@ do_libc_get() { CT_LIBC_CUSTOM_LOCATION="${CT_SRC_DIR}/glibc-${CT_LIBC_VERSION}" else if echo ${CT_LIBC_VERSION} |grep -q linaro; then - # Linaro eglibc releases come from regular downloads... + # Linaro glibc releases come from regular downloads... YYMM=`echo ${CT_LIBC_VERSION} |cut -d- -f3 |${sed} -e 's,^..,,'` CT_GetFile "glibc-${CT_LIBC_VERSION}" \ https://releases.linaro.org/${YYMM}/components/toolchain/glibc-linaro \ @@ -88,7 +603,7 @@ do_libc_locales() { CT_DoLog EXTRA "Configuring C library localedef" - if [ "${CT_LIBC_EGLIBC_HAS_PKGVERSION_BUGURL}" = "y" ]; then + if [ "${CT_LIBC_GLIBC_HAS_PKGVERSION_BUGURL}" = "y" ]; then extra_config+=("--with-pkgversion=${CT_PKGVERSION}") [ -n "${CT_TOOLCHAIN_BUGURL}" ] && extra_config+=("--with-bugurl=${CT_TOOLCHAIN_BUGURL}") fi @@ -109,7 +624,7 @@ do_libc_locales() { # - ${BASH} is only used to set the shebang # in two scripts to run on the target # So we can safely bypass bash detection at compile time. - # Should this change in a future eglibc release, we'd better + # Should this change in a future glibc release, we'd better # directly mangle the generated scripts _after_ they get built, # or even after they get installed... echo "ac_cv_path_BASH_SHELL=/bin/bash" >>config.cache diff --git a/scripts/functions b/scripts/functions index a309f2d..cd3d446 100644 --- a/scripts/functions +++ b/scripts/functions @@ -737,7 +737,7 @@ CT_GetFile() { done # Just return error, someone may want to catch and handle the error - # (eg. glibc/eglibc add-ons can be missing). + # (eg. glibc add-ons can be missing). return 1 } -- cgit v0.10.2-6-g49f6