46 lines
848 B
Plaintext
46 lines
848 B
Plaintext
|
#!/bin/bash
|
||
|
# SPDX-License-Identifier: GPL-2.0
|
||
|
#
|
||
|
# Disassemble a single function.
|
||
|
#
|
||
|
# usage: objdump-func <file> <func> [<func> ...]
|
||
|
|
||
|
set -o errexit
|
||
|
set -o nounset
|
||
|
|
||
|
OBJDUMP="${CROSS_COMPILE:-}objdump"
|
||
|
|
||
|
command -v gawk >/dev/null 2>&1 || die "gawk isn't installed"
|
||
|
|
||
|
usage() {
|
||
|
echo "usage: objdump-func <file> <func> [<func> ...]" >&2
|
||
|
exit 1
|
||
|
}
|
||
|
|
||
|
[[ $# -lt 2 ]] && usage
|
||
|
|
||
|
OBJ=$1; shift
|
||
|
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;
|
||
|
}
|
||
|
}'
|