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