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