summaryrefslogtreecommitdiff
path: root/arch/amd64/sym_lookup.py
blob: 96198201fd1a1be09083c2bd9ce073b73c0b2854 (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
66
67
68
#!/usr/bin/env python3

import subprocess
import bisect
import sys
import dataclasses

@dataclasses.dataclass
class Symbol:
	addr: int
	size: int
	ty: str
	scope: str
	name: str

readelf = subprocess.run(
	["readelf", "-s", "build/kernel.bin"], 
	capture_output=True, 
	encoding="UTF-8"
)

symbols = []

text_start = None
text_end = None

for line in readelf.stdout.split("\n")[3:-1]:
	parts = list(line.split());
	sym = Symbol(
		addr=int(parts[1], 16),
		size=int(parts[2]),
		ty=parts[3],
		scope=parts[4],
		name=parts[7] if len(parts) >= 8 else "",
	)
	symbols.append(sym)
	if sym.name == "text_start":
		text_start = sym.addr
	if sym.name == "text_end":
		text_end = sym.addr

symbols.sort(key=lambda s: s.addr)

def find_sym(addr):
	try:
		if addr.startswith("0x") or addr.startswith("0X"):
			addr = int(arg[2:], 16)
		else:
			addr = int(arg, 10)
	except:
		print(f"Invalid address: {addr}")
		return

	print(f"Address 0x{addr:016X}:")
	idx = bisect.bisect_right(symbols, addr, key=lambda s: s.addr)
	for i in range(idx-1, 0, -1):
		sym = symbols[i]
		if sym.addr < text_start:
			break
		if sym.addr > text_end:
			break
		print(f"\t{sym.name:<20} [0x{sym.addr:016X} : 0x{sym.size:04X}] {sym.ty:<7} {sym.scope:<7}")
		if sym.ty == "FUNC":
			return
	print("\t<end of text>")

for arg in sys.argv[1:]:
	find_sym(arg.strip())