46 lines
		
	
	
		
			848 B
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			46 lines
		
	
	
		
			848 B
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
| #!/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;
 | |
| 		}
 | |
| 	}'
 |