diff options
author | V3n3RiX <venerix@redcorelinux.org> | 2018-01-16 17:34:21 +0000 |
---|---|---|
committer | V3n3RiX <venerix@redcorelinux.org> | 2018-01-16 17:34:21 +0000 |
commit | 02e2208f46f4e2c00fb9743cbc47350bdd233bfa (patch) | |
tree | 132dd60828854db4f65f30f9230f43d9602507ff /sys-libs/glibc | |
parent | 8be70107efbb417f839292165ee39d07a062046f (diff) |
gentoo resync : 16.01.2018
Diffstat (limited to 'sys-libs/glibc')
-rw-r--r-- | sys-libs/glibc/Manifest | 4 | ||||
-rw-r--r-- | sys-libs/glibc/glibc-9999.ebuild | 587 |
2 files changed, 545 insertions, 46 deletions
diff --git a/sys-libs/glibc/Manifest b/sys-libs/glibc/Manifest index ca4184a53804..244bd2859bae 100644 --- a/sys-libs/glibc/Manifest +++ b/sys-libs/glibc/Manifest @@ -34,7 +34,7 @@ DIST glibc-2.25.tar.xz 13873900 BLAKE2B 73ef792fff059f6ad154c9af2155ea15b7869ec1 DIST glibc-2.26-patches-4.tar.bz2 315447 BLAKE2B 038926c8c187cfea5c00a7017a486356adf0f0959dc8868847f26877b4b441bd76629f20d52967f9da878f69a1ac2859332ed3984b4ebb5cb528d50e0b012736 SHA512 04d229e5f9342d62f2fce039c70489609886782d8aabd49403863a1a679e3b0890ca26c129088738a4af7ef6d95c74f24fb3c4d03695bf7ba6e45eca4de1a5f0 DIST glibc-2.26-patches-5.tar.bz2 357699 BLAKE2B 98a0cb231bf35a132747f1fa6e654a9ad2eff8b445f002a0239c9a45f5a896ad490570aedee2b43e6cfa94794ae5c8b5e312e369838c3770823f28b61b51b592 SHA512 0040469e4a85f5c2aac972e42aeb06b0adfc3a132b32b19306be9f1877339fe6651a2fbd4d90d502b07ae4460f74efbd1cd103d38a2038df9402b0a380f03c2a DIST glibc-2.26.tar.xz 14682748 BLAKE2B c1c9dbec110dd4e25b2f463a96d8afc43b8e3ebfe3c958107032beaa879710252be3bc4122bb62166408725d43785f233544df6159d29cce0fc5b2c08f45adbe SHA512 6ed368523bc55f00976f96c5177f114e3f714b27273d7bffc252812c8b98fb81970403c1f5b5f0a61da678811532fb446530745492d2b49bfefc0d5bd71ce8c0 -DIST glibc-9999-patches-3.tar.bz2 19892 BLAKE2B e0a51f376e7142f56ae2a0862a7723343ee378275c1a0c6c3a69607b5bb7f9bd655f0a68f8f9cfc32008e06852d0eb0a9e16c85ea9a395dc36b428f1ea6100d8 SHA512 75084b86a83d447d3a4b3959fa2a93d849e304ba9473ebec5570ca4fb5e2f8dfb38548faf3abc9fbd29b529f2c608b52eb2ef2e6e9a2ad5bea9a9298a19ef596 +DIST glibc-9999-patches-4.tar.bz2 15159 BLAKE2B e17e9efa196a1acf27dd1535bb43a8999eb4f76e7aecb47ee7fb1fb5258870ddc024a4a5d3fb514d3d37ce28326d3bae93f3c6f534c048b57a6369a1a135e0af SHA512 6e0f8ff9ee125e936a0e43f830423b13ac5350c9a8a83f1c4bb367084e9f2c81cf740f3d97e8bd451890ade46fadfe21154afecca739d00cf6ce1127dba4bb7b EBUILD glibc-2.18-r1.ebuild 5514 BLAKE2B 2b007c0f935df77d35d74adceab874eeab55306c1fc69eee3c0f45a5d9cd02e6b4dcf7ab25d2bb450fd07fe7f20a827a774a6e15322f7b8a447726acdf31a3f7 SHA512 b306c31227f15cbf0dbf518195736856f30949544dac12fb4b5b0aabd3e421f040663aacea159181b61f92777a19519241f5c05f6e65576b26f6406df85ef83b EBUILD glibc-2.19-r1.ebuild 5471 BLAKE2B 8531139c723de6358daa971e96f98db628eec14c696b004a4e8a4a7efc8a0c610d713625655c55293c94898d13ac9aea5ae1a58134aedb30b1b695859748a964 SHA512 aae5bcdaa10cf6a3026e28b406046bd7297fdacfa8d0ace60f76177aa2efed6b0f82b639f5e6db6bd42d99440d12644d62e9b14cf49ced7284f011cb3c406775 EBUILD glibc-2.20-r2.ebuild 4947 BLAKE2B 24062f002678df912ced724a3d919bc2f07476c98000092cb3fa3f2be1836db57348c88b6fc1da7a9364103136eecbe687fe365d131f10c82de3cb0edd3eb8c5 SHA512 ff76e9173ab6bfccb1c659f79cefb93f6fa6266adab40a3816f56acddb7866cee67ba6bfa8d1b9988eff755e9d1a879e62973fc332566c185f019af5e17a9f1d @@ -46,5 +46,5 @@ EBUILD glibc-2.25-r10.ebuild 5012 BLAKE2B 86753e126c049ba2407529668b82094650a718 EBUILD glibc-2.25-r9.ebuild 4999 BLAKE2B 6c0784aa614374954c0747deb7a33fdba0f8b1935cc28c62af29880d64991cc93740eddefe8dca971d6c1bbba14161e10db75e00a91d73282e0c0bf094004b94 SHA512 3b5dc2073ae44e6cf5a4f8f64a3c3fd837ebaa222009ee617105259765ff4222fb3960be1c537d4fde6c7e928bd85325d9070cb668b31cb6afb03368c079141f EBUILD glibc-2.26-r3.ebuild 25337 BLAKE2B 7d35bc98ff62279aaf8221a5366d6624c9c51344d3550a827739d700f32de23ac2a8f9b08f7a8d6437d61a200aeedfa041f68425675881c676642cc5499ac822 SHA512 71a2d63ec8772548d8b88576f6088f394dc364a864aab4e803c6d02600c296c629408fab94ca1b5402d1cfa5503c5a8409f2aed7e5d6afc5e16b98a0eb715765 EBUILD glibc-2.26-r5.ebuild 25543 BLAKE2B d6f427a7c876a264fc7b14516c7e36adf97a594d291ff34b90f69397fa097968a38db2fbfd19854fedf55d59e7d1b8ff757b525cf6f33182cd3633f0044ef254 SHA512 364a561a54f81d4e40298310acec3c7bd976276abae24549d891de58146739964bb73e91b53c193fae8e6328dccbda0b57fbfca2b7e27912d1654c18ab62e13c -EBUILD glibc-9999.ebuild 25767 BLAKE2B 0c5ddf6b25ca3bb5303fc3bfc977f70273a98e533380d770df3dfbd683a06a37ebb335d138bc49831b92eee416e63227b609e8c621ac9f81e26e52cd71091b51 SHA512 94dd656d151ebbe0a8eeecd4a2470a7f758279751aa6de9a55631112152829136674ad40e77d57ba5dac24204f4d4c2f0ddb9b5dfa334e68460fb5db61c2eb82 +EBUILD glibc-9999.ebuild 39783 BLAKE2B efacbc5c74f742ac63485a880228781b5f09f1613fc9b760a6072421dc17493ec9726e8a0987a0a4eed971822663fdef9b8f4d3e78c157ca75ad828dc8bb28aa SHA512 8619067d0ffbdd3f5180b1cab7f7f23b75af73ac442ad66d35c5413ebaaaaea9ca6b4d2c803114e9a612af5711b23d86644609efe7337a798cacf016a3f5b88f MISC metadata.xml 1054 BLAKE2B dbc091e54130729385bc02aaa1025885f101caa88d601b1f7670974d89e7e24aae5d37fd6699278a37c0064e1f3232c04954dc127869427317b5d80b499f3813 SHA512 65474b7d32ceb6bafe8ae0e18aa0b46b68cefecce5570a0e8d4a0117019e6540f2feae35cecbebad382b4f06d6e5ae1dfa9b8a61889881e8534956dd42df8e4b diff --git a/sys-libs/glibc/glibc-9999.ebuild b/sys-libs/glibc/glibc-9999.ebuild index 5d7f3a9fbe9d..0b6f444f7711 100644 --- a/sys-libs/glibc/glibc-9999.ebuild +++ b/sys-libs/glibc/glibc-9999.ebuild @@ -3,16 +3,14 @@ EAPI=6 -inherit prefix toolchain-glibc +inherit prefix eutils versionator toolchain-funcs flag-o-matic gnuconfig \ + multilib systemd multiprocessing DESCRIPTION="GNU libc C library" HOMEPAGE="https://www.gnu.org/software/libc/" - LICENSE="LGPL-2.1+ BSD HPND ISC inner-net rc PCRE" RESTRICT="strip" # Strip ourself #46186 -EMULTILIB_PKG="true" - -# Configuration variables +SLOT="2.2" if [[ ${PV} == 9999* ]]; then EGIT_REPO_URI="https://sourceware.org/git/glibc.git" @@ -28,15 +26,15 @@ RELEASE_VER=${PV} GCC_BOOTSTRAP_VER="4.7.3-r1" # Gentoo patchset -PATCH_VER="3" +PATCH_VER=4 SRC_URI+=" https://dev.gentoo.org/~dilfridge/distfiles/${P}-patches-${PATCH_VER}.tar.bz2" SRC_URI+=" multilib? ( https://dev.gentoo.org/~dilfridge/distfiles/gcc-${GCC_BOOTSTRAP_VER}-multilib-bootstrap.tar.bz2 )" IUSE="audit caps compile-locales debug doc gd hardened multilib nscd selinux systemtap profile suid vanilla headers-only" -# Min kernel version glibc requires -: ${NPTL_KERN_VER:="3.2.0"} +# Minimum kernel version that glibc requires +MIN_KERN_VER="3.2.0" # Here's how the cross-compile logic breaks down ... # CTARGET - machine that will target the binaries @@ -51,7 +49,7 @@ IUSE="audit caps compile-locales debug doc gd hardened multilib nscd selinux sys # For install paths: # CHOST = CTARGET - install into / # CHOST != CTARGET - install into /usr/CTARGET/ - +# export CBUILD=${CBUILD:-${CHOST}} export CTARGET=${CTARGET:-${CHOST}} if [[ ${CTARGET} == ${CHOST} ]] ; then @@ -60,18 +58,8 @@ if [[ ${CTARGET} == ${CHOST} ]] ; then fi fi -is_crosscompile() { - [[ ${CHOST} != ${CTARGET} ]] -} - -just_headers() { - is_crosscompile && use headers-only -} - -SLOT="2.2" - -# General: We need a new-enough binutils/gcc to match upstream baseline. -# arch: we need to make sure our binutils/gcc supports TLS. +# We need a new-enough binutils/gcc to match upstream baseline. +# Also we need to make sure our binutils/gcc supports TLS. COMMON_DEPEND=" nscd? ( selinux? ( audit? ( sys-process/audit ) @@ -88,8 +76,8 @@ DEPEND="${COMMON_DEPEND} doc? ( sys-apps/texinfo ) " RDEPEND="${COMMON_DEPEND} - !sys-kernel/ps3-sources sys-apps/gentoo-functions + !sys-kernel/ps3-sources !sys-libs/nss-db " @@ -110,6 +98,475 @@ else fi # +# Small helper functions +# + +is_crosscompile() { + [[ ${CHOST} != ${CTARGET} ]] +} + +just_headers() { + is_crosscompile && use headers-only +} + +alt_prefix() { + is_crosscompile && echo /usr/${CTARGET} +} + +# We need to be able to set alternative headers for compiling for non-native +# platform. Will also become useful for testing kernel-headers without screwing +# up the whole system. +alt_headers() { + echo ${ALT_HEADERS:=$(alt_prefix)/usr/include} +} + +alt_build_headers() { + if [[ -z ${ALT_BUILD_HEADERS} ]] ; then + ALT_BUILD_HEADERS="${EPREFIX}$(alt_headers)" + if tc-is-cross-compiler ; then + ALT_BUILD_HEADERS=${SYSROOT}$(alt_headers) + if [[ ! -e ${ALT_BUILD_HEADERS}/linux/version.h ]] ; then + local header_path=$(echo '#include <linux/version.h>' | $(tc-getCPP ${CTARGET}) ${CFLAGS} 2>&1 | grep -o '[^"]*linux/version.h') + ALT_BUILD_HEADERS=${header_path%/linux/version.h} + fi + fi + fi + echo "${ALT_BUILD_HEADERS}" +} + +alt_libdir() { + echo $(alt_prefix)/$(get_libdir) +} +alt_usrlibdir() { + echo $(alt_prefix)/usr/$(get_libdir) +} + +builddir() { + echo "${WORKDIR}/build-${ABI}-${CTARGET}-$1" +} + +do_compile_test() { + local ret save_cflags=${CFLAGS} + CFLAGS+=" $1" + shift + + pushd "${T}" >/dev/null + + rm -f glibc-test* + printf '%b' "$*" > glibc-test.c + + nonfatal emake -s glibc-test + ret=$? + + popd >/dev/null + + CFLAGS=${save_cflags} + return ${ret} +} + +do_run_test() { + local ret + + if [[ ${MERGE_TYPE} == "binary" ]] ; then + # ignore build failures when installing a binary package #324685 + do_compile_test "" "$@" 2>/dev/null || return 0 + else + if ! do_compile_test "" "$@" ; then + ewarn "Simple build failed ... assuming this is desired #324685" + return 0 + fi + fi + + pushd "${T}" >/dev/null + + ./glibc-test + ret=$? + rm -f glibc-test* + + popd >/dev/null + + return ${ret} +} + +setup_target_flags() { + # This largely mucks with compiler flags. None of which should matter + # when building up just the headers. + just_headers && return 0 + + case $(tc-arch) in + x86) + # -march needed for #185404 #199334 + # TODO: When creating the first glibc cross-compile, this test will + # always fail as it does a full link which in turn requires glibc. + # Probably also applies when changing multilib profile settings (e.g. + # enabling x86 when the profile was amd64-only previously). + # We could change main to _start and pass -nostdlib here so that we + # only test the gcc code compilation. Or we could do a compile and + # then look for the symbol via scanelf. + if ! do_compile_test "" 'void f(int i, void *p) {if (__sync_fetch_and_add(&i, 1)) f(i, p);}\nint main(){return 0;}\n' 2>/dev/null ; then + local t=${CTARGET_OPT:-${CTARGET}} + t=${t%%-*} + filter-flags '-march=*' + export CFLAGS="-march=${t} ${CFLAGS}" + einfo "Auto adding -march=${t} to CFLAGS #185404" + fi + ;; + amd64) + # -march needed for #185404 #199334 + # Note: This test only matters when the x86 ABI is enabled, so we could + # optimize a bit and elide it. + # TODO: See cross-compile issues listed above for x86. + if ! do_compile_test "${CFLAGS_x86}" 'void f(int i, void *p) {if (__sync_fetch_and_add(&i, 1)) f(i, p);}\nint main(){return 0;}\n' 2>/dev/null ; then + local t=${CTARGET_OPT:-${CTARGET}} + t=${t%%-*} + # Normally the target is x86_64-xxx, so turn that into the -march that + # gcc actually accepts. #528708 + [[ ${t} == "x86_64" ]] && t="x86-64" + filter-flags '-march=*' + # ugly, ugly, ugly. ugly. + CFLAGS_x86=$(CFLAGS=${CFLAGS_x86} filter-flags '-march=*'; echo "${CFLAGS}") + export CFLAGS_x86="${CFLAGS_x86} -march=${t}" + einfo "Auto adding -march=${t} to CFLAGS_x86 #185404" + fi + ;; + mips) + # The mips abi cannot support the GNU style hashes. #233233 + filter-ldflags -Wl,--hash-style=gnu -Wl,--hash-style=both + ;; + sparc) + # Both sparc and sparc64 can use -fcall-used-g6. -g7 is bad, though. + filter-flags "-fcall-used-g7" + append-flags "-fcall-used-g6" + + # If the CHOST is the basic one (e.g. not sparcv9-xxx already), + # try to pick a better one so glibc can use cpu-specific .S files. + # We key off the CFLAGS to get a good value. Also need to handle + # version skew. + # We can't force users to set their CHOST to their exact machine + # as many of these are not recognized by config.sub/gcc and such :(. + # Note: If the mcpu values don't scale, we might try probing CPP defines. + # Note: Should we factor in -Wa,-AvXXX flags too ? Or -mvis/etc... ? + + local cpu + case ${CTARGET} in + sparc64-*) + case $(get-flag mcpu) in + niagara[234]) + if version_is_at_least 2.8 ; then + cpu="sparc64v2" + elif version_is_at_least 2.4 ; then + cpu="sparc64v" + elif version_is_at_least 2.2.3 ; then + cpu="sparc64b" + fi + ;; + niagara) + if version_is_at_least 2.4 ; then + cpu="sparc64v" + elif version_is_at_least 2.2.3 ; then + cpu="sparc64b" + fi + ;; + ultrasparc3) + cpu="sparc64b" + ;; + *) + # We need to force at least v9a because the base build doesn't + # work with just v9. + # https://sourceware.org/bugzilla/show_bug.cgi?id=19477 + [[ -z ${cpu} ]] && append-flags "-Wa,-xarch=v9a" + ;; + esac + ;; + sparc-*) + case $(get-flag mcpu) in + niagara[234]) + if version_is_at_least 2.8 ; then + cpu="sparcv9v2" + elif version_is_at_least 2.4 ; then + cpu="sparcv9v" + elif version_is_at_least 2.2.3 ; then + cpu="sparcv9b" + else + cpu="sparcv9" + fi + ;; + niagara) + if version_is_at_least 2.4 ; then + cpu="sparcv9v" + elif version_is_at_least 2.2.3 ; then + cpu="sparcv9b" + else + cpu="sparcv9" + fi + ;; + ultrasparc3) + cpu="sparcv9b" + ;; + v9|ultrasparc) + cpu="sparcv9" + ;; + v8|supersparc|hypersparc|leon|leon3) + cpu="sparcv8" + ;; + esac + ;; + esac + [[ -n ${cpu} ]] && CTARGET_OPT="${cpu}-${CTARGET#*-}" + ;; + esac +} + +setup_flags() { + # Make sure host make.conf doesn't pollute us + if is_crosscompile || tc-is-cross-compiler ; then + CHOST=${CTARGET} strip-unsupported-flags + fi + + # Store our CFLAGS because it's changed depending on which CTARGET + # we are building when pulling glibc on a multilib profile + CFLAGS_BASE=${CFLAGS_BASE-${CFLAGS}} + CFLAGS=${CFLAGS_BASE} + CXXFLAGS_BASE=${CXXFLAGS_BASE-${CXXFLAGS}} + CXXFLAGS=${CXXFLAGS_BASE} + ASFLAGS_BASE=${ASFLAGS_BASE-${ASFLAGS}} + ASFLAGS=${ASFLAGS_BASE} + + # Over-zealous CFLAGS can often cause problems. What may work for one + # person may not work for another. To avoid a large influx of bugs + # relating to failed builds, we strip most CFLAGS out to ensure as few + # problems as possible. + strip-flags + strip-unsupported-flags + filter-flags -m32 -m64 '-mabi=*' + + # glibc aborts if rpath is set by LDFLAGS + filter-ldflags '-Wl,-rpath=*' + + # #492892 + filter-flags -frecord-gcc-switches + + unset CBUILD_OPT CTARGET_OPT + if use multilib ; then + CTARGET_OPT=$(get_abi_CTARGET) + [[ -z ${CTARGET_OPT} ]] && CTARGET_OPT=$(get_abi_CHOST) + fi + + setup_target_flags + + if [[ -n ${CTARGET_OPT} && ${CBUILD} == ${CHOST} ]] && ! is_crosscompile; then + CBUILD_OPT=${CTARGET_OPT} + fi + + # Lock glibc at -O2; we want to be conservative here. + # -fno-strict-aliasing is to work around #155906. + filter-flags '-O?' + append-flags -O2 -fno-strict-aliasing + + filter-flags '-fstack-protector*' + + # Starting with gcc-6 (and fully upstreamed pie patches) we control + # default enabled/disabled pie via use flags. So nothing to do + # here then. #618160 + if [[ $(gcc-major-version) -lt 6 ]]; then + if use hardened && tc-enables-pie ; then + # Force PIC macro definition for all compilations since they're all + # either -fPIC or -fPIE with the default-PIE compiler. + append-cppflags -DPIC + else + # Don't build -fPIE without the default-PIE compiler and the + # hardened-pie patch + filter-flags -fPIE + fi + fi +} + +want_tls() { + # Archs that can use TLS (Thread Local Storage) + case $(tc-arch) in + x86) + # requires i486 or better #106556 + [[ ${CTARGET} == i[4567]86* ]] && return 0 + return 1 + ;; + esac + return 0 +} + +want__thread() { + want_tls || return 1 + + # For some reason --with-tls --with__thread is causing segfaults on sparc32. + [[ ${PROFILE_ARCH} == "sparc" ]] && return 1 + + [[ -n ${WANT__THREAD} ]] && return ${WANT__THREAD} + + # only test gcc -- can't test linking yet + tc-has-tls -c ${CTARGET} + WANT__THREAD=$? + + return ${WANT__THREAD} +} + +use_multiarch() { + # Make sure binutils is new enough to support indirect functions, + # #336792. This funky sed supports gold and bfd linkers. + local bver nver + bver=$($(tc-getLD ${CTARGET}) -v | sed -n -r '1{s:[^0-9]*::;s:^([0-9.]*).*:\1:;p}') + case $(tc-arch ${CTARGET}) in + amd64|x86) nver="2.20" ;; + arm) nver="2.22" ;; + hppa) nver="2.23" ;; + ppc|ppc64) nver="2.20" ;; + # ifunc support was added in 2.23, but glibc also needs + # machinemode which is in 2.24. + s390) nver="2.24" ;; + sparc) nver="2.21" ;; + *) return 1 ;; + esac + version_is_at_least ${nver} ${bver} +} + +# Setup toolchain variables that had historically been defined in the +# profiles for these archs. +setup_env() { + # silly users + unset LD_RUN_PATH + unset LD_ASSUME_KERNEL + + if is_crosscompile || tc-is-cross-compiler ; then + multilib_env ${CTARGET_OPT:-${CTARGET}} + + if ! use multilib ; then + MULTILIB_ABIS=${DEFAULT_ABI} + else + MULTILIB_ABIS=${MULTILIB_ABIS:-${DEFAULT_ABI}} + fi + + # If the user has CFLAGS_<CTARGET> in their make.conf, use that, + # and fall back on CFLAGS. + local VAR=CFLAGS_${CTARGET//[-.]/_} + CFLAGS=${!VAR-${CFLAGS}} + fi + + setup_flags + + export ABI=${ABI:-${DEFAULT_ABI:-default}} + + local VAR=CFLAGS_${ABI} + # We need to export CFLAGS with abi information in them because glibc's + # configure script checks CFLAGS for some targets (like mips). Keep + # around the original clean value to avoid appending multiple ABIs on + # top of each other. + : ${__GLIBC_CC:=$(tc-getCC ${CTARGET_OPT:-${CTARGET}})} + export __GLIBC_CC CC="${__GLIBC_CC} ${!VAR}" +} + +foreach_abi() { + setup_env + + local ret=0 + local abilist="" + if use multilib ; then + abilist=$(get_install_abis) + else + abilist=${DEFAULT_ABI} + fi + local -x ABI + for ABI in ${abilist:-default} ; do + setup_env + einfo "Running $1 for ABI ${ABI}" + $1 + : $(( ret |= $? )) + done + return ${ret} +} + +glibc_banner() { + local b="Gentoo ${PVR}" + [[ -n ${PATCH_VER} ]] && ! use vanilla && b+=" p${PATCH_VER}" + echo "${b}" +} + +check_devpts() { + # Make sure devpts is mounted correctly for use w/out setuid pt_chown. + + # If merely building the binary package, then there's nothing to verify. + [[ ${MERGE_TYPE} == "buildonly" ]] && return + + # Only sanity check when installing the native glibc. + [[ ${ROOT} != "/" ]] && return + + # If they're opting in to the old suid code, then no need to check. + use suid && return + + if awk '$3 == "devpts" && $4 ~ /[, ]gid=5[, ]/ { exit 1 }' /proc/mounts ; then + eerror "In order to use glibc with USE=-suid, you must make sure that" + eerror "you have devpts mounted at /dev/pts with the gid=5 option." + eerror "Openrc should do this for you, so you should check /etc/fstab" + eerror "and make sure you do not have any invalid settings there." + die "mount & fix your /dev/pts settings" + fi +} + +int_to_KV() { + local version=$1 major minor micro + major=$((version / 65536)) + minor=$(((version % 65536) / 256)) + micro=$((version % 256)) + echo ${major}.${minor}.${micro} +} + +eend_KV() { + [[ $(KV_to_int $1) -ge $(KV_to_int $2) ]] + eend $? +} + +get_kheader_version() { + printf '#include <linux/version.h>\nLINUX_VERSION_CODE\n' | \ + $(tc-getCPP ${CTARGET}) -I "${EPREFIX}/$(alt_build_headers)" - | \ + tail -n 1 +} + +check_nptl_support() { + # We don't care about the compiler here as we aren't using it + just_headers && return + + local run_kv build_kv want_kv + + # TODO: this needs to be replaced somehow + run_kv=$(int_to_KV $(get_KV)) + + build_kv=$(int_to_KV $(get_kheader_version)) + want_kv=${MIN_KERN_VER} + + ebegin "Checking gcc for __thread support" + if ! eend $(want__thread ; echo $?) ; then + echo + eerror "Could not find a gcc that supports the __thread directive!" + eerror "Please update your binutils/gcc and try again." + die "No __thread support in gcc!" + fi + + if ! is_crosscompile && ! tc-is-cross-compiler ; then + # Building fails on an non-supporting kernel + ebegin "Checking kernel version (${run_kv} >= ${want_kv})" + if ! eend_KV ${run_kv} ${want_kv} ; then + echo + eerror "You need a kernel of at least ${want_kv}!" + die "Kernel version too low!" + fi + fi + + ebegin "Checking linux-headers version (${build_kv} >= ${want_kv})" + if ! eend_KV ${build_kv} ${want_kv} ; then + echo + eerror "You need linux-headers of at least ${want_kv}!" + die "linux-headers version too low!" + fi +} + +# # the phases # @@ -124,31 +581,19 @@ pkg_pretend() { [[ ${ROOT} == "/" ]] && \ [[ ${CBUILD} == ${CHOST} ]] && \ [[ ${CHOST} == ${CTARGET} ]] ; then - # The high rev # is to allow people to downgrade between -r# versions. - # We want to block 2.20->2.19, but 2.20-r3->2.20-r2 should be fine. - # Hopefully we never actually use a r# this high. + + # The high rev # is to allow people to downgrade between -r# + # versions. We want to block 2.20->2.19, but 2.20-r3->2.20-r2 + # should be fine. Hopefully we never actually use a r# this + # high. if has_version ">${CATEGORY}/${P}-r10000" ; then eerror "Sanity check to keep you from breaking your system:" - eerror " Downgrading glibc is not supported and a sure way to destruction" - die "Aborting to save your system" - fi - - if ! glibc_run_test '#include <pwd.h>\nint main(){return getpwuid(0)==0;}\n' - then - eerror "Your patched vendor kernel is broken. You need to get an" - eerror "update from whoever is providing the kernel to you." - eerror "https://sourceware.org/bugzilla/show_bug.cgi?id=5227" - eerror "https://bugs.gentoo.org/262698" - die "Keeping your system alive, say thank you" + eerror " Downgrading glibc is not supported and a sure way to destruction." + die "Aborting to save your system." fi - if ! glibc_run_test '#include <unistd.h>\n#include <sys/syscall.h>\nint main(){return syscall(1000)!=-1;}\n' - then - eerror "Your old kernel is broken. You need to update it to" - eerror "a newer version as syscall(<bignum>) will break." - eerror "https://bugs.gentoo.org/279260" - die "Keeping your system alive, say thank you" - fi + # removed check for #262698 since it's about kernel 2.6.18 ... + # removed check for #279260 since it's about kernel <2.6.28 ... fi # Users have had a chance to phase themselves, time to give em the boot @@ -355,7 +800,7 @@ glibc_do_configure() { [[ $(tc-is-softfloat) == "yes" ]] && myconf+=( --without-fp ) - myconf+=( --enable-kernel=${NPTL_KERN_VER} ) + myconf+=( --enable-kernel=${MIN_KERN_VER} ) # Since SELinux support is only required for nscd, only enable it if: # 1. USE selinux @@ -789,6 +1234,23 @@ glibc_headers_install() { dosym usr/include $(alt_prefix)/sys-include } +src_strip() { + # gdb is lame and requires some debugging information to remain in + # libpthread, so we need to strip it by hand. libthread_db makes no + # sense stripped as it is only used when debugging. + local pthread=$(has splitdebug ${FEATURES} && echo "libthread_db" || echo "lib{pthread,thread_db}") + env \ + -uRESTRICT \ + CHOST=${CTARGET} \ + STRIP_MASK="/*/{,tls/}${pthread}*" \ + prepallstrip + # if user has stripping enabled and does not have split debug turned on, + # then leave the debugging sections in libpthread. + if ! has nostrip ${FEATURES} && ! has splitdebug ${FEATURES} ; then + ${STRIP:-${CTARGET}-strip} --strip-debug "${ED}"/*/libpthread-*.so + fi +} + src_install() { if just_headers ; then export ABI=default @@ -800,6 +1262,43 @@ src_install() { src_strip } +# Simple test to make sure our new glibc isn't completely broken. +# Make sure we don't test with statically built binaries since +# they will fail. Also, skip if this glibc is a cross compiler. +# +# If coreutils is built with USE=multicall, some of these files +# will just be wrapper scripts, not actual ELFs we can test. +glibc_sanity_check() { + cd / #228809 + + # We enter ${ED} so to avoid trouble if the path contains + # special characters; for instance if the path contains the + # colon character (:), then the linker will try to split it + # and look for the libraries in an unexpected place. This can + # lead to unsafe code execution if the generated prefix is + # within a world-writable directory. + # (e.g. /var/tmp/portage:${HOSTNAME}) + pushd "${ED}"/$(get_libdir) >/dev/null + + local x striptest + for x in cal date env free ls true uname uptime ; do + x=$(type -p ${x}) + [[ -z ${x} || ${x} != ${EPREFIX}/* ]] && continue + striptest=$(LC_ALL="C" file -L ${x} 2>/dev/null) || continue + case ${striptest} in + *"statically linked"*) continue;; + *"ASCII text"*) continue;; + esac + # We need to clear the locale settings as the upgrade might want + # incompatible locale data. This test is not for verifying that. + LC_ALL=C \ + ./ld-*.so --library-path . ${x} > /dev/null \ + || die "simple run test (${x}) failed" + done + + popd >/dev/null +} + pkg_preinst() { # nothing to do if just installing headers just_headers && return |