#!/bin/bash exe="$1" sym="$2" die() { echo "$@" >&2 exit 1 } get_sym() { objdump -j .text -tT "$1" | grep " $2\$" || die "symbol not found" } hex_to_d() { printf "%d" "$1"; } sum_hex() { expr $(hex_to_d "$1") + $(hex_to_d "$2"); } do_dump() { local addr=0x$1 local size=0x$2 objdump -dS --start-address=$addr --stop-address=$(printf "0x%016x" $(sum_hex $addr $size)) "$exe" } render_it() { local esc=$(printf "\033") sed -e "/^ [a-f0-9]\+:/{s/^.*$/$esc[34m&$esc[0m/}" } get_sym "$exe" "$sym" | while read addr flags1 flags2 sect size rest; do pager= if test -n "$TERM" -a "$TERM" != "dumb"; then do_dump "$addr" "$size" | render_it | env LESS=FRSX less else do_dump "$addr" "$size" | render_it fi done