bash error handling and reporting is atrocious. Without -e it will just ignore errors. With -e it will stop on errors, but not report where the error happened (apart from exiting itself with an error code). Improve that with the `trap ERR` command. Note that this won't be invoked on intentional error exit with `exit 1`. We apply this on every bash script that contains -e or that it appears trivial to set it in. Non-trivial scripts without -e are left unmodified, since they might intentionally invoke failing scripts. Closes scylladb/scylladb#22747
30 lines
1.3 KiB
Bash
Executable File
30 lines
1.3 KiB
Bash
Executable File
#!/bin/bash -e
|
|
|
|
set -o pipefail
|
|
|
|
trap 'echo "error $? in $0 line $LINENO"' ERR
|
|
|
|
orig="$1"
|
|
stripped="$orig.stripped"
|
|
debuginfo="$orig.debug"
|
|
|
|
# generate stripped binary and debuginfo
|
|
cp -a "$orig" "$stripped"
|
|
gdb-add-index "$stripped"
|
|
objcopy --merge-notes "$stripped"
|
|
eu-strip --remove-comment -f "$debuginfo" "$stripped"
|
|
|
|
# generate minidebug (minisymtab)
|
|
dynsyms="$orig.dynsyms"
|
|
funcsyms="$orig.funcsyms"
|
|
keep_symbols="$orig.keep_symbols"
|
|
mini_debuginfo="$orig.minidebug"
|
|
# silence "Error: Unable to find program interpreter name" warning from readelf, see https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1012107
|
|
remove_sections=`readelf -W -S "$debuginfo" 2> /dev/null | awk '{ if (index($2,".debug_") != 1 && ($3 == "PROGBITS" || $3 == "NOTE" || $3 == "NOBITS") && index($8,"A") == 0) printf "--remove-section "$2" " }'`
|
|
nm -D "$stripped" --format=posix --defined-only | awk '{ print $1 }' | sort > "$dynsyms"
|
|
nm "$debuginfo" --format=posix --defined-only | awk '{ if ($2 == "T" || $2 == "t" || $2 == "D") print $1 }' | sort > "$funcsyms"
|
|
comm -13 "$dynsyms" "$funcsyms" > "$keep_symbols"
|
|
objcopy -S $remove_sections --keep-symbols="$keep_symbols" "$debuginfo" "$mini_debuginfo"
|
|
xz -f --threads=0 "$mini_debuginfo"
|
|
objcopy --add-section .gnu_debugdata="$mini_debuginfo".xz "$stripped"
|