summaryrefslogtreecommitdiff
path: root/arch/amd64
diff options
context:
space:
mode:
Diffstat (limited to 'arch/amd64')
-rw-r--r--arch/amd64/grub.cfg7
-rw-r--r--arch/amd64/linker.ld38
-rwxr-xr-xarch/amd64/sym_lookup.py68
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())