50 Elf_Ehdr *binaryHeader = 0x0;
51 Elf_Phdr *programHeader = 0x0;
52 Elf_Shdr *sectionHeader = 0x0;
53 Elf_Sym *relSymTab = 0x0;
54 Elf_Rel *elfRel = 0x0;
55 Elf_Rela *elfRela = 0x0;
59 ldFd =
fopen(interp,
"rb");
62 ldFd =
fopen(
"sys:/libexec/ld.so",
"rb");
67 fseek(ldFd, 0x0, 0x0);
73 programHeader = (Elf_Phdr *)
kmalloc(
sizeof(Elf_Phdr) * binaryHeader->e_phnum);
76 fseek(ldFd, binaryHeader->e_phoff, 0);
77 fread(programHeader,
sizeof(Elf_Shdr), binaryHeader->e_phnum, ldFd);
79 sectionHeader = (Elf_Shdr *)
kmalloc(
sizeof(Elf_Shdr) * binaryHeader->e_shnum);
81 fseek(ldFd, binaryHeader->e_shoff, 0);
82 fread(sectionHeader,
sizeof(Elf_Shdr), binaryHeader->e_shnum, ldFd);
84 shStr = (
char *)
kmalloc(sectionHeader[binaryHeader->e_shstrndx].sh_size);
85 fseek(ldFd, sectionHeader[binaryHeader->e_shstrndx].sh_offset, 0);
86 fread(shStr, sectionHeader[binaryHeader->e_shstrndx].sh_size, 1, ldFd);
88 for (i = 0x0; i < binaryHeader->e_phnum; i++) {
89 switch (programHeader[i].p_type) {
91 newLoc = (
char *) programHeader[i].p_vaddr +
LD_START;
96 for (x = 0; x < (programHeader[i].p_memsz); x += 0x1000) {
100 memset((
void *) ((programHeader[i].p_vaddr & 0xFFFFF000) + x +
LD_START), 0x0, 0x1000);
103 fseek(ldFd, programHeader[i].p_offset, 0x0);
104 fread(newLoc, programHeader[i].p_filesz, 1, ldFd);
117 kprintf(
"Unhandled Header (kernel) : %08x\n", programHeader[i].p_type);
122 for (i = 0x0; i < binaryHeader->e_shnum; i++) {
123 switch (sectionHeader[i].sh_type) {
125 if (!
strcmp((shStr + sectionHeader[i].sh_name),
".dynstr")) {
126 dynStr = (
char *)
kmalloc(sectionHeader[i].sh_size);
132 elfRel = (Elf_Rel *)
kmalloc(sectionHeader[i].sh_size);
136 for (x = 0x0; x < sectionHeader[i].sh_size /
sizeof(Elf_Rel); x++) {
153 kprintf(
"relTab [%s][0x%X][0x%X]\n", dynStr + relSymTab[rel].st_name, relSymTab[rel].st_value, relSymTab[rel].st_name);
160 relSymTab = (Elf_Sym *)
kmalloc(sectionHeader[i].sh_size);
161 fseek(ldFd, sectionHeader[i].sh_offset, 0x0);
162 fread(relSymTab, sectionHeader[i].sh_size, 1, ldFd);
183 i = binaryHeader->e_entry +
LD_START;
188 kfree(sectionHeader);
189 kfree(programHeader);