load_mbr_header() casts an unaligned pointer to (mbr_entry_t *) then dereferences struct members with non-trivial alignment requirements.
This causes a bl2 with BOOT_DEVICE=emmc to hang when compiled with clang 18.1.5, although it works when compiled with gcc 14.1.0, as described in https://github.com/mtk-openwrt/arm-trusted-firmware/issues/8. Presumably gcc's -mstrict-align papers over the undefined behaviour whereas clang's doesn't.
Replace the unaligned cast with a safe memcpy() into an mbr_entry_t.
load_mbr_header()
casts an unaligned pointer to(mbr_entry_t *)
then dereferences struct members with non-trivial alignment requirements.This causes a bl2 with
BOOT_DEVICE=emmc
to hang when compiled with clang 18.1.5, although it works when compiled with gcc 14.1.0, as described in https://github.com/mtk-openwrt/arm-trusted-firmware/issues/8. Presumably gcc's-mstrict-align
papers over the undefined behaviour whereas clang's doesn't.Replace the unaligned cast with a safe
memcpy()
into anmbr_entry_t
.