mirror of
https://git.stationery.faith/corn/corn.git
synced 2024-11-21 18:22:16 +00:00
reorganize, add sym_lookup
This commit is contained in:
parent
690210c944
commit
7ce0cd6056
6 changed files with 112 additions and 46 deletions
10
Makefile
10
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
|
||||
|
||||
|
|
38
arch/amd64/linker.ld
Normal file
38
arch/amd64/linker.ld
Normal file
|
@ -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 = .;
|
||||
}
|
68
arch/amd64/sym_lookup.py
Executable file
68
arch/amd64/sym_lookup.py
Executable file
|
@ -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())
|
|
@ -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();
|
||||
|
||||
|
|
|
@ -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 = .;
|
||||
}
|
Loading…
Reference in a new issue