Subj : 2 Beware; for I am fearless, and therefore powerful. To : Little Mikey From : Benny Pedersen Date : Sat Aug 04 2018 23:16:56 if ! do_run_test '#include \n#include \nint main(){return syscall(1000)!=-1;}\n' ; then eerror "Your old kernel is broken. You need to update it to a newer" eerror "version as syscall() will break. See bug 279260." die "Old and broken kernel." fi fi # Users have had a chance to phase themselves, time to give em the boot if [[ -e ${EROOT}/etc/locale.gen ]] && [[ -e ${EROOT}/etc/locales.build ]] ; then eerror "You still haven't deleted ${EROOT}/etc/locales.build." eerror "Do so now after making sure ${EROOT}/etc/locale.gen is kosher." die "Lazy upgrader detected" fi if [[ ${CTARGET} == i386-* ]] ; then eerror "i386 CHOSTs are no longer supported." eerror "Chances are you don't actually want/need i386." eerror "Please read https://www.gentoo.org/doc/en/change-chost.xml" die "Please fix your CHOST" fi if [[ -e /proc/xen ]] && [[ $(tc-arch) == "x86" ]] && ! is-flag -mno-tls-direct-seg-refs ; then ewarn "You are using Xen but don't have -mno-tls-direct-seg-refs in your CFLAGS." ewarn "This will result in a 50% performance penalty when running with a 32bit" ewarn "hypervisor, which is probably not what you want." fi use hardened && ! tc-enables-pie && \ ewarn "PIE hardening not applied, as your compiler doesn't default to PIE" # Check for sanity of /etc/nsswitch.conf if [[ -e ${EROOT}/etc/nsswitch.conf ]] ; then local entry for entry in passwd group shadow; do if ! egrep -q "^[ \t]*${entry}:.*files" "${EROOT}"/etc/nsswitch.conf; then eerror "Your ${EROOT}/etc/nsswitch.conf is out of date." eerror "Please make sure you have 'files' entries for" eerror "'passwd:', 'group:' and 'shadow:' databases." eerror "For more details see:" eerror " https://wiki.gentoo.org/wiki/Project:Toolchain/nsswitch.conf_in_glibc-2.26" die "nsswitch.conf has no 'files' provider in '${entry}'." fi done fi # ABI-specific checks follow here. Hey, we have a lot more specific conditions that # we test for... if ! is_crosscompile ; then if use amd64 && use multilib && [[ ${MERGE_TYPE} != "binary" ]] ; then ebegin "Checking that IA32 emulation is enabled in the running kernel" echo 'int main(){return 0;}' > "${T}/check-ia32-emulation.c" local STAT if "${CC-${CHOST}-gcc}" ${CFLAGS_x86} "${T}/check-ia32-emulation.c" -o "${T}/check-ia32-emulation.elf32"; then "${T}/check-ia32-emulation.elf32" STAT=$? else # Don't fail here to allow single->multi ABI switch # or recover from breakage like bug #646424 ewarn "Failed to compile the ABI test. Broken host glibc?" STAT=0 fi rm -f "${T}/check-ia32-emulation.elf32" eend $STAT [[ $STAT -eq 0 ]] || die "CONFIG_IA32_EMULATION must be enabled in the kernel to compile a multilib glibc." fi fi # When we actually have to compile something... if ! just_headers ; then 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 [[ ${CTARGET} == *-linux* ]] ; then local run_kv build_kv want_kv run_kv=$(g_get_running_KV) build_kv=$(g_int_to_KV $(get_kheader_version)) want_kv=${MIN_KERN_VER} if ! is_crosscompile && ! tc-is-cross-compiler ; then # Building fails on an non-supporting kernel ebegin "Checking running 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 fi fi } # # the phases # # pkg_pretend pkg_pretend() { # All the checks... einfo "Checking general environment sanity." sanity_prechecks } # src_unpack src_unpack() { # Consistency is not guaranteed between pkg_ and src_ ... sanity_prechecks use multilib && unpack gcc-multilib-bootstrap-${GCC_BOOTSTRAP_VER}.tar.xz setup_env if [[ -n ${EGIT_REPO_URI} ]] ; then git-r3_src_unpack else unpack ${P}.tar.xz fi cd "${S}" || die touch locale/C-translit.h || die #185476 #218003 cd "${WORKDIR}" || die unpack glibc-${RELEASE_VER}-patches-${PATCH_VER}.tar.bz2 } src_prepare() { if ! use vanilla ; then elog "Applying Gentoo Glibc Patchset ${RELEASE_VER}-${PATCH_VER}" eapply "${WORKDIR}"/patches einfo "Done." fi default gnuconfig_update cd "${WORKDIR}" find . -name configure -exec touch {} + eprefixify extra/locale/locale-gen # Fix permissions on some of the scripts. chmod u+x "${S}"/scripts/*.sh cd "${S}" } glibc_do_configure() { # Glibc does not work with gold (for various reasons) #269274. tc-ld-disable-gold # CXX isnt handled by the multilib system, so if we dont unset here # we accumulate crap across abis unset CXX einfo "Configuring glibc for nptl" if use doc ; then export MAKEINFO=makeinfo else export MAKEINFO=/dev/null fi local v for v in ABI CBUILD CHOST CTARGET CBUILD_OPT CTARGET_OPT CC CXX LD {AS,C,CPP,CXX,LD}FLAGS MAKEINFO ; do einfo " $(printf '%15s' ${v}:) ${!v}" done # CFLAGS can contain ABI-specific flags like -mfpu=neon, see bug #657760 # To build .S (assembly) files with the same ABI-specific flags # upstream currently recommends adding CFLAGS to CC/CXX: # https://sourceware.org/PR23273 # Note: Passing CFLAGS via CPPFLAGS overrides glibc's arch-specific CFLAGS # and breaks multiarch support. See 659030#c3 for an example. # The glibc configure script doesn't properly use LDFLAGS all the time. export CC="$(tc-getCC ${CTARGET}) ${CFLAGS} ${LDFLAGS}" einfo " $(printf '%15s' 'Manual CC:') ${CC}" # Some of the tests are written in C++, so we need to force our multlib abis in, bug 623548 export CXX="$(tc-getCXX ${CTARGET}) $(get_abi_CFLAGS) ${CFLAGS}" einfo " $(printf '%15s' 'Manual CXX:') ${CXX}" echo local myconf=() case ${CTARGET} in powerpc-*) # Currently gcc on powerpc32 generates invalid code for # __builtin_return_address(0) calls. Normally programs # don't do that but malloc hooks in glibc do: # https://gcc.gnu.org/PR81996 # https://bugs.gentoo.org/629054 myconf+=( --enable-stack-protector=no ) ;; *) myconf+=( --enable-stack-protector=all ) ;; esac myconf+=( --enable-stackguard-randomization ) # Keep a whitelist of targets supporing IFUNC. glibc's ./configure # is not robust enough to detect proper support: # https://bugs.gentoo.org/641216 # https://sourceware.org/PR22634#c0 case $(tc-arch ${CTARGET}) in # Keep whitelist of targets where autodetection mostly works. amd64|x86|sparc|ppc|ppc64|arm|arm64|s390) ;; # Blacklist everywhere else *) myconf+=( libc_cv_ld_gnu_indirect_function=no ) ;; esac # Enable Intel Control-flow Enforcement Technology on amd64 if requested case ${CTARGET} in x86_64-*) myconf+=( $(use_enable cet) ) ;; *) ;; esac [[ $(tc-is-softfloat) == "yes" ]] && myconf+=( --without-fp ) myconf+=( --enable-kernel=${MIN_KERN_VER} ) # Since SELinux support is only required for nscd, only enable it if: # 1. USE selinux # 2. only for the primary ABI on multilib systems # 3. Not a crosscompile if ! is_crosscompile && use selinux ; then if use multilib ; then if is_final_abi ; then myconf+=( --with-selinux ) else myconf+=( --without-selinux ) fi else myconf+=( --with-selinux ) fi else myconf+=( --without-selinux ) fi # Force a few tests where we always know the answer but # configure is incapable of finding it. if is_crosscompile ; then export \ libc_cv_c_cleanup=yes \ libc_cv_forced_unwind=yes fi myconf+=( --without-cvs --disable-werror --enable-bind-now --build=${CBUILD_OPT:-${CBUILD}} --host=${CTARGET_OPT:-${CTARGET}} $(use_enable profile) $(use_with gd) --with-headers=$(alt_build_headers) --prefix="${EPREFIX}/usr" --sysconfdir="${EPREFIX}/etc" --localstatedir="${EPREFIX}/var" --libdir='$(prefix)'/$(get_libdir) --mandir='$(prefix)'/share/man --infodir='$(prefix)'/share/info --libexecdir='$(libdir)'/misc/glibc --with-bugurl=https://bugs.gentoo.org/ --with-pkgversion="$(glibc_banner)" $(use_multiarch || echo --disable-multi-arch) $(use_enable systemtap) $(use_enable nscd) ${EXTRA_ECONF} ) # We rely on sys-libs/timezone-data for timezone tools normally. myconf+=( $(use_enable vanilla timezone-tools) ) # These libs don't have configure flags. ac_cv_lib_audit_audit_log_user_avc_message=$(usex audit || echo no) ac_cv_lib_cap_cap_init=$(usex caps || echo no) # There is no configure option for this and we need to export it # since the glibc build will re-run configure on itself export libc_cv_rootsbindir="${EPREFIX}/sbin" export libc_cv_slibdir="${EPREFIX}/$(get_libdir)" # We take care of patching our binutils to use both hash styles, # and many people like to force gnu hash style only, so disable # this overriding check. #347761 export libc_cv_hashstyle=no local builddir=$(builddir nptl) mkdir -p "${builddir}" cd "${builddir}" set -- "${S}"/configure "${myconf[@]}" echo "$@" "$@" || die "failed to configure glibc" # ia64 static cross-compilers are a pita in so much that they # can't produce static ELFs (as the libgcc.a is broken). so # disable building of the programs for those targets if it # doesn't work. # XXX: We could turn this into a compiler test, but ia64 is # the only one that matters, so this should be fine for now. if is_crosscompile && [[ ${CTARGET} == ia64* ]] ; then sed -i '1i+link-static = touch $@' config.make fi # If we're trying to migrate between ABI sets, we need # to lie and use a local copy of gcc. Like if the system # is built with MULTILIB_ABIS="amd64 x86" but we want to # add x32 to it, gcc/glibc don't yet support x32. # if [[ -n ${GCC_BOOTSTRAP_VER} ]] && use multilib ; then echo 'main(){}' > "${T}"/test.c if ! $(tc-getCC ${CTARGET}) ${CFLAGS} ${LDFLAGS} "${T}"/test.c -Wl,-emain -lgcc 2>/dev/null ; then sed -i -e '/^CC = /s:$: -B$(objdir)/../'"gcc-multilib-bootstrap-${GCC_BOOTSTRAP_VER}/${ABI}:" config.make || die fi fi } glibc_headers_configure() { export ABI=default local builddir=$(builddir "headers") mkdir -p "${builddir}" cd "${builddir}" # if we don't have a compiler yet, we can't really test it now ... # hopefully they don't affect header generation, so let's hope for # the best here ... local v vars=( ac_cv_header_cpuid_h=yes libc_cv_{386,390,alpha,arm,hppa,ia64,mips,{powerpc,sparc}{,32,64},sh,x86_64}_tls=yes libc_cv_asm_cfi_directives=yes libc_cv_broken_visibility_attribute=no libc_cv_c_cleanup=yes libc_cv_compiler_powerpc64le_binary128_ok=yes libc_cv_forced_unwind=yes libc_cv_gcc___thread=yes libc_cv_mlong_double_128=yes libc_cv_mlong_double_128ibm=yes libc_cv_ppc_machine=yes libc_cv_ppc_rel16=yes libc_cv_predef_fortify_source=no libc_cv_target_power8_ok=yes libc_cv_visibility_attribute=yes libc_cv_z_combreloc=yes libc_cv_z_execstack=yes libc_cv_z_initfirst=yes libc_cv_z_nodelete=yes libc_cv_z_nodlopen=yes libc_cv_z_relro=yes libc_mips_abi=${ABI} libc_mips_float=$([[ $(tc-is-softfloat) == "yes" ]] && echo soft || echo hard) # These libs don't have configure flags. ac_cv_lib_audit_audit_log_user_avc_message=no ac_cv_lib_cap_cap_init=no ) einfo "Forcing cached settings:" for v in "${vars[@]}" ; do einfo " ${v}" export ${v} done local headers_only_arch_CPPFLAGS=() # Blow away some random CC settings that screw things up. #550192 if [[ -d ${S}/sysdeps/mips ]]; then pushd "${S}"/sysdeps/mips >/dev/null sed -i -e '/^CC +=/s:=.*:= -D_MIPS_SZPTR=32:' mips32/Makefile mips64/n32/Makefile || die sed -i -e '/^CC +=/s:=.*:= -D_MIPS_SZPTR=64:' mips64/n64/Makefile || die # Force the mips ABI to the default. This is OK because the set of # installed headers in this phase is the same between the 3 ABIs. # If this ever changes, this hack will break, but that's unlikely # as glibc discourages that behavior. # https://crbug.com/647033 sed -i -e 's:abiflag=.*:abiflag=_ABIO32:' preconfigure || die popd >/dev/null fi case ${CTARGET} in riscv*) # RISC-V interrogates the compiler to determine which target to # build. If building the headers then we don't strictly need a # RISC-V compiler, so the built-in definitions that are provided # along with all RISC-V compiler might not exist. This causes # glibc's RISC-V preconfigure script to blow up. Since we're just # building the headers any value will actually work here, so just # pick the standard one (rv64g/lp64d) to make the build scripts # happy for now -- the headers are all the same anyway so it # doesn't matter. headers_only_arch_CPPFLAGS+=( -D__riscv_xlen=64 -D__riscv_flen=64 -D__riscv_float_abi_double=1 -D__riscv_atomic=1 ) ;; esac local myconf=() myconf+=( --disable-sanity-checks --enable-hacker-mode --without-cvs --disable-werror --enable-bind-now --build=${CBUILD_OPT:-${CBUILD}} --host=${CTARGET_OPT:-${CTARGET}} --with-headers=$(alt_build_headers) --prefix="${EPREFIX}/usr" ${EXTRA_ECONF} ) # Nothing is compiled here which would affect the headers for the target. # So forcing CC/CFLAGS is sane. local headers_only_CC=$(tc-getBUILD_CC) local headers_only_CFLAGS="-O1 -pipe" local headers_only_CPPFLAGS="-U_FORTIFY_SOURCE ${headers_only_arch_CPPFLAGS[*]}" local headers_only_LDFLAGS="" set -- "${S}"/configure "${myconf[@]}" echo \ "CC=${headers_only_CC}" \ "CFLAGS=${headers_only_CFLAGS}" \ "CPPFLAGS=${headers_only_CPPFLAGS}" \ "LDFLAGS=${headers_only_LDFLAGS}" \ "$@" CC=${headers_only_CC} \ CFLAGS=${headers_only_CFLAGS} \ CPPFLAGS=${headers_only_CPPFLAGS} \ LDFLAGS="" \ "$@" || die "failed to configure glibc" } do_src_configure() { if just_headers ; then glibc_headers_configure else glibc_do_configure nptl fi } src_configure() { foreach_abi do_src_configure } do_src_compile() { emake -C "$(builddir nptl)" || die "make nptl for ${ABI} failed" } src_compile() { if just_headers ; then return fi foreach_abi do_src_compile } glibc_src_test() { cd "$(builddir nptl)" emake check } do_src_test() { local ret=0 glibc_src_test : $(( ret |= $? )) return ${ret} } src_test() { if just_headers ; then return fi # Give tests more time to complete. export TIMEOUTFACTOR=5 foreach_abi do_src_test || die "tests failed" } run_locale_gen() { # if the host locales.gen contains no entries, we'll install everything local root="$1" local locale_list="${root}/etc/locale.gen" if [[ -z $(locale-gen --list --config "${locale_list}") ]] ; then ewarn "Generating all locales; edit /etc/locale.gen to save time/space" locale_list="${root}/usr/share/i18n/SUPPORTED" fi locale-gen --jobs $(makeopts_jobs) --config "${locale_list}" \ --destdir "${root}" } glibc_do_src_install() { local builddir=$(builddir nptl) cd "${builddir}" emake install_root="${D}$(alt_prefix)" install || die # This version (2.26) provides some compatibility libraries for the NIS/NIS+ support # which come without headers etc. Only needed for binary packages since the # external net-libs/libnsl has increased soversion. Keep only versioned libraries. find "${D}" -name "libnsl.a" -delete find "${D}" -name "libnsl.so" -delete # Normally upstream_pv is ${PV}. Live ebuilds are exception, there we need # to infer upstream version: # '#define VERSION "2.26.90"' -> '2.26.90' local upstream_pv=$(sed -n -r 's/#define VERSION "(.*)"/\1/p' "${S}"/version.h) if [[ -e ${ED}$(alt_usrlibdir)/libm-${upstream_pv}.a ]] ; then # Move versioned .a file out of libdir to evade portage QA checks # instead of using gen_usr_ldscript(). We fix ldscript as: # "GROUP ( /usr/lib64/libm-.a ..." -> "GROUP ( /usr/lib64/glibc-/libm-.a ..." sed -i "s@\(libm-${upstream_pv}.a\)@${P}/\1@" "${ED}"$(alt_usrlibdir)/libm.a || die dodir $(alt_usrlibdir)/${P} mv "${ED}"$(alt_usrlibdir)/libm-${upstream_pv}.a "${ED}"$(alt_usrlibdir)/${P}/libm-${upstream_pv}.a || die fi # We'll take care of the cache ourselves rm -f "${ED}"/etc/ld.so.cache # Everything past this point just needs to be done once ... is_final_abi || return 0 # Make sure the non-native interp can be found on multilib systems even # if the main library set isn't installed into the right place. Maybe # we should query the active gcc for info instead of hardcoding it ? local i ldso_abi ldso_name local ldso_abi_list=( # x86 amd64 /lib64/ld-linux-x86-64.so.2 x32 /libx32/ld-linux-x32.so.2 x86 /lib/ld-linux.so.2 # mips o32 /lib/ld.so.1 n32 /lib32/ld.so.1 n64 /lib64/ld.so.1 # powerpc ppc /lib/ld.so.1 ppc64 /lib64/ld64.so.1 # s390 s390 /lib/ld.so.1 s390x /lib/ld64.so.1 # sparc sparc32 /lib/ld-linux.so.2 sparc64 /lib64/ld-linux.so.2 ) case $(tc-endian) in little) ldso_abi_list+=( # arm arm64 /lib/ld-linux-aarch64.so.1 ) ;; big) ldso_abi_list+=( # arm arm64 /lib/ld-linux-aarch64_be.so.1 ) ;; esac if [[ ${SYMLINK_LIB} == "yes" ]] && [[ ! -e ${ED}/$(alt_prefix)/lib ]] ; then dosym $(get_abi_LIBDIR ${DEFAULT_ABI}) $(alt_prefix)/lib fi for (( i = 0; i < ${#ldso_abi_list[@]}; i += 2 )) ; do ldso_abi=${ldso_abi_list[i]} has ${ldso_abi} $(get_install_abis) || continue ldso_name="$(alt_prefix)${ldso_abi_list[i+1]}" if [[ ! -L ${ED}/${ldso_name} && ! -e ${ED}/${ldso_name} ]] ; then dosym ../$(get_abi_LIBDIR ${ldso_abi})/${ldso_name##*/} ${ldso_name} fi done # With devpts under Linux mounted properly, we do not need the pt_chown # binary to be setuid. This is because the default owners/perms will be # exactly what we want. if ! use suid ; then find "${ED}" -name pt_chown -exec chmod -s {} + fi ################################################################# # EVERYTHING AFTER THIS POINT IS FOR NATIVE GLIBC INSTALLS ONLY # --- Msged/LNX 6.1.2 (Linux/4.17.12-gentoo (x86_64)) * Origin: I will always keep a PC running CPM 3.0 (2:230/0) .