/branches/dynload/uspace/lib/rtld/arch/ppc32/Makefile.inc |
---|
31,6 → 31,6 |
ARCH_SOURCES := \ |
arch/$(ARCH)/src/bootstrap.c \ |
arch/$(ARCH)/src/runtime.c \ |
arch/$(ARCH)/src/reloc.c |
arch/$(ARCH)/src/runtime.c |
# arch/$(ARCH)/src/reloc.c |
/branches/dynload/uspace/lib/rtld/arch/ppc32/src/reloc.c |
---|
File deleted |
/branches/dynload/uspace/lib/rtld/arch/ppc32/src/bootstrap.c |
---|
160,7 → 160,7 |
* -fno-jump-tables. |
*/ |
switch (tag) { |
case DT_PLTRELSZ: jmp_rel_entries = dval/sizeof(elf_rela_t); break; |
case DT_PLTRELSZ: jmp_rel_entries = dval/8; break; |
case DT_JMPREL: jmp_rel_table = dptr; break; |
case DT_PLTGOT: |
/* PLT address */ |
167,7 → 167,7 |
plt = dptr; break; |
case DT_SYMTAB: sym_table = dptr; break; |
case DT_RELA: rel_table = dptr; break; |
case DT_RELASZ: rel_entries = dval / sizeof(elf_rela_t); break; |
case DT_RELASZ: rel_entries = dval / 8; break; |
default: break; |
} |
291,13 → 291,13 |
} |
kputint(-5); |
kputint(_plt_table[0]); |
} |
/* This will come in handy */ |
runtime_env.rtld_dynamic = dynamic; |
runtime_env.rtld.bias = bias; |
// runtime_env.rtld_dynamic = dynamic; |
// runtime_env.rtld.bias = bias; |
kputint(_plt_table[0]); |
} |
// volatile int ff=1; |
// while(ff); |
test_func(); |
311,15 → 311,15 |
__io_init(); |
kputint(-1); |
kputint(0x52); |
// printf("Hello, world! (from ppc rtld)\n"); |
printf("Hello, world! (from ppc rtld)\n"); |
kputint(0x62); |
// while(1); |
kputint(34); |
_rtld_main(); |
kputint(35); |
__exit(); |
while(1); |
// kputint(34); |
// _rtld_main(); |
// kputint(35); |
// __exit(); |
kputint(36); |
// kputint(36); |
} |
/** @} |
/branches/dynload/uspace/lib/rtld/arch/ia32/src/reloc.c |
---|
41,12 → 41,6 |
#include <symbol.h> |
#include <rtld.h> |
void module_process_pre_arch(module_t *m) |
{ |
/* Unused */ |
} |
/** |
* Process (fixup) all relocations in a relocation table. |
*/ |
133,11 → 127,5 |
} |
void rela_table_process(module_t *m, elf_rela_t *rt, size_t rt_size) |
{ |
/* Unused */ |
(void)m; (void)rt; (void)rt_size; |
} |
/** @} |
*/ |
/branches/dynload/uspace/lib/rtld/rtld.c |
---|
46,23 → 46,6 |
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; |
73,22 → 56,19 |
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) { |
105,16 → 85,21 |
/* Parse program's relocation tables */ |
printf("Resolve references in program\n"); |
module_process_relocs(&prog); |
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); |
/* Parse lib's relocation tables */ |
printf("Resolve references in library\n"); |
module_process_relocs(&lib); |
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); |
printf("lib.bias=0x%x\n", lib.bias); |
printf("Run program.. (at 0x%x)\n", (uintptr_t)pcb->entry); |
getchar(); |
printf("Run program..\n"); |
pcb->entry(); |
} |
/branches/dynload/uspace/lib/rtld/include/arch.h |
---|
37,10 → 37,7 |
#include <rtld.h> |
void module_process_pre_arch(module_t *m); |
void rel_table_process(module_t *m, elf_rel_t *rt, size_t rt_size); |
void rela_table_process(module_t *m, elf_rela_t *rt, size_t rt_size); |
#endif |
/branches/dynload/uspace/lib/rtld/Makefile |
---|
38,7 → 38,7 |
include arch/$(ARCH)/Makefile.inc |
CFLAGS += -I../../app/iloader/include -Iinclude -fPIC -O0 -ggdb |
LFLAGS += -shared --no-undefined -Bsymbolic |
LFLAGS = -shared --no-undefined |
LIBS = $(LIBC_PREFIX)/libc.pic.a $(SOFTINT_PREFIX)/libsoftint.pic.a |
DEFS += -DRELEASE=\"$(RELEASE)\" |