mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-25 08:21:14 +00:00
3e16ed3063
mtools recursive copy (mcopy -s ...) is using READDIR(3) to iterate over the directory entries, hence they end up in the FAT filesystem in traversal order which breaks reproducibility (rather than being added to the FAT filesystem in a reproducible order). Implement recursive copy in gen_image_generic.sh in Shell code instead, as in that way we can force files to be copied in reproducible order. Fixes:aece8f5ae8
("scripts/gen_image_generic.sh: generate reproducible EFI filesystem") Signed-off-by: Daniel Golle <daniel@makrotopia.org> (cherry picked from commit4d289ae7e6
)
59 lines
1.8 KiB
Bash
Executable File
59 lines
1.8 KiB
Bash
Executable File
#!/bin/sh
|
|
# Copyright (C) 2006-2012 OpenWrt.org
|
|
set -e -x
|
|
if [ $# -ne 5 ] && [ $# -ne 6 ]; then
|
|
echo "SYNTAX: $0 <file> <kernel size> <kernel directory> <rootfs size> <rootfs image> [<align>]"
|
|
exit 1
|
|
fi
|
|
|
|
OUTPUT="$1"
|
|
KERNELSIZE="$2"
|
|
KERNELDIR="$3"
|
|
ROOTFSSIZE="$4"
|
|
ROOTFSIMAGE="$5"
|
|
ALIGN="$6"
|
|
|
|
rm -f "$OUTPUT"
|
|
|
|
head=16
|
|
sect=63
|
|
|
|
# create partition table
|
|
set $(ptgen -o "$OUTPUT" -h $head -s $sect ${GUID:+-g} -p "${KERNELSIZE}m" -p "${ROOTFSSIZE}m" ${ALIGN:+-l $ALIGN} ${SIGNATURE:+-S 0x$SIGNATURE} ${GUID:+-G $GUID})
|
|
|
|
KERNELOFFSET="$(($1 / 512))"
|
|
KERNELSIZE="$2"
|
|
ROOTFSOFFSET="$(($3 / 512))"
|
|
ROOTFSSIZE="$(($4 / 512))"
|
|
|
|
# Using mcopy -s ... is using READDIR(3) to iterate through the directory
|
|
# entries, hence they end up in the FAT filesystem in traversal order which
|
|
# breaks reproducibility.
|
|
# Implement recursive copy with reproducible order.
|
|
dos_dircopy() {
|
|
local entry
|
|
local baseentry
|
|
for entry in "$1"/* ; do
|
|
if [ -f "$entry" ]; then
|
|
mcopy -i "$OUTPUT.kernel" "$entry" ::"$2"
|
|
elif [ -d "$entry" ]; then
|
|
baseentry="$(basename "$entry")"
|
|
mmd -i "$OUTPUT.kernel" ::"$2""$baseentry"
|
|
dos_dircopy "$entry" "$2""$baseentry"/
|
|
fi
|
|
done
|
|
}
|
|
|
|
[ -n "$PADDING" ] && dd if=/dev/zero of="$OUTPUT" bs=512 seek="$ROOTFSOFFSET" conv=notrunc count="$ROOTFSSIZE"
|
|
dd if="$ROOTFSIMAGE" of="$OUTPUT" bs=512 seek="$ROOTFSOFFSET" conv=notrunc
|
|
|
|
if [ -n "$GUID" ]; then
|
|
[ -n "$PADDING" ] && dd if=/dev/zero of="$OUTPUT" bs=512 seek="$((ROOTFSOFFSET + ROOTFSSIZE))" conv=notrunc count="$sect"
|
|
mkfs.fat --invariant -n kernel -C "$OUTPUT.kernel" -S 512 "$((KERNELSIZE / 1024))"
|
|
LC_ALL=C dos_dircopy "$KERNELDIR" /
|
|
else
|
|
make_ext4fs -J -L kernel -l "$KERNELSIZE" ${SOURCE_DATE_EPOCH:+-T ${SOURCE_DATE_EPOCH}} "$OUTPUT.kernel" "$KERNELDIR"
|
|
fi
|
|
dd if="$OUTPUT.kernel" of="$OUTPUT" bs=512 seek="$KERNELOFFSET" conv=notrunc
|
|
rm -f "$OUTPUT.kernel"
|