summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortrimill <trimill@trimillxyz.org>2024-01-31 21:19:22 -0500
committertrimill <trimill@trimillxyz.org>2024-01-31 21:23:51 -0500
commit7ce0cd6056fe9cc583de3f9555699e274ad7ff9a (patch)
treefed1ff18db70152c909dd728a57fe286a31fb4ae
parentfix whitespace (diff)
downloadcorn-7ce0cd6056fe9cc583de3f9555699e274ad7ff9a.tar.gz
corn-7ce0cd6056fe9cc583de3f9555699e274ad7ff9a.tar.bz2
corn-7ce0cd6056fe9cc583de3f9555699e274ad7ff9a.zip
reorganize, add sym_lookup
-rw-r--r--Makefile10
-rw-r--r--arch/amd64/grub.cfg (renamed from grub.cfg)0
-rw-r--r--arch/amd64/linker.ld38
-rwxr-xr-xarch/amd64/sym_lookup.py68
-rw-r--r--include/backtrace.h4
-rw-r--r--src/arch/amd64/linker.ld38
6 files changed, 112 insertions, 46 deletions
diff --git a/Makefile b/Makefile
index 4e9993d..f976538 100644
--- a/Makefile
+++ b/Makefile
@@ -8,8 +8,10 @@ ISO_NAME=os_image.iso
CC=cc
LD=ld
-CFLAGS=-std=c2x -ffreestanding -fno-stack-protector -g -Wall -Wextra -pedantic -lgcc -isystem $(INCLUDE_DIR)
-CFLAGS+= -DPAGE_SIZE=4096
+CFLAGS+=-std=c2x -ffreestanding -fno-stack-protector -g -Wall -Wextra -pedantic -lgcc -isystem $(INCLUDE_DIR)
+CFLAGS+=-DPAGE_SIZE=4096
+
+LDFLAGS+=-nmagic -T arch/amd64/linker.ld
C_SRC=$(shell find $(SRC_DIR) -type f -name "*.c")
C_OBJ=$(patsubst %.c,$(BUILD_DIR)/%.o,$(C_SRC))
@@ -37,12 +39,12 @@ $(C_OBJ): $(BUILD_DIR)/%.o : %.c
$(BUILD_DIR)/$(K_BIN_NAME): $(SRC_DIR)/arch/amd64/linker.ld $(A_OBJ) $(C_OBJ) $(H_SRC) $(H_INCLUDE)
@mkdir -p $(@D)
- $(LD) -nmagic -o $(BUILD_DIR)/$(K_BIN_NAME) -T $(SRC_DIR)/arch/amd64/linker.ld $(A_OBJ) $(C_OBJ)
+ $(LD) $(LDFLAGS) -o $(BUILD_DIR)/$(K_BIN_NAME) $(A_OBJ) $(C_OBJ)
$(BUILD_DIR)/$(ISO_NAME): $(BUILD_DIR)/$(K_BIN_NAME) grub.cfg
@mkdir -p $(@D)
@mkdir -p $(BUILD_DIR)/iso/boot/grub
- cp grub.cfg $(BUILD_DIR)/iso/boot/grub
+ cp arch/amd64/grub.cfg $(BUILD_DIR)/iso/boot/grub
cp $(BUILD_DIR)/$(K_BIN_NAME) $(BUILD_DIR)/iso/boot
grub-mkrescue -o $(BUILD_DIR)/$(ISO_NAME) $(BUILD_DIR)/iso
diff --git a/grub.cfg b/arch/amd64/grub.cfg
index 3aa3a12..3aa3a12 100644
--- a/grub.cfg
+++ b/arch/amd64/grub.cfg
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())
diff --git a/include/backtrace.h b/include/backtrace.h
index 2abece7..57021db 100644
--- a/include/backtrace.h
+++ b/include/backtrace.h
@@ -6,13 +6,9 @@
// in order from top to bottom. returns the number filled (at most len)
size_t backtrace(void **dst, size_t len);
-
// same as backtrace but with specified instruction and base pointer
size_t backtrace_ex(void **dst, size_t len, void* ip, void *bp);
-// TODO symbols
-//size_t backtrace_symbols(char *const *dst, size_t len);
-
// Log a backtrace
void log_backtrace();
diff --git a/src/arch/amd64/linker.ld b/src/arch/amd64/linker.ld
deleted file mode 100644
index 4d0596c..0000000
--- a/src/arch/amd64/linker.ld
+++ /dev/null
@@ -1,38 +0,0 @@
-ENTRY(start)
-
-PHDRS {
- loadable PT_LOAD FLAGS(7) ;
-}
-
-SECTIONS {
- . = 1M;
-
- kernel_start = .;
-
- .boot BLOCK(4K) : ALIGN(4K)
- {
- *(.multiboot)
- }
-
- .rodata BLOCK(4K) : ALIGN(4K)
- {
- *(.rodata)
- }
-
- .text BLOCK(4K) : ALIGN(4K)
- {
- *(.text)
- }
-
- .bss BLOCK(4K) : ALIGN(4K)
- {
- *(.bss)
- }
-
- .symtab : {
- symtab = .;
- *(.symtab)
- } :loadable
-
- kernel_end = .;
-}