xref: /linux/scripts/objdump-func (revision 1ac731c529cd4d6adbce134754b51ff7d822b145)
121e35023SJosh Poimboeuf#!/bin/bash
221e35023SJosh Poimboeuf# SPDX-License-Identifier: GPL-2.0
321e35023SJosh Poimboeuf#
421e35023SJosh Poimboeuf# Disassemble a single function.
521e35023SJosh Poimboeuf#
6*27d000d6SJosh Poimboeuf# usage: objdump-func <file> <func> [<func> ...]
721e35023SJosh Poimboeuf
821e35023SJosh Poimboeufset -o errexit
921e35023SJosh Poimboeufset -o nounset
1021e35023SJosh Poimboeuf
1121e35023SJosh PoimboeufOBJDUMP="${CROSS_COMPILE:-}objdump"
1221e35023SJosh Poimboeuf
1321e35023SJosh Poimboeufcommand -v gawk >/dev/null 2>&1 || die "gawk isn't installed"
1421e35023SJosh Poimboeuf
1521e35023SJosh Poimboeufusage() {
16*27d000d6SJosh Poimboeuf	echo "usage: objdump-func <file> <func> [<func> ...]" >&2
1721e35023SJosh Poimboeuf	exit 1
1821e35023SJosh Poimboeuf}
1921e35023SJosh Poimboeuf
2021e35023SJosh Poimboeuf[[ $# -lt 2 ]] && usage
2121e35023SJosh Poimboeuf
2221e35023SJosh PoimboeufOBJ=$1; shift
23*27d000d6SJosh PoimboeufFUNCS=("$@")
2421e35023SJosh Poimboeuf
25*27d000d6SJosh Poimboeuf${OBJDUMP} -wdr $OBJ | gawk -M -v _funcs="${FUNCS[*]}" '
26*27d000d6SJosh Poimboeuf	BEGIN { split(_funcs, funcs); }
27*27d000d6SJosh Poimboeuf	/^$/ { func_match=0; }
28*27d000d6SJosh Poimboeuf	/<.*>:/ {
29*27d000d6SJosh Poimboeuf		f = gensub(/.*<(.*)>:/, "\\1", 1);
30*27d000d6SJosh Poimboeuf		for (i in funcs) {
31*27d000d6SJosh Poimboeuf			# match compiler-added suffixes like ".cold", etc
32*27d000d6SJosh Poimboeuf			if (f ~ "^" funcs[i] "(\\..*)?") {
33*27d000d6SJosh Poimboeuf				func_match = 1;
34*27d000d6SJosh Poimboeuf				base = strtonum("0x" $1);
35*27d000d6SJosh Poimboeuf				break;
36*27d000d6SJosh Poimboeuf			}
37*27d000d6SJosh Poimboeuf		}
38*27d000d6SJosh Poimboeuf	}
39*27d000d6SJosh Poimboeuf	{
40*27d000d6SJosh Poimboeuf		if (func_match) {
41*27d000d6SJosh Poimboeuf			addr = strtonum("0x" $1);
42*27d000d6SJosh Poimboeuf			printf("%04x ", addr - base);
43*27d000d6SJosh Poimboeuf			print;
44*27d000d6SJosh Poimboeuf		}
45*27d000d6SJosh Poimboeuf	}'
46