From f8afe0c17c248e7eda1be258786a089f5bf6c3bf Mon Sep 17 00:00:00 2001 From: David Timber Date: Sat, 14 Aug 2021 20:11:07 +1000 Subject: build scripts ... * Add readelf output for symbol size analysis * Add symbol size parser scripts * Add templates/symbol-size.fodt for generating hardcopy of extsymsize.sh output --- scripts/build-all.sh | 8 +- scripts/build-arch.sh | 14 +- scripts/do_symsize.sh | 35 ++++ scripts/extsymsize.sh | 102 ++++++++++++ templates/symbol-size.fodt | 393 +++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 545 insertions(+), 7 deletions(-) create mode 100755 scripts/do_symsize.sh create mode 100755 scripts/extsymsize.sh create mode 100644 templates/symbol-size.fodt diff --git a/scripts/build-all.sh b/scripts/build-all.sh index 7bb8809..1677b6e 100755 --- a/scripts/build-all.sh +++ b/scripts/build-all.sh @@ -47,13 +47,14 @@ PROONE_DEBUG_SYM_DIR="$PROONE_PREFIX/debug" PROONE_EXEC_DIR="$PROONE_PREFIX/proone.bin" PROONE_TOOLS_DIR="$PROONE_PREFIX/tools" PROONE_MISC_BIN_DIR="$PROONE_PREFIX/misc" -PROONE_BINARCH_DIR="$PROONE_PREFIX/binarch" PROONE_REL_DIR="$PROONE_PREFIX/proone" export PROONE_DEBUG_SYM_PREFIX="$PROONE_DEBUG_SYM_DIR/" -export PROONE_EXEC_PREFIX="$PROONE_EXEC_DIR/exec" +export PROONE_EXEC_PREFIX="$PROONE_EXEC_DIR/stripped" +export PROONE_ENTIRE_PREFIX="$PROONE_EXEC_DIR/entire" +export PROONE_ASM_PREFIX="$PROONE_EXEC_DIR/asm" +export PROONE_READELF_PREFIX="$PROONE_EXEC_DIR/readelf" export PROONE_MISC_BIN_PREFIX="$PROONE_MISC_BIN_DIR/" PROONE_REL_PREFIX="$PROONE_REL_DIR/proone" -PROONE_BINARCH_PREFIX="$PROONE_BINARCH_DIR/binarch" PROONE_CDICT="$PROONE_PREFIX/cred_dict.bin" PROONE_DVAULT="$PROONE_PREFIX/dvault.bin" PROONE_TOOLS=" @@ -72,7 +73,6 @@ mkdir\ "$PROONE_EXEC_DIR"\ "$PROONE_TOOLS_DIR"\ "$PROONE_MISC_BIN_DIR"\ - "$PROONE_BINARCH_DIR"\ "$PROONE_REL_DIR" set +e make distclean diff --git a/scripts/build-arch.sh b/scripts/build-arch.sh index b8ae223..9fc2ed0 100755 --- a/scripts/build-arch.sh +++ b/scripts/build-arch.sh @@ -7,9 +7,18 @@ MISC_BIN=" proone-test_proto proone-test_util " +BIN_PATH="$PROONE_EXEC_PREFIX.$PROONE_BIN_OS.$PROONE_BIN_ARCH" +ENTIRE_BIN_PATH="$PROONE_ENTIRE_PREFIX.$PROONE_BIN_OS.$PROONE_BIN_ARCH" +READELF_PATH="$PROONE_READELF_PREFIX.$PROONE_BIN_OS.$PROONE_BIN_ARCH" +ASM_PATH="$PROONE_ASM_PREFIX.$PROONE_BIN_OS.$PROONE_BIN_ARCH" separate_debug() { cp -a "$1" "$2" + if [ ! -z "$4" ]; then + cp -a "$1" "$4" + "$PROONE_HOST"-readelf -a "$4" > "$READELF_PATH" + # "$PROONE_HOST"-objdump -D "$4" | xz -evvT0 > "$ASM_PATH" + fi "$PROONE_HOST-objcopy" --only-keep-debug "$2" "$3" "$PROONE_HOST-strip"\ -S\ @@ -28,8 +37,6 @@ separate_debug() { "$PROONE_HOST-objcopy" --add-gnu-debuglink="$3" "$2" } -BIN_PATH="$PROONE_EXEC_PREFIX.$PROONE_BIN_OS.$PROONE_BIN_ARCH" - ./configure --host="$PROONE_HOST" --enable-static $PROONE_AM_CONF cd src make -j$(nproc) proone.bin $MISC_BIN @@ -38,7 +45,8 @@ cd .. separate_debug\ src/proone.bin\ "$BIN_PATH"\ - "$PROONE_DEBUG_SYM_PREFIX""proone.sym.$PROONE_BIN_OS.$PROONE_BIN_ARCH" + "$PROONE_DEBUG_SYM_PREFIX""proone.sym.$PROONE_BIN_OS.$PROONE_BIN_ARCH"\ + "$ENTIRE_BIN_PATH" for b in $MISC_BIN; do separate_debug\ "src/$b"\ diff --git a/scripts/do_symsize.sh b/scripts/do_symsize.sh new file mode 100755 index 0000000..154fb00 --- /dev/null +++ b/scripts/do_symsize.sh @@ -0,0 +1,35 @@ +#!/bin/bash +ELF_PREFIX='./builds/proone.bin/readelf' +OUT_PREFIX='./builds/proone.bin/symsize' +NPROC=$(nproc) +NB_PROC=0 + +# +# \param 1: input file +# \param 2: output file +call_extsymsize () { + ./scripts/extsymsize.sh < "$1" | sort -nr > "$2" +} + +for f in "$ELF_PREFIX".*; do + suffix=$(echo "$f" | egrep -o '(\.\w+\.\w+)$') + if [ $? -ne 0 ]; then + echo "$f: invalid suffix" >&2 + exit 1 + fi + + set -e + out="$OUT_PREFIX""$suffix" + if [ $NB_PROC -lt $NPROC ]; then + call_extsymsize "$f" "$out" & + let 'NB_PROC += 1' + else + wait + call_extsymsize "$f" "$out" & + fi + set +e +done + +for (( i = 0; i < NB_PROC; i += 1 )); do + wait +done diff --git a/scripts/extsymsize.sh b/scripts/extsymsize.sh new file mode 100755 index 0000000..b73a216 --- /dev/null +++ b/scripts/extsymsize.sh @@ -0,0 +1,102 @@ +#!/bin/bash +NB_SYMTABS=0 +declare -a FMT_HEADERS +FMT_HEADERS=( + "size" + "type" + "name" +) + +# +# \param 1: re of the line to skip to +skip_to () { + while read l; do + if echo "$l" | egrep -q "$1"; then + return 0 + fi + done + return 1 +} + +# +# \param *: message +echo_err () { + echo $@ >&2 +} + +# +# \param 1: (optional)message +# \param 2: (optional)exit code +die () { + local ec + + if [ ! -z "$1" ]; then + echo_err "$1" >&2 + fi + if [ -z "$2" ]; then + ec=1 + else + ec="$2" + fi + exit $ec +} + +while skip_to "^[Ss]ymbol table '(\\.|\\w)+' contains [0-9]+ entries:\$"; do + unset idx_map name_map + declare -A idx_map name_map + + if ! read l; then + die "Unexpected EOF" + fi + let 'NB_SYMTABS += 1' + + i=0 + for h in $l; do + h="${h,,}" + + case "$h" in + "num") idx_map["$h"]=$i ;; + "value") idx_map["$h"]=$i ;; + "size") idx_map["$h"]=$i ;; + "type") idx_map["$h"]=$i ;; + "bind") idx_map["$h"]=$i ;; + "vis") idx_map["$h"]=$i ;; + "ndx") idx_map["$h"]=$i ;; + "name") idx_map["$h"]=$i ;; + esac + name_map["$i"]="$h" + let 'i += 1' + done + + for i in ${FMT_HEADERS[@]}; do + if [ -z ${idx_map["$i"]} ]; then + echo_err "Missing header in symbol table: ${FMT_HEADERS["$i"]}" + die "Headers required in symbol table: ${FMT_HEADERS[*]}" + fi + done + + while read l && [ ! -z "$l" ]; do + unset size type name + + i=0 + for w in $l; do + case "${name_map[$i]}" in + "size") size="$w" ;; + "type") type="$w" ;; + "name") name="$w" ;; + "") die "Format error." ;; + esac + let 'i += 1' + done + + if [ "$size" -eq 0 ]; then + continue + fi + printf "%10u %c %s\n" $size ${type:0:1} $name + done +done + +if [ $NB_SYMTABS -eq 0 ]; then + die "No symbol table found." +fi +exit 0 diff --git a/templates/symbol-size.fodt b/templates/symbol-size.fodt new file mode 100644 index 0000000..982c9bc --- /dev/null +++ b/templates/symbol-size.fodt @@ -0,0 +1,393 @@ + + + + 2021-08-14T20:00:58.440638274PT7M40S3LibreOffice/7.0.6.2$Linux_X86_64 LibreOffice_project/00$Build-2 + + + 4 + 0 + 35116 + 16293 + true + false + + + view2 + 3708 + 1501 + 0 + 4 + 35114 + 16295 + 0 + 1 + false + 140 + false + false + + + + + false + false + false + true + true + true + true + true + false + 0 + false + false + false + true + false + false + true + false + false + false + true + true + true + false + false + false + false + false + false + false + true + false + false + true + false + false + false + true + 0 + 1 + true + + high-resolution + true + + + false + false + true + false + true + true + false + true + + true + 1109849 + + true + false + true + 0 + + false + false + false + true + false + true + false + false + false + false + true + false + + false + false + true + false + false + false + false + false + false + false + false + false + 894104 + false + false + false + false + false + true + false + true + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + NAME + + + 1 + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file -- cgit