diff options
Diffstat (limited to 'arch/amd64')
-rw-r--r-- | arch/amd64/grub.cfg | 7 | ||||
-rw-r--r-- | arch/amd64/linker.ld | 38 | ||||
-rwxr-xr-x | arch/amd64/sym_lookup.py | 68 |
3 files changed, 113 insertions, 0 deletions
diff --git a/arch/amd64/grub.cfg b/arch/amd64/grub.cfg new file mode 100644 index 0000000..3aa3a12 --- /dev/null +++ b/arch/amd64/grub.cfg @@ -0,0 +1,7 @@ +set timeout=1 +set default=0 + +menuentry "corn" { + multiboot2 /boot/kernel.bin + boot +} diff --git a/arch/amd64/linker.ld b/arch/amd64/linker.ld new file mode 100644 index 0000000..e097f56 --- /dev/null +++ b/arch/amd64/linker.ld @@ -0,0 +1,38 @@ +ENTRY(start) + +SECTIONS { + . = 1M; + + kernel_start = .; + + .boot BLOCK(4K) : ALIGN(4K) + { + *(.multiboot) + } + + .rodata BLOCK(4K) : ALIGN(4K) + { + *(.rodata) + } + + .data BLOCK(4K) : ALIGN(4K) + { + *(.data) + } + + text_start = .; + + .text BLOCK(4K) : ALIGN(4K) + { + *(.text) + } + + text_end = .; + + .bss BLOCK(4K) : ALIGN(4K) + { + *(.bss) + } + + kernel_end = .; +} diff --git a/arch/amd64/sym_lookup.py b/arch/amd64/sym_lookup.py new file mode 100755 index 0000000..9619820 --- /dev/null +++ b/arch/amd64/sym_lookup.py @@ -0,0 +1,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()) |