diff --git a/EDK2/build_shim.sh b/EDK2/build_shim.sh index edefa4d2..19c377eb 100644 --- a/EDK2/build_shim.sh +++ b/EDK2/build_shim.sh @@ -37,12 +37,70 @@ else fi if [ -e $VTEFI_PATH ]; then + + objdump -h "$VTEFI_PATH" + echo "" + objcopy \ --add-section .sbat="MdeModulePkg/Application/VtoyShim/sbat.csv" \ --set-section-flags .sbat=alloc,load,readonly,data \ "$VTEFI_PATH" "$DST_PATH" - - objcopy --adjust-section-vma .sbat=0x1000 "$DST_PATH" + + #find the right sbat section VMA + tmpfile=$(mktemp) + + cnt1=$(objdump -h "$DST_PATH" | grep -P '^\s*[0-9][0-9]* \.' | wc -l) + cnt2=$(objdump -h "$DST_PATH" | grep -P 'ALLOC' | wc -l) + + if [ $cnt1 -ne $cnt2 ]; then + echo "Section count mismatch $cnt1 $cnt2" + objdump -h "$DST_PATH" + exit 1 + fi + + objdump -h "$DST_PATH" | grep -P '^\s*[0-9][0-9]* \.' > $tmpfile + sbat_size=$(stat -c '%s' MdeModulePkg/Application/VtoyShim/sbat.csv) + sbat_size_hex=$(printf '0x%08x' $sbat_size) + + lmax='0000000000000000' + lsize='0000000000000000' + while read line; do + echo $line + lbase=$(echo $line | awk '{print $4}') + if expr "$lmax" \< "$lbase" > /dev/null; then + lmax=$lbase + lsize=$(echo $line | awk '{print $3}') + fi + echo "max=$lmax size=$lsize" + done < $tmpfile + rm -f $tmpfile + + + lvma=$((0x${lsize}+0x${lmax})) + lvma_align=`printf '0x%08x' $(( (lvma + 4095) / 4096 * 4096 ))` + echo "sbat section lvma_align=$lvma_align" + + objcopy --adjust-section-vma .sbat=$lvma_align "$DST_PATH" + + img_base=$(objdump -p "$DST_PATH" | grep ImageBase | awk '{print $2}') + size_img=0x$(objdump -p "$DST_PATH" | grep SizeOfImage | awk '{print $2}') + sbat_end=`printf '0x%08x' $(($lvma_align+$sbat_size_hex))` + + if [ "$img_base" != "0000000000000000" ]; then + echo "#### ImageBase is not 0 $img_base" + exit 1 + fi + + echo "size_img=$size_img sbat_size=$sbat_size_hex sbat_range $lvma_align - $sbat_end" + + if expr "$size_img" \< "$sbat_end" > /dev/null; then + echo "SizeOfImage $size_img less than sbat section addr $sbat_end" + exit 1 + else + echo "SizeOfImage $size_img >= $sbat_end is OK" + fi + + objdump -h "$DST_PATH" echo -e '\n\n====================== SUCCESS ========================\n\n'