ksym: start organizing kernel symbols for linking
This commit is contained in:
parent
8239270074
commit
6e3e7c7e0c
7
base/usr/include/kernel/ksym.h
Normal file
7
base/usr/include/kernel/ksym.h
Normal 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);
|
@ -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
28
kernel/misc/ksym.c
Normal 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);
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user