diff --git a/bootloader/build_multi_image.sh b/bootloader/build_multi_image.sh
index 94a3b46b12b2ead338da2d14794ff19cc4c08278..15212e4350d7f16d1277b25b287eeb35182c9f26 100755
--- a/bootloader/build_multi_image.sh
+++ b/bootloader/build_multi_image.sh
@@ -6,8 +6,8 @@ BIN1="$2"
 BIN2="$3"
 BINOUT="$4"
 
-dd if=/dev/zero ibs=1k count=448 2>/dev/null | tr "\000" "\377" > "$BINOUT"
+dd if=/dev/zero ibs=1k count=448 2>/dev/null | LANG=C tr "\000" "\377" > "$BINOUT"
 dd if="$BIN1" of="$BINOUT" conv=notrunc 2>/dev/null
-dd if="$BIN2" of="$BINOUT" conv=notrunc oflag=append 2>/dev/null
+dd if="$BIN2" >> "$BINOUT" 2>/dev/null
 
 "$PYTHON" "$(dirname "$0")/crc_patch.py" "$BINOUT"
diff --git a/lib/micropython/gen-qstr.sh b/lib/micropython/gen-qstr.sh
index cd44b4287b3011b751f2c2d9edbce5caf06997b0..5f44d64965652bcb205b667e0fbbdda2c0366b22 100755
--- a/lib/micropython/gen-qstr.sh
+++ b/lib/micropython/gen-qstr.sh
@@ -12,7 +12,7 @@ shift 5
 OUTPUT_DIR="$(dirname "$OUTPUT")"
 
 mkdir -p "$OUTPUT_DIR/genhdr"
-ln -sfr "$OUTPUT" "$OUTPUT_DIR/genhdr/$(basename "$OUTPUT")"
+ln -sf "$(realpath --relative-to="$OUTPUT_DIR/genhdr" "$OUTPUT")" "$OUTPUT_DIR/genhdr/$(basename "$OUTPUT")"
 
 # call gcc -E to generate qstr.i.last
 gcc -E -DNO_QSTR -I"$SOURCE_DIR/micropython" -I"$PROJECT_SRC" -I"$OUTPUT_DIR" "$@" >"$OUTPUT_DIR/qstr.i.last"
diff --git a/lib/micropython/gen-version.sh b/lib/micropython/gen-version.sh
index 1afe401e5dd8cb479a3dc3e09da8315bad3dac0f..8f73d94243f0fb79baca5f3614fe6ed5c7ae7d46 100755
--- a/lib/micropython/gen-version.sh
+++ b/lib/micropython/gen-version.sh
@@ -7,7 +7,7 @@ OUT="$(realpath "$3")"
 OUTDIR="$(dirname "$OUT")"
 
 mkdir -p "$OUTDIR/genhdr"
-ln -sfr "$OUT" "$OUTDIR/genhdr/$(basename "$OUT")"
+ln -sf "$(realpath --relative-to="$OUTDIR/genhdr" "$3")" "$OUTDIR/genhdr/$(basename "$OUT")"
 
 cd "$2/micropython"
 "$1" "$2/micropython/py/makeversionhdr.py" "$OUT" >/dev/null