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