ksym: start organizing kernel symbols for linking

This commit is contained in:
K. Lange 2021-06-03 21:00:56 +09:00
parent 8239270074
commit 6e3e7c7e0c
3 changed files with 38 additions and 9 deletions

View File

@ -0,0 +1,7 @@
#pragma once
#include <kernel/hashmap.h>
extern void ksym_install(void);
extern void ksym_bind(const char * symname, void * value);
extern void * ksym_lookup(const char * symname);

View File

@ -20,6 +20,7 @@
#include <kernel/gzip.h>
#include <kernel/ramdisk.h>
#include <kernel/args.h>
#include <kernel/ksym.h>
#include <kernel/arch/x86_64/ports.h>
#include <kernel/arch/x86_64/cmos.h>
@ -101,18 +102,11 @@ static void multiboot_initialize(struct multiboot * mboot) {
maxAddress = (maxAddress + 0xFFF) & 0xFFFFffffFFFFf000;
}
/**
* FIXME: We don't currently use the kernel symbol table, but when modules
* are implemented again we need it for linking... but also we could
* just build the kernel with a dynamic symbol table attached?
*/
static hashmap_t * kernelSymbols = NULL;
static void symbols_install(void) {
kernelSymbols = hashmap_create(10);
ksym_install();
kernel_symbol_t * k = (kernel_symbol_t *)&kernel_symbols_start;
while ((uintptr_t)k < (uintptr_t)&kernel_symbols_end) {
hashmap_set(kernelSymbols, k->name, (void*)k->addr);
ksym_bind(k->name, (void*)k->addr);
k = (kernel_symbol_t *)((uintptr_t)k + sizeof *k + strlen(k->name) + 1);
}
}

28
kernel/misc/ksym.c Normal file
View File

@ -0,0 +1,28 @@
/**
* @file kernel/misc/ksym.c
* @brief Kernel symbol table management.
*
* Essentially some wrappers around a hashmap; allows different
* boot methods to provide symbol tables for use with linking
* kernel modules.
*/
#include <kernel/hashmap.h>
#include <kernel/assert.h>
#include <kernel/ksym.h>
static hashmap_t * ksym_hash = NULL;
void ksym_install(void) {
assert(ksym_hash == NULL);
ksym_hash = hashmap_create(20);
}
void ksym_bind(const char * symname, void * value) {
assert(ksym_hash != NULL);
hashmap_set(ksym_hash, symname, value);
}
void * ksym_lookup(const char * symname) {
return hashmap_get(ksym_hash, symname);
}