summaryrefslogtreecommitdiffstats
path: root/userspace/cuda/570.144/scripts/disasm.sh
blob: 01fea69d9b5abe4adba06fec177787e542fd97ab (plain)
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