58 lines
1.9 KiB
Bash
58 lines
1.9 KiB
Bash
|
$src/libexec/ld-elf.so.1 $src/bin/mkdir $out
|
||
|
$src/libexec/ld-elf.so.1 $src/bin/tar -I "$src/libexec/ld-elf.so.1 $src/bin/xz" -C $out -xf $bootstrapTools
|
||
|
export LD_LIBRARY_PATH=$out/lib
|
||
|
|
||
|
BADLIST=ld-elf.so.1
|
||
|
|
||
|
oobpatch() {
|
||
|
$out/libexec/ld-elf.so.1 $src/bin/cp $1 ./tmp
|
||
|
$out/libexec/ld-elf.so.1 $out/bin/patchelf --set-rpath $out/lib --set-interpreter $out/libexec/ld-elf.so.1 ./tmp
|
||
|
$out/libexec/ld-elf.so.1 $src/bin/mv ./tmp $1
|
||
|
BADLIST="$BADLIST|${1##*/}"
|
||
|
}
|
||
|
|
||
|
oobpatch $out/bin/patchelf
|
||
|
oobpatch $out/lib/libthr.so.3
|
||
|
oobpatch $out/lib/libc.so.7
|
||
|
|
||
|
for f in $($out/libexec/ld-elf.so.1 $out/bin/find $out/lib -type f); do
|
||
|
$out/libexec/ld-elf.so.1 $out/bin/grep -E "$BADLIST" <<<"$f" && continue
|
||
|
$out/libexec/ld-elf.so.1 $out/bin/patchelf --set-rpath $out/lib $f
|
||
|
done
|
||
|
for f in $out/bin/* $out/bin/.*; do
|
||
|
$out/libexec/ld-elf.so.1 $out/bin/grep -E "$BADLIST" <<<"$f" &>/dev/null && continue
|
||
|
$out/libexec/ld-elf.so.1 $out/bin/patchelf --set-rpath $out/lib --set-interpreter $out/libexec/ld-elf.so.1 $f
|
||
|
done
|
||
|
|
||
|
unset LD_LIBRARY_PATH
|
||
|
export PATH=$out/bin
|
||
|
|
||
|
# sanity check
|
||
|
$out/bin/true || exit 1
|
||
|
|
||
|
# meticulously replace every nix store path with the right one
|
||
|
# to work with binaries, make sure the path remains the same length by prefixing pathsep chars
|
||
|
for f in $(find $out -type f); do
|
||
|
while true; do
|
||
|
BADMAN="$(strings $f | grep -o '/nix/store/.*' | grep -v "$out" | head -n1)"
|
||
|
if [ -z "$BADMAN" ]; then
|
||
|
break
|
||
|
fi
|
||
|
echo scorch $f
|
||
|
BADMAN="$(echo "$BADMAN" | cut -d/ -f-4)"
|
||
|
GOODMAN="$out"
|
||
|
if [ ${#GOODMAN} -gt ${#BADMAN} ]; then
|
||
|
echo "Can't patch $f: $BADMAN too short"
|
||
|
break
|
||
|
fi
|
||
|
while ! [ ${#GOODMAN} -eq ${#BADMAN} ]; do
|
||
|
GOODMAN="/$GOODMAN"
|
||
|
done
|
||
|
if ! sed -E -i -e "s@$BADMAN@$GOODMAN@g" $f; then
|
||
|
echo "Can't patch $f: sed failed"
|
||
|
break
|
||
|
fi
|
||
|
done
|
||
|
done
|
||
|
echo $out
|