1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
|
#!/bin/bash
# SPDX-License-Identifier: BSD-3-Clause
#
# disasm.sh - objdump helpers for a library under analysis.
#
# Usage:
# scripts/disasm.sh <file> <hex-vaddr> [before] [after]
# disassemble [vaddr-before, vaddr+after] (default 0x40 each side)
# scripts/disasm.sh --bytes <file> <hex-start> <hex-end>
# raw bytes in the range
# scripts/disasm.sh --symbol <file> <name>
# exported symbol address/size (readelf dyn-syms)
# scripts/disasm.sh --nearest <file> <hex-vaddr>
# nearest preceding exported symbol (FUNC) and the offset into it
set -e
cmd="${1:?usage: disasm.sh [--bytes|--symbol|--nearest] <file> ...}"
case "$cmd" in
--bytes)
file="$2"; start="$3"; end="$4"
objdump -s --start-address="$start" --stop-address="$end" "$file"
;;
--symbol)
file="$2"; name="$3"
readelf -sW --dyn-syms "$file" | awk -v n="$name" '$8 == n {print}'
;;
--nearest)
file="$2"; target="$3"
python3 - "$file" "$target" <<'PY'
import subprocess, sys
path, t = sys.argv[1], int(sys.argv[2], 16)
out = subprocess.check_output(["readelf", "-sW", "--dyn-syms", path], text=True)
syms = []
for line in out.splitlines():
p = line.split()
if len(p) >= 8 and p[3] == "FUNC":
try:
syms.append((int(p[1], 16), int(p[2]), p[7]))
except ValueError:
pass
syms.sort()
prev = None
for a, s, n in syms:
if a <= t:
prev = (a, s, n)
else:
break
if prev:
print("nearest exported: %s at 0x%x size 0x%x (+0x%x)" %
(prev[2], prev[0], prev[1], t - prev[0]))
else:
print("no exported symbol before 0x%x" % t)
PY
;;
*)
file="$1"; vaddr="$2"
before="${3:-0x40}"; after="${4:-0x40}"
start=$(printf '0x%x' $(( vaddr - before )) 2>/dev/null || echo "$vaddr")
end=$(printf '0x%x' $(( vaddr + after )) 2>/dev/null || echo "$vaddr")
# allow hex arithmetic with shell
start=$(python3 -c "print(hex(int('$vaddr',16)-int('$before',16)))")
end=$(python3 -c "print(hex(int('$vaddr',16)+int('$after',16)))")
objdump -d -Mintel --start-address="$start" --stop-address="$end" "$file"
;;
esac
|