diff options
Diffstat (limited to 'strata/build-essential')
-rw-r--r-- | strata/build-essential/glibc.morph | 4 | ||||
-rw-r--r-- | strata/build-essential/stage2-glibc.morph | 38 |
2 files changed, 38 insertions, 4 deletions
diff --git a/strata/build-essential/glibc.morph b/strata/build-essential/glibc.morph index 3b80452a..73c518cf 100644 --- a/strata/build-essential/glibc.morph +++ b/strata/build-essential/glibc.morph @@ -55,7 +55,7 @@ configure-commands: $ARCH_FLAGS \ --prefix="$PREFIX" \ --disable-profile \ - --enable-kernel=2.6.25 \ + --enable-kernel=3.0.0 \ --without-cvs \ --without-selinux \ --enable-obsolete-rpc @@ -89,5 +89,3 @@ install-commands: include /etc/ld.so.conf.d/*.conf EOF - install -m 644 -o root -g root ld.so.conf "$DESTDIR/etc/ld.so.conf" -- case "$MORPH_ARCH" in armv7*hf*) ln -s ld-2.20.so "$DESTDIR/lib/ld-linux.so.3" ;; - esac diff --git a/strata/build-essential/stage2-glibc.morph b/strata/build-essential/stage2-glibc.morph index 9ca0d4c1..d951f0c5 100644 --- a/strata/build-essential/stage2-glibc.morph +++ b/strata/build-essential/stage2-glibc.morph @@ -31,7 +31,41 @@ install-commands: include /etc/ld.so.conf.d/*.conf EOF - install -m 644 -o root -g root ld.so.conf "$DESTDIR/etc/ld.so.conf" -- sh stage2-glibc-fix-specs +- | + # Fix up GCC to handle the sysroot containing glibc being in a different + # location for each chunk build. + # + # For headers, it's enough to pass -B in the CPPFLAGS. This would work for + # the startup files (crt*.o) as well, except where libtool is involved (in + # which case it strips -B out of your LDFLAGS before calling GCC). We get + # around this by making GCC locate them relative to the environment variable + # STAGE2_SYSROOT, which we can then set along with CPPFLAGS in each stage 2 + # chunk build. + # + # We also force the use of the program loader at PREFIX/lib/ld.so instead + # of its usual home in /lib or /lib64, which is necessary for the output of + # stage 2 to work as a chroot when building stage 3. + + sysroot="$(dirname "$(pwd)")" + specs_dir="$(dirname $($TARGET_STAGE1-gcc --print-libgcc-file-name))" + target_specs_dir="$DESTDIR/${specs_dir#$sysroot}" + mkdir -p "$target_specs_dir" + + $TARGET_STAGE1-gcc -dumpspecs | + sed -e "s@[gMS]\?crt[1in].o%s@%:getenv(STAGE2_SYSROOT $PREFIX/lib/&)@g" \ + -e "s@/lib\(64\)\?/ld@$PREFIX/lib/ld@g" \ + > "$target_specs_dir/specs-for-sysroot" + + # NASTY HACK # + # We create a symlink to the actual specs here, so that later the + # symlink can be replaced with a dangling link. + # + # This is necessary as we need to have gcc use its internal specs, + # which can differ to the specs generated by `gcc -dumpspecs`. + # + # The dangling symlink will not make it onto the final system, just + # like all other bootstrap only components. + ln -s specs-for-sysroot "$target_specs_dir/specs" - install -d $DESTDIR/lib - | cpu=$(echo $TARGET | cut -d '-' -f 1) @@ -46,5 +80,7 @@ install-commands: "$DESTDIR/lib64/ld64.so.1" ;; *) loader=$(basename $(ls "$DESTDIR$PREFIX"/lib/ld-linux*)) + [ -z $loader ] && loader=$(basename $(ls "$DESTDIR$PREFIX"/lib/ld.so*)) + [ -z $loader ] && ( echo "Bug in stage2-glibc ld.so symlinks" ; exit 1 ) ln -s "$PREFIX/lib/$loader" "$DESTDIR/lib/$loader" esac |