Josh Poimboeuf | 21e3502 | 2022-04-21 14:56:55 -0700 | [diff] [blame] | 1 | #!/bin/bash |
| 2 | # SPDX-License-Identifier: GPL-2.0 |
| 3 | # |
| 4 | # Disassemble a single function. |
| 5 | # |
Josh Poimboeuf | 27d000d | 2023-04-12 12:03:16 -0700 | [diff] [blame] | 6 | # usage: objdump-func <file> <func> [<func> ...] |
Josh Poimboeuf | 21e3502 | 2022-04-21 14:56:55 -0700 | [diff] [blame] | 7 | |
| 8 | set -o errexit |
| 9 | set -o nounset |
| 10 | |
| 11 | OBJDUMP="${CROSS_COMPILE:-}objdump" |
| 12 | |
| 13 | command -v gawk >/dev/null 2>&1 || die "gawk isn't installed" |
| 14 | |
| 15 | usage() { |
Josh Poimboeuf | 27d000d | 2023-04-12 12:03:16 -0700 | [diff] [blame] | 16 | echo "usage: objdump-func <file> <func> [<func> ...]" >&2 |
Josh Poimboeuf | 21e3502 | 2022-04-21 14:56:55 -0700 | [diff] [blame] | 17 | exit 1 |
| 18 | } |
| 19 | |
| 20 | [[ $# -lt 2 ]] && usage |
| 21 | |
| 22 | OBJ=$1; shift |
Josh Poimboeuf | 27d000d | 2023-04-12 12:03:16 -0700 | [diff] [blame] | 23 | FUNCS=("$@") |
Josh Poimboeuf | 21e3502 | 2022-04-21 14:56:55 -0700 | [diff] [blame] | 24 | |
Josh Poimboeuf | 27d000d | 2023-04-12 12:03:16 -0700 | [diff] [blame] | 25 | ${OBJDUMP} -wdr $OBJ | gawk -M -v _funcs="${FUNCS[*]}" ' |
| 26 | BEGIN { split(_funcs, funcs); } |
| 27 | /^$/ { func_match=0; } |
| 28 | /<.*>:/ { |
| 29 | f = gensub(/.*<(.*)>:/, "\\1", 1); |
| 30 | for (i in funcs) { |
| 31 | # match compiler-added suffixes like ".cold", etc |
| 32 | if (f ~ "^" funcs[i] "(\\..*)?") { |
| 33 | func_match = 1; |
| 34 | base = strtonum("0x" $1); |
| 35 | break; |
| 36 | } |
| 37 | } |
| 38 | } |
| 39 | { |
| 40 | if (func_match) { |
| 41 | addr = strtonum("0x" $1); |
| 42 | printf("%04x ", addr - base); |
| 43 | print; |
| 44 | } |
| 45 | }' |