| #!/bin/sh |
| |
| SCRIPT_DIRECTORY="$(dirname "$(realpath "$0")")" |
| . ${SCRIPT_DIRECTORY}/includes/helper_find_llvm_install.sh |
| |
| OBJDUMP=$(find_llvm_tool_required llvm-objdump) |
| |
| MACHINE_READABLE=0 |
| |
| print_compartment_size() { |
| # Print all sections that match passed compartment name (potentially |
| # multiple ones, as compartments covers code and various data |
| # sections), and sum their sizes. |
| # |
| # Note that this does not validate compartment names. An invalid |
| # compartment name may return either 0kB, or an arbitrary number if the |
| # provided name matches legitimate compartments. This would be nice to |
| # fix at some point. |
| SIZE=$(${OBJDUMP} --headers $1 | grep -i $2 | |
| awk '{ sum += "0x"$3 } END { print sum}') |
| |
| if [ "$MACHINE_READABLE" -eq 0 ]; then |
| KB_SIZE=$(echo $SIZE | awk '{ print ($1 / 1024) "kB"}') |
| echo "Size of compartment '$2': ${KB_SIZE}" |
| else |
| echo "${SIZE}" |
| fi |
| } |
| |
| print_full_code_size() { |
| # Print all sections between the start of the firmware (`loader_start`) |
| # and the end of `__cap_relocs`, and sum the sizes of sections |
| SIZE=$(${OBJDUMP} --headers $1 | |
| awk '/loader_start/{f=1} /__cap_relocs/{f=0;print} f' | |
| awk '{ sum += "0x"$3 } END { print sum}') |
| |
| if [ "$MACHINE_READABLE" -eq 0 ]; then |
| KB_SIZE=$(echo $SIZE | awk '{ print ($1 / 1024) "kB"}') |
| echo "Size of the full binary: ${KB_SIZE}" |
| else |
| echo "${SIZE}" |
| fi |
| } |
| |
| help() { |
| echo "Determine the size of a CHERIoT firmware image." |
| echo |
| echo "Syntax: $(basename "$0") {-m} [-h|-c|-f]" |
| echo " -m Enable machine-readable output in B." |
| echo " Optional, must come before -c/-f." |
| echo " -h Print this help." |
| echo " -f [firmware location] Print the size of the entire firmware image." |
| echo " -c [firmware location] [compartment name] Print the size of passed compartment." |
| echo |
| } |
| |
| if [ "$#" -eq 0 ]; then |
| echo "Error: Arguments missing." |
| help |
| exit |
| fi |
| |
| while getopts ":hcfm" opt; do |
| case $opt in |
| h) |
| help |
| exit;; |
| m) |
| MACHINE_READABLE=1 |
| ;; |
| c) |
| EXPECTED=$(( 3 + ${MACHINE_READABLE})) |
| if [ "$#" -ne "${EXPECTED}" ]; then |
| echo "Error: Argument number incorrect." |
| help |
| exit |
| fi |
| |
| shift $((OPTIND-1)) |
| print_compartment_size $@ |
| exit;; |
| f) |
| EXPECTED=$(( 2 + ${MACHINE_READABLE})) |
| if [ "$#" -ne "${EXPECTED}" ]; then |
| echo "Error: Argument number incorrect." |
| help |
| exit |
| fi |
| |
| shift $((OPTIND-1)) |
| print_full_code_size $@ |
| exit;; |
| \?) |
| echo "Error: Invalid option." |
| help |
| exit;; |
| esac |
| done |