16 logf(
"elf",
"incompatible ELF file, invalid machine or version");
22 logf(
"elf",
"file not executable (%u != %u)",
header->type, 2);
26 for(
int i = 0; i <
header->programHeaderCount; ++i) {
29 if(programHeader->
type != 1 && programHeader->
type != 7) {
33 for(
size_t j = 0; j < programHeader->
memLength; j += 0x1000) {
42 if(toCopy > (0x1000 -
offset)) {
60 if(programHeader->
vaddr < *data_start) {
61 *data_start = programHeader->
vaddr;
76 char* sectionNames = (
char*)elf + shSectionNames->
offset;
105 if(symtab == 0 && strtab == 0) {
106 logw(
"elf",
"Unable to load symbols as either symtab (0x%x) or strtab (0x%x) are missing", symtab, strtab);
122 for(
size_t i = 0; i < numSymbols; ++i) {
141 int64_t best_difference = ~(1ULL<<63);
144 for(
size_t i = 0; i < symbols->
numSymbols; ++i) {
148 if(diff > 0 && diff < best_difference) {
150 best_difference = diff;
160 size_t max_size = *symbol_size;
162 if(best_difference) {
163 *symbol_size =
ksnprintf(symbol, *symbol_size,
"%s(+0x%x)", best_name, best_difference);
165 *symbol_size =
strlen(best_name) + 1;
167 strncpy(symbol, best_name, max_size);
170 return *symbol_size <= max_size;
struct acpi_table_header header
bool elf_symbolize(void *symbol_data, ptr_t addr, size_t *symbol_size, char *symbol)
ptr_t load_elf(ptr_t start, struct vm_table *context, ptr_t *data_start, ptr_t *data_end)
elf_section_header_t * elf_section_by_name(const char *name, const void *elf)
void * elf_load_symbols(ptr_t elf, allocator_t *alloc)
#define ALLOCATOR_REGION_DIRECT_MAPPING
size_t strlen(const char *str)
int strcmp(const char *s1, const char *s2)
void * memcpy(void *dest, void const *source, size_t size)
void * memset(void *dest, int c, size_t size)
size_t ksnprintf(char *buffer, size_t buffer_size, const char *format,...)
char * strncpy(char *s1, const char *s2, size_t n)
uint16_t sectionHeaderSectionNameIndex
uint16_t sectionHeaderEntrySize
uint16_t sectionHeaderCount
ptr_t sectionHeaderOffset
Symbols in ELF images, there may be many.
char name[256]
Zero terminated string with the name of the file.
uint64_t offset
Offset where the file contents are located after LoaderStruct.
#define logw(component, fmt,...)
#define logf(component, fmt,...)
void * mm_alloc_pages(uint64_t count)
void *(* alloc)(struct allocator *alloc, size_t size)
void vm_context_map(struct vm_table *pml4, ptr_t virtual, ptr_t physical, uint8_t pat)
A paging table, when this is a PML4 it may also be called context.