#!/bin/sh # # Calculate the amount of space needed to run the kernel, including room for # the .bss and .brk sections. # # Usage: # objdump -h a.out | sh calc_run_size.sh NUM='\([0-9a-fA-F]*[ \t]*\)' OUT=$(sed -n 's/^[ \t0-9]*.b[sr][sk][ \t]*'"$NUM$NUM$NUM$NUM"'.*/\1\4/p') if [ -z "$OUT" ] ; then echo "Never found .bss or .brk file offset" >&2 exit 1 fi OUT=$(echo ${OUT# }) sizeA=$(printf "%d" 0x${OUT%% *}) OUT=${OUT#* } offsetA=$(printf "%d" 0x${OUT%% *}) OUT=${OUT#* } sizeB=$(printf "%d" 0x${OUT%% *}) OUT=${OUT#* } offsetB=$(printf "%d" 0x${OUT%% *}) run_size=$(( $offsetA + $sizeA + $sizeB )) # BFD linker shows the same file offset in ELF. if [ "$offsetA" -ne "$offsetB" ] ; then # Gold linker shows them as consecutive. endB=$(( $offsetB + $sizeB )) if [ "$endB" != "$run_size" ] ; then printf "sizeA: 0x%x\n" $sizeA >&2 printf "offsetA: 0x%x\n" $offsetA >&2 printf "sizeB: 0x%x\n" $sizeB >&2 printf "offsetB: 0x%x\n" $offsetB >&2 echo ".bss and .brk are non-contiguous" >&2 exit 1 fi fi printf "%d\n" $run_size exit 0