aboutsummaryrefslogtreecommitdiff
path: root/scripts
diff options
context:
space:
mode:
Diffstat (limited to 'scripts')
-rwxr-xr-xscripts/build-all.sh8
-rwxr-xr-xscripts/build-arch.sh14
-rwxr-xr-xscripts/do_symsize.sh35
-rwxr-xr-xscripts/extsymsize.sh102
4 files changed, 152 insertions, 7 deletions
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