add objdump-sym
authorPierre Habouzit <madcoder@debian.org>
Fri, 9 Oct 2009 12:40:31 +0000 (14:40 +0200)
committerPierre Habouzit <madcoder@debian.org>
Fri, 9 Oct 2009 12:40:31 +0000 (14:40 +0200)
Signed-off-by: Pierre Habouzit <madcoder@debian.org>
+bin/objdump-sym [new file with mode: 0755]

diff --git a/+bin/objdump-sym b/+bin/objdump-sym
new file mode 100755 (executable)
index 0000000..89e0331
--- /dev/null
@@ -0,0 +1,37 @@
+#!/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