xref: /linux/scripts/objdump-func (revision 87807f77a03d0271211b75f84b2a8b88f4e8e5d4)
1#!/bin/bash
2# SPDX-License-Identifier: GPL-2.0
3#
4# Disassemble a single function.
5#
6# usage: objdump-func <file> <func> [<func> ...]
7
8set -o errexit
9set -o nounset
10
11OBJDUMP="${CROSS_COMPILE:-}objdump"
12
13command -v gawk >/dev/null 2>&1 || die "gawk isn't installed"
14
15usage() {
16	echo "usage: objdump-func <file> <func> [<func> ...]" >&2
17	exit 1
18}
19
20[[ $# -lt 2 ]] && usage
21
22OBJ=$1; shift
23FUNCS=("$@")
24
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	}'
46