Go to the documentation of this file.
64 if ((binaryHeader->
e_ident[1] !=
'E') && (binaryHeader->
e_ident[2] !=
'L') && (binaryHeader->
e_ident[3] !=
'F')) {
70 real_base_addr = *addr;
86 for (numsegs = 0x0, i = 0x0; i < binaryHeader->
e_phnum; i++) {
87 switch (programHeader[i].p_type) {
93 for (x = 0x0; x < (programHeader[i].
p_memsz + 0xFFF); x += 0x1000) {
97 K_PANIC(
"Error: Remap Page Failed");
99 memset((
void *) ((programHeader[i].p_vaddr & 0xFFFFF000) + x + real_base_addr), 0x0, 0x1000);
103 fseek(exec_fd, programHeader[i].p_offset, 0);
104 fread((
void *) programHeader[i].p_vaddr + real_base_addr, programHeader[i].p_filesz, 1, exec_fd);
106 if ((programHeader[i].p_flags & 0x2) != 0x2) {
107 for (x = 0x0; x < (programHeader[i].
p_memsz); x += 0x1000) {
109 K_PANIC(
"vmm_setPageAttributes failed");
113 base_addr = programHeader[i].
p_vaddr + real_base_addr;
121 *entry = binaryHeader->
e_entry + real_base_addr;
129 if (binaryHeader != 0x0)
133 if (programHeader != 0x0)
134 kfree(programHeader);
142 }
elfType[] = { {
"ET_NONE", 0 }, {
"ET_REL", 1 }, {
"ET_EXEC", 2 }, {
"ET_DYN", 3 }, {
"ET_CORE", 4 }, {
"ET_LOPROC", 0xff00 }, {
"ET_HIPROC", 0xffff }, };
147 }
elfPhType[] = { {
"PT_NULL", 0 }, {
"PT_LOAD", 1 }, {
"PT_DYNAMIC", 2 }, {
"PT_INTERP", 3 }, {
"PT_NOTE", 4 }, {
"PT_SHLIB", 5 }, {
"PT_PHDR", 6 }, {
"PT_LOPROC", 0x70000000 }, {
"PT_HIPROC", 0x7fffffff }, };
152 }
elfShType[] = { {
"SHT_NULL", 0 }, {
"SHT_PROGBITS", 1 }, {
"SHT_SYMTAB", 2 }, {
"SHT_STRTAB", 3 }, {
"SHT_RELA", 4 }, {
"SHT_HASH", 5 }, {
"SHT_DYNAMIC", 6 }, {
"SHT_NOTE", 7 }, {
"SHT_NOBITS", 8 }, {
"SHT_REL", 9 }, {
"SHT_SHLIB", 10 }, {
"SHT_DYNSYM", 11 }, };
157 }
elfRelType[] = { {
"R_386_NONE", 0 }, {
"R_386_32", 1 }, {
"R_386_PC32", 2 }, {
"R_386_GOT32", 3 }, {
"R_386_PLT32", 4 }, {
"R_386_COPY", 5 }, {
"R_386_GLOB_DAT", 6 }, {
"R_386_JMP_SLOT", 7 }, {
"R_386_RELATIVE", 8 }, {
"R_386_GOTOFF", 9 }, {
"R_386_GOTPC", 10 }, };
fileDescriptor_t * fopen(const char *file, const char *flags)
unsigned char e_ident[EI_NIDENT]
size_t fread(void *ptr, size_t size, size_t nmemb, fileDescriptor_t *fd)
void kfree(void *baseAddr)
uint32_t vmm_findFreePage(pidType pid)
int elf_load_file(kTask_t *p, const char *file, uint32_t *addr, uint32_t *entry)
int vmm_setPageAttributes(uint32_t, uint16_t)
int fclose(fileDescriptor_t *fd)
int vmm_remapPage(uint32_t, uint32_t, uint16_t, pidType, int haveLock)
const struct @28 elfRelType[]
const struct @26 elfPhType[]
const struct @25 elfType[]
const struct @27 elfShType[]
void * kmalloc(uInt32 len)
void * memset(void *dst, int c, size_t length)
char * elfGetRelType(int relType)
char * elfGetPhType(int phType)
char * elfGetShType(int shType)
int fseek(fileDescriptor_t *tmpFd, long offset, int whence)