#include "vxBoot/loader.h" #include "vxBoot/fs/smemfs.h" #include "vxBoot/terminal.h" #include /* loader_got_patch() : Try to patch the GOT section */ int loader_got_patch( struct smemfs_inode const * restrict const inode, struct kernel_info * const kernel, Elf32_Ehdr *hdr ) { Elf32_Shdr shdr; uintptr_t *got; char name[5]; off_t stroff; off_t shoff; /* find the section header table */ shoff = hdr->e_shoff; /* find the section string table ".strtable" */ smemfs_pread( inode, &shdr, sizeof(Elf32_Shdr), shoff + (sizeof(Elf32_Shdr) * hdr->e_shstrndx) ); stroff = shdr.sh_offset; /* walk throught each section and find the .got section */ for (int i = 0; i < hdr->e_shnum; ++i) { smemfs_pread(inode, &shdr, sizeof(Elf32_Shdr), shoff); smemfs_pread(inode, name, 5, shdr.sh_name + stroff); if (strcmp(name, ".got") != 0) { shoff += sizeof(Elf32_Shdr); continue; } got = kernel->memory.program.start; got = (void*)((uintptr_t)got + (uintptr_t)shdr.sh_addr); terminal_write(" GOT section found at %p...\n", got); for (uint32_t j = 0 ; j < shdr.sh_size >> 2 ; ++j) { terminal_write(" path symbols %p...\n", got[j]); got[j] += (uintptr_t)kernel->hardware.ram.physical.kernel_addr; got[j] |= (uintptr_t)0x80000000; } return (0); } return (-1); }