2023-08-30 17:31:07 +02:00
|
|
|
#!/bin/bash
|
|
|
|
# SPDX-License-Identifier: GPL-2.0
|
|
|
|
#
|
|
|
|
# Disassemble a single function.
|
|
|
|
#
|
2023-10-24 12:59:35 +02:00
|
|
|
# usage: objdump-func <file> <func> [<func> ...]
|
2023-08-30 17:31:07 +02:00
|
|
|
|
|
|
|
set -o errexit
|
|
|
|
set -o nounset
|
|
|
|
|
|
|
|
OBJDUMP="${CROSS_COMPILE:-}objdump"
|
|
|
|
|
|
|
|
command -v gawk >/dev/null 2>&1 || die "gawk isn't installed"
|
|
|
|
|
|
|
|
usage() {
|
2023-10-24 12:59:35 +02:00
|
|
|
echo "usage: objdump-func <file> <func> [<func> ...]" >&2
|
2023-08-30 17:31:07 +02:00
|
|
|
exit 1
|
|
|
|
}
|
|
|
|
|
|
|
|
[[ $# -lt 2 ]] && usage
|
|
|
|
|
|
|
|
OBJ=$1; shift
|
2023-10-24 12:59:35 +02:00
|
|
|
FUNCS=("$@")
|
|
|
|
|
|
|
|
${OBJDUMP} -wdr $OBJ | gawk -M -v _funcs="${FUNCS[*]}" '
|
|
|
|
BEGIN { split(_funcs, funcs); }
|
|
|
|
/^$/ { func_match=0; }
|
|
|
|
/<.*>:/ {
|
|
|
|
f = gensub(/.*<(.*)>:/, "\\1", 1);
|
|
|
|
for (i in funcs) {
|
|
|
|
# match compiler-added suffixes like ".cold", etc
|
|
|
|
if (f ~ "^" funcs[i] "(\\..*)?") {
|
|
|
|
func_match = 1;
|
|
|
|
base = strtonum("0x" $1);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
{
|
|
|
|
if (func_match) {
|
|
|
|
addr = strtonum("0x" $1);
|
|
|
|
printf("%04x ", addr - base);
|
|
|
|
print;
|
|
|
|
}
|
|
|
|
}'
|