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 similarity index 100% rename from grub.cfg rename to 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") + +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 = .; -}