From 47467538f00920d94c0dd7eadc89759095e65eea Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Sun, 22 Feb 2026 21:25:48 +0000 Subject: [PATCH] [build] Use little-endian word values in genfsimg The genfsimg script extracts 16-bit word values from binary files using the POSIX-compatible subset of options to "od". This subset does not include the "--endian" option supported by GNU od. The 16-bit values are therefore effectively extracted and compared as byte sequences. Since all quantities in PE files are little-endian, this requires all literals to be written in a byte-reversed form. Switch to implementing get_word() in a marginally less efficient way (by issuing two separate calls to get_byte()), so that the value returned is the real 16-bit word value. This allows several of the constants to be written in a more meaningful form (e.g. "8664" for x86_64, "aa64" for AArch64, etc). Signed-off-by: Michael Brown --- src/util/genfsimg | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/src/util/genfsimg b/src/util/genfsimg index ac4bbadf8..7195ea2fa 100755 --- a/src/util/genfsimg +++ b/src/util/genfsimg @@ -34,11 +34,15 @@ get_byte() { get_word() { local FILENAME local OFFSET + local LSB + local MSB FILENAME="${1}" OFFSET="${2}" - od -j "${OFFSET}" -N 2 -A n -t x1 -- "${FILENAME}" | tr -d " " + LSB=$(get_byte "${FILENAME}" $(( ${OFFSET} + 0 )) ) + MSB=$(get_byte "${FILENAME}" $(( ${OFFSET} + 1 )) ) + echo "${MSB}${LSB}" } # Get appropriate EFI boot filename for CPU architecture @@ -51,37 +55,37 @@ efi_boot_name() { FILENAME="${1}" MZSIG=$(get_word "${FILENAME}" 0) - if [ "${MZSIG}" != "4d5a" ] ; then + if [ "${MZSIG}" != "5a4d" ] ; then echo "${FILENAME}: invalid MZ header" >&2 exit 1 fi PEOFF=$(get_byte "${FILENAME}" 0x3c) PESIG=$(get_word "${FILENAME}" 0x${PEOFF}) - if [ "${PESIG}" != "5045" ] ; then + if [ "${PESIG}" != "4550" ] ; then echo "${FILENAME}: invalid PE header" >&2 exit 1 fi ARCH=$(get_word "${FILENAME}" $(( 0x${PEOFF} + 4 )) ) case "${ARCH}" in - "4c01" ) + "014c" ) echo "BOOTIA32.EFI" ;; - "6486" ) + "8664" ) echo "BOOTX64.EFI" ;; - "c201" ) + "01c2" ) echo "BOOTARM.EFI" ;; - "6462" ) + "6264" ) echo "BOOTLOONGARCH64.EFI" ;; - "64aa" ) + "aa64" ) echo "BOOTAA64.EFI" ;; - "6450" ) + "5064" ) echo "BOOTRISCV64.EFI" ;; - "3250" ) + "5032" ) echo "BOOTRISCV32.EFI" ;; * )