46,6 → 46,23 |
|
runtime_env_t runtime_env; |
|
void module_process_relocs(module_t *m) |
{ |
if (m->dyn.plt_rel == DT_REL) { |
if (m->dyn.rel != NULL) |
rel_table_process(m, m->dyn.rel, m->dyn.rel_sz); |
/* FIXME: this seems wrong */ |
if (m->dyn.jmp_rel != NULL) |
rel_table_process(m, m->dyn.jmp_rel, m->dyn.plt_rel_sz); |
} else { /* (m->dyn.plt_rel == DT_RELA) */ |
printf("table type DT_RELA\n"); |
if (m->dyn.rela != NULL) { |
printf("non-empty\n"); |
rela_table_process(m, m->dyn.rela, m->dyn.rela_sz); |
} |
} |
} |
|
void _rtld_main(void) |
{ |
pcb_t *pcb; |
56,19 → 73,22 |
int rc; |
|
printf("Hello, world! (from rtld)\n"); |
getchar(); |
// getchar(); |
|
/* rtld_dynamic and rtld->bias were filled out by the bootstrap code */ |
rtld = &runtime_env.rtld; |
printf("Parse rtld .dynamic section at 0x%x\n", runtime_env.rtld_dynamic); |
dynamic_parse(runtime_env.rtld_dynamic, rtld->bias, &rtld->dyn); |
// getchar(); |
|
printf("Parse .dynamic section\n"); |
pcb = __pcb_get(); |
printf("Parse program .dynamic section at 0x%x\n", pcb->dynamic); |
dynamic_parse(pcb->dynamic, 0, &prog.dyn); |
prog.bias = 0; |
prog.dyn.soname = "[program]"; |
|
printf("Program requested library '%s'\n", prog.dyn.needed); |
// getchar(); |
|
rc = elf_load_file("/libc.so.0", 0x20000, &lib_info); |
if (rc < 0) { |
85,21 → 105,16 |
|
/* Parse program's relocation tables */ |
printf("Resolve references in program\n"); |
if (prog.dyn.rel != NULL) |
rel_table_process(&prog, prog.dyn.rel, prog.dyn.rel_sz); |
if (prog.dyn.jmp_rel != NULL) |
rel_table_process(&prog, prog.dyn.jmp_rel, prog.dyn.plt_rel_sz); |
module_process_relocs(&prog); |
|
/* Parse lib's relocation tables */ |
printf("Resolve references in library\n"); |
if (lib.dyn.rel != NULL) |
rel_table_process(&lib, lib.dyn.rel, lib.dyn.rel_sz); |
if (lib.dyn.jmp_rel != NULL) |
rel_table_process(&lib, lib.dyn.jmp_rel, lib.dyn.plt_rel_sz); |
module_process_relocs(&lib); |
|
printf("lib.bias=0x%x\n", lib.bias); |
|
printf("Run program..\n"); |
printf("Run program.. (at 0x%x)\n", (uintptr_t)pcb->entry); |
getchar(); |
pcb->entry(); |
} |
|