| #!/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; | |
| } | |
| }' |