blob: 6a10066bdfc8e705739c3cff4870abe20f64c894 [file] [log] [blame]
#!/bin/bash
#
# Copyright 2024, The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
#
# Usage
# ./get_padded_memsize.sh <TINYSYS/SLPI/QSH> <obj_name>
# Quit if any command produces an error.
set -e
# Parse variables
PLATFORM=$1
PLATFORM_NOT_CORRECT_STR="You must specify the platform being analyzed. Should be TINYSYS, QSH, or SLPI"
: ${PLATFORM:?$PLATFORM_NOT_CORRECT_STR}
if [ "$PLATFORM" != "TINYSYS" ] && [ "$PLATFORM" != "SLPI" ] && [ "$PLATFORM" != "QSH" ]; then
echo $PLATFORM_NOT_CORRECT_STR
exit 1
fi
OBJ=$2
: ${OBJ:?"You must specify the .so to size."}
# Setup required paths and obtain segments
if [ "$PLATFORM" == "TINYSYS" ]; then
: ${RISCV_TOOLCHAIN_PATH}:?"Set RISCV_TOOLCHAIN_PATH, e.g. prebuilts/clang/md32rv/linux-x86"
READELF_PATH="$RISCV_TOOLCHAIN_PATH/bin/llvm-readelf"
elif [ "$PLATFORM" == "SLPI" ] || [ "$PLATFORM" == "QSH" ]; then
: ${HEXAGON_TOOLS_PREFIX:?"Set HEXAGON_TOOLS_PREFIX, e.g. export HEXAGON_TOOLS_PREFIX=\$HOME/Qualcomm/HEXAGON_Tools/8.1.04"}
READELF_PATH="$HEXAGON_TOOLS_PREFIX/Tools/bin/hexagon-readelf"
else
READELF_PATH="readelf"
fi
SEGMENTS="$($READELF_PATH -l $OBJ | grep LOAD)"
# Save current IFS to restore later.
CURR_IFS=$IFS
printf "\n$OBJ\n"
TOTAL=0
IFS=$'\n'
for LINE in $SEGMENTS; do
# Headers: Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
IFS=" " HEADERS=(${LINE})
LEN=${#HEADERS[@]}
MEMSIZE=$(( HEADERS[5] ))
# Flg can have a space in it, 'R E', for example.
ALIGN=$(( HEADERS[LEN - 1] ))
# Rounded up to the next integral multiple of Align.
QUOTIENT=$(( (MEMSIZE + ALIGN - 1) / ALIGN ))
PADDED=$(( ALIGN * QUOTIENT ))
PADDING=$(( PADDED - MEMSIZE ))
printf ' MemSize:0x%x Align:0x%x Padded:0x%x Padding:%d\n' $MEMSIZE $ALIGN $PADDED $PADDING
TOTAL=$(( TOTAL + PADDED ))
done
IFS=$CURR_IFS
printf 'Total Padded MemSize: 0x%x (%d)\n' $TOTAL $TOTAL