diff options
author | trimill <trimill@trimillxyz.org> | 2024-01-31 21:19:22 -0500 |
---|---|---|
committer | trimill <trimill@trimillxyz.org> | 2024-01-31 21:23:51 -0500 |
commit | 7ce0cd6056fe9cc583de3f9555699e274ad7ff9a (patch) | |
tree | fed1ff18db70152c909dd728a57fe286a31fb4ae | |
parent | fix whitespace (diff) | |
download | corn-7ce0cd6056fe9cc583de3f9555699e274ad7ff9a.tar.gz corn-7ce0cd6056fe9cc583de3f9555699e274ad7ff9a.tar.bz2 corn-7ce0cd6056fe9cc583de3f9555699e274ad7ff9a.zip |
reorganize, add sym_lookup
-rw-r--r-- | Makefile | 10 | ||||
-rw-r--r-- | arch/amd64/grub.cfg (renamed from grub.cfg) | 0 | ||||
-rw-r--r-- | arch/amd64/linker.ld | 38 | ||||
-rwxr-xr-x | arch/amd64/sym_lookup.py | 68 | ||||
-rw-r--r-- | include/backtrace.h | 4 | ||||
-rw-r--r-- | src/arch/amd64/linker.ld | 38 |
6 files changed, 112 insertions, 46 deletions
@@ -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 = .; -} |