From 00d00db73cccc9f25470b5d662eeed9e9d257186 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=90o=C3=A0n=20Tr=E1=BA=A7n=20C=C3=B4ng=20Danh?= Date: Thu, 20 Aug 2020 20:24:52 +0700 Subject: [PATCH 1/5] glibc: fix bootstrap with gcc -fcf-protection Some distros ship gcc that implicitly enables the "-fcf-protection". In additional, some _paranoid-and-wanna-build_ people add: XBPS_CFLAGS=-fcf-protection XBPS_CPPFLAGS=-fcf-protection into "etc/conf". Upstream glibc does not do that, so the glibc configure logic is not prepared for that for glibc 2.30. Hence, bootstrapping glibc on such system will result in error: elf/ld.so.new: hidden symbol `_dl_cet_open_check' isn't defined We must --enable-cet to fix it in such case. Future glibc will --enable-cet automatically if -fcf-protection. Reference: 1: https://stackoverflow.com/a/59006638 2: https://sourceware.org/bugzilla/show_bug.cgi?id=25225 --- srcpkgs/glibc/template | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/srcpkgs/glibc/template b/srcpkgs/glibc/template index 4ea327aa1fa..250e31e38b3 100644 --- a/srcpkgs/glibc/template +++ b/srcpkgs/glibc/template @@ -57,6 +57,20 @@ lib32symlinks="ld-linux.so.2" archs="~*-musl" nopie=yes +_fcf_protection_on() { + # https://gcc.gnu.org/onlinedocs/gcc/Instrumentation-Options.html + ( + cd $XBPS_STATEDIR + cat >fcf-protection-test.c <<-_EOF + #ifndef __CET__ + #error __no__ + #endif + int main() {} + _EOF + $CC -o fcf-protection-test $CFLAGS $CPPFLAGS fcf-protection-test.c + ) +} + do_configure() { mkdir build cd build @@ -88,8 +102,13 @@ do_configure() { configure_args+=" --host=${XBPS_CROSS_TRIPLET}" configure_args+=" --with-sysroot=${XBPS_CROSS_BASE}" configure_args+=" --with-headers=${XBPS_CROSS_BASE}/usr/include" - else + elif [ ! "$CHROOT_READY" ]; then + CPPFLAGS+=" -isystem ${XBPS_MASTERDIR}/usr/include" configure_args+=" --with-headers=${XBPS_MASTERDIR}/usr/include" + if _fcf_protection_on; then + # TODO: remove when upgrade to newer version + configure_args+=" --enable-cet" + fi fi # Disable SSP from CFLAGS (enabled below) From 5fc4d42f34cc7dbb7c42bdce6051544cc6d65fdc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=90o=C3=A0n=20Tr=E1=BA=A7n=20C=C3=B4ng=20Danh?= Date: Mon, 24 Aug 2020 19:51:23 +0700 Subject: [PATCH 2/5] xbps-src: bootstrap: add libc's development files into makedepends On source bootstrapping, libc's development files haven't been installed into $XBPS_MASTERDIR yet. Hence, compiler and linker will work with bootstrap host's files instead of our files. The symptom can be seen easier on either system that don't have libc's development files installed, or on Ubuntu (or Debian-derivatives), where libc's developments not installed into "/usr/lib". Fix this by adding new build-helper for bootstrap packages, which will add libc's development files into "makedepends" when bootstrapping. --- common/build-helper/bootstrap.sh | 7 +++++++ common/xbps-src/shutils/common.sh | 4 ++++ 2 files changed, 11 insertions(+) create mode 100644 common/build-helper/bootstrap.sh diff --git a/common/build-helper/bootstrap.sh b/common/build-helper/bootstrap.sh new file mode 100644 index 00000000000..c4e7175e640 --- /dev/null +++ b/common/build-helper/bootstrap.sh @@ -0,0 +1,7 @@ +if [ ! "$CHROOT_READY" ]; then + case "$sourcepkg,$XBPS_TARGET_LIBC" in + kernel-libc-headers,*|glibc,*|musl,*) ;; + *,musl) makedepends+=" musl-devel" ;; + *,*) makedepends+=" glibc-devel" ;; + esac +fi diff --git a/common/xbps-src/shutils/common.sh b/common/xbps-src/shutils/common.sh index e8bcf577c6b..4096378cb7a 100644 --- a/common/xbps-src/shutils/common.sh +++ b/common/xbps-src/shutils/common.sh @@ -649,6 +649,10 @@ setup_pkg() { source_file $XBPS_COMMONDIR/environment/build-style/${build_style}.sh + # Need libc-devel on bootstrap since base-chroot not installed + if [ "$bootstrap" ]; then + . $XBPS_BUILDHELPERDIR/bootstrap.sh + fi # Source all build-helper files that are defined for f in $build_helper; do if [ ! -r $XBPS_BUILDHELPERDIR/${f}.sh ]; then From 4920e090138ba023e61a1de8089dd6ecbda01b74 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=90o=C3=A0n=20Tr=E1=BA=A7n=20C=C3=B4ng=20Danh?= Date: Mon, 24 Aug 2020 20:49:22 +0700 Subject: [PATCH 3/5] xbps-src: bootstrap: link with our newly built libc On source bootstrapping, without --sysroot, ld will find dynamic linker in "/usr/lib" instead of "$XBPS_MASTERDIR/usr/lib". The sympton can be seen when bootstrap from Ubuntu 20.04 amd64, where host's dynamic linker is located in "/lib/x86_64-linux-gnu/" and symlinked to "/lib64". Pass "--sysroot" to "ld". --- common/environment/configure/bootstrap.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/common/environment/configure/bootstrap.sh b/common/environment/configure/bootstrap.sh index f5ba5f442c7..4598a6e1496 100644 --- a/common/environment/configure/bootstrap.sh +++ b/common/environment/configure/bootstrap.sh @@ -1,4 +1,5 @@ if [ -z "$CHROOT_READY" ]; then CFLAGS+=" -isystem ${XBPS_MASTERDIR}/usr/include" LDFLAGS+=" -L${XBPS_MASTERDIR}/usr/lib -Wl,-rpath-link=${XBPS_MASTERDIR}/usr/lib" + LDFLAGS+=" -Wl,--sysroot=${XBPS_MASTERDIR}" fi From c4bb9703bfc03257378235ed20a2cfa106356470 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=90o=C3=A0n=20Tr=E1=BA=A7n=20C=C3=B4ng=20Danh?= Date: Mon, 24 Aug 2020 21:14:41 +0700 Subject: [PATCH 4/5] gcc: only change LD_LIBRARY_PATH if applicable There're cases that host's libc is newer than our libc, thus, anything linked with host's libc doesn't work with our libraries. Check if LD_LIBRARY_PATH works before attempt to export. --- srcpkgs/gcc/template | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/srcpkgs/gcc/template b/srcpkgs/gcc/template index ead6f05a498..a0bcb2f1961 100644 --- a/srcpkgs/gcc/template +++ b/srcpkgs/gcc/template @@ -145,6 +145,14 @@ if [ "$CROSS_BUILD" ]; then fi fi +_setup_ld_library_path() { + local _llp="${XBPS_MASTERDIR}/usr/lib${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}" + if LD_LIBRARY_PATH="$_llp" sh -c true + then + export LD_LIBRARY_PATH="$_llp" + fi +} + post_extract() { mkdir -p ${wrksrc}/{gmp,mpfr,mpc,isl} cp -ar ${XBPS_BUILDDIR}/gmp-${_gmp_version}/* ${wrksrc}/gmp/ @@ -240,7 +248,7 @@ do_configure() { _args+=" --enable-sjlj-exceptions=no" _langs+=",objc,obj-c++,fortran" elif [ -z "$CHROOT_READY" ]; then - export LD_LIBRARY_PATH="${XBPS_MASTERDIR}/usr/lib" + _setup_ld_library_path _args+=" --build=${_triplet}" else _langs="c,c++,objc,obj-c++,fortran,lto" @@ -324,7 +332,7 @@ do_configure() { } do_build() { if [ -z "$CHROOT_READY" ]; then - export LD_LIBRARY_PATH="${XBPS_MASTERDIR}/usr/lib" + _setup_ld_library_path fi cd build if [ "$build_option_gnatboot" ]; then From f48c94727461c07e0bc4ddfb5afef5cbf5d2076f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=90o=C3=A0n=20Tr=E1=BA=A7n=20C=C3=B4ng=20Danh?= Date: Mon, 24 Aug 2020 21:06:57 +0700 Subject: [PATCH 5/5] m4: disable makeinfo unconditionally on bootstrap --- srcpkgs/m4/template | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/srcpkgs/m4/template b/srcpkgs/m4/template index 111dc6a6b07..6db163696da 100644 --- a/srcpkgs/m4/template +++ b/srcpkgs/m4/template @@ -14,6 +14,11 @@ maintainer="Enno Boland " distfiles="${GNU_SITE}/${pkgname}/${pkgname}-${version}.tar.xz" checksum=f2c1e86ca0a404ff281631bdc8377638992744b175afb806e25871a24a934e07 +# Ubuntu 20.04 makeinfo breaks the build with ISO-8859-1 characters +if [ ! "$CHROOT_READY" ]; then + export MAKEINFO=true +fi + pre_check() { case "$XBPS_TARGET_MACHINE" in *-musl* )