121e35023SJosh Poimboeuf#!/bin/bash 221e35023SJosh Poimboeuf# SPDX-License-Identifier: GPL-2.0 321e35023SJosh Poimboeuf# 421e35023SJosh Poimboeuf# Disassemble a single function. 521e35023SJosh Poimboeuf# 627d000d6SJosh 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() { 1627d000d6SJosh 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 2327d000d6SJosh PoimboeufFUNCS=("$@") 2421e35023SJosh Poimboeuf 2527d000d6SJosh Poimboeuf${OBJDUMP} -wdr $OBJ | gawk -M -v _funcs="${FUNCS[*]}" ' 2627d000d6SJosh Poimboeuf BEGIN { split(_funcs, funcs); } 2727d000d6SJosh Poimboeuf /^$/ { func_match=0; } 2827d000d6SJosh Poimboeuf /<.*>:/ { 2927d000d6SJosh Poimboeuf f = gensub(/.*<(.*)>:/, "\\1", 1); 3027d000d6SJosh Poimboeuf for (i in funcs) { 3127d000d6SJosh Poimboeuf # match compiler-added suffixes like ".cold", etc 3227d000d6SJosh Poimboeuf if (f ~ "^" funcs[i] "(\\..*)?") { 3327d000d6SJosh Poimboeuf func_match = 1; 3427d000d6SJosh Poimboeuf base = strtonum("0x" $1); 3527d000d6SJosh Poimboeuf break; 3627d000d6SJosh Poimboeuf } 3727d000d6SJosh Poimboeuf } 3827d000d6SJosh Poimboeuf } 3927d000d6SJosh Poimboeuf { 4027d000d6SJosh Poimboeuf if (func_match) { 4127d000d6SJosh Poimboeuf addr = strtonum("0x" $1); 4227d000d6SJosh Poimboeuf printf("%04x ", addr - base); 4327d000d6SJosh Poimboeuf print; 4427d000d6SJosh Poimboeuf } 4527d000d6SJosh Poimboeuf }' 46