/branches/dynload/uspace/lib/rtld/include/arch.h |
---|
37,8 → 37,7 |
#include <rtld.h> |
void rel_table_process(module_t *m, elf_rel_t *rt, size_t rt_size, |
module_t *dest); |
void rel_table_process(module_t *m, elf_rel_t *rt, size_t rt_size); |
#endif |
/branches/dynload/uspace/lib/rtld/include/elf_dyn.h |
---|
100,6 → 100,17 |
#define DT_LOPROC 0x70000000 |
#define DT_HIPROC 0x7fffffff |
/* |
* Special section indexes |
*/ |
#define SHN_UNDEF 0 |
#define SHN_LORESERVE 0xff00 |
#define SHN_LOPROC 0xff00 |
#define SHN_HIPROC 0xff1f |
#define SHN_ABS 0xfff1 |
#define SHN_COMMON 0xfff2 |
#define SHN_HIRESERVE 0xffff |
#endif |
/** @} |
/branches/dynload/uspace/lib/rtld/include/rtld.h |
---|
44,8 → 44,16 |
size_t bias; |
} module_t; |
typedef struct { |
module_t *program; |
module_t *rtld; |
module_t *libc; |
} runtime_env_t; |
void _rtld_main(void); |
extern runtime_env_t runtime_env; |
#endif |
/** @} |
/branches/dynload/uspace/lib/rtld/include/symbol.h |
---|
38,7 → 38,7 |
#include <rtld.h> |
#include <elf.h> |
elf_symbol_t *symbol_def_find(module_t *m, char *name); |
elf_symbol_t *symbol_def_find(char *name, module_t **m); |
#endif |
/branches/dynload/uspace/lib/rtld/dynamic.c |
---|
53,6 → 53,9 |
printf("memset\n"); |
memset(info, 0, sizeof(info)); |
soname_idx = 0; |
rpath_idx = 0; |
printf("pass 1\n"); |
while (dp->d_tag != DT_NULL) { |
d_ptr = (void *)((uint8_t *)dp->d_un.d_ptr + bias); |
91,6 → 94,10 |
info->soname = info->str_tab + soname_idx; |
info->rpath = info->str_tab + rpath_idx; |
printf("str_tab=0x%x, soname_idx=0x%x, soname=0x%x\n", |
(uintptr_t)info->soname, soname_idx, (uintptr_t)info->soname); |
printf("soname='%s'\n", info->soname); |
printf("rpath='%s'\n", info->rpath); |
/* |
* Now that we have a pointer to the string table, |
/branches/dynload/uspace/lib/rtld/rtld.c |
---|
44,6 → 44,8 |
#include <elf_load.h> |
#include <arch.h> |
runtime_env_t runtime_env; |
void _rtld_main(void) |
{ |
pcb_t *pcb; |
59,6 → 61,7 |
pcb = (pcb_t *)PCB_ADDRESS; |
dynamic_parse(pcb->dynamic, 0, &prog.dyn); |
prog.bias = 0; |
prog.dyn.soname = "[program]"; |
printf("Program requested library '%s'\n", prog.dyn.needed); |
70,11 → 73,18 |
dynamic_parse(lib_info.dynamic, 0x20000, &lib.dyn); |
lib.bias = 0x20000; |
printf("lib.bias=0x%x\n", lib.bias); |
runtime_env.program = &prog; |
runtime_env.libc = &lib; |
runtime_env.rtld = NULL; |
/* Parse program's relocation tables */ |
rel_table_process(&prog, prog.dyn.rel, prog.dyn.rel_sz, &lib); |
rel_table_process(&prog, prog.dyn.jmp_rel, prog.dyn.plt_rel_sz, &lib); |
rel_table_process(&prog, prog.dyn.rel, prog.dyn.rel_sz); |
rel_table_process(&prog, prog.dyn.jmp_rel, prog.dyn.plt_rel_sz); |
printf("lib.bias=0x%x\n", lib.bias); |
printf("Run program..\n"); |
pcb->entry(); |
} |
/branches/dynload/uspace/lib/rtld/symbol.c |
---|
42,7 → 42,7 |
#include <symbol.h> |
#include <elf.h> |
elf_symbol_t *symbol_def_find(module_t *m, char *name) |
static elf_symbol_t *def_find_in_module(char *name, module_t *m) |
{ |
elf_symbol_t *sym_table; |
elf_symbol_t *sym; |
49,8 → 49,10 |
elf_word nchain; |
size_t i; |
char *s_name; |
char *module_name; |
printf("symbol_def_find(m, '%s')\n", name); |
module_name = m->dyn.soname; |
printf("def_find_in_module('%s', %s)\n", name, module_name); |
sym_table = m->dyn.sym_tab; |
nchain = m->dyn.hash[1]; |
60,8 → 62,13 |
s_name = m->dyn.str_tab + sym->st_name; |
printf("cmp sym '%s'\n", s_name); |
if (strcmp(name, s_name) == 0) { |
printf("found. idx=%d\n", i); |
return sym; |
printf("name match\n"); |
if (sym->st_shndx != SHN_UNDEF) { |
printf("definition found. idx=%d\n", i); |
return sym; |
} else { |
printf("not a definition\n"); |
} |
} |
} |
69,5 → 76,24 |
return NULL; |
} |
elf_symbol_t *symbol_def_find(char *name, module_t **m) |
{ |
elf_symbol_t *sym; |
sym = def_find_in_module(name, runtime_env.program); |
if (sym != NULL) { *m = runtime_env.program; return sym; } |
sym = def_find_in_module(name, runtime_env.libc); |
if (sym != NULL) { *m = runtime_env.libc; return sym; } |
/* sym = def_find_in_module(name, runtime_env.rtld); |
if (sym != NULL) { *m = runtime_env.rtld; return sym; }*/ |
printf("symbol found nowhere\n"); |
*m = NULL; |
return NULL; |
} |
/** @} |
*/ |
/branches/dynload/uspace/lib/rtld/arch/ia32/src/reloc.c |
---|
44,8 → 44,7 |
/** |
* Process (fixup) all relocations in a relocation table. |
*/ |
void rel_table_process(module_t *m, elf_rel_t *rt, size_t rt_size, |
module_t *dest) |
void rel_table_process(module_t *m, elf_rel_t *rt, size_t rt_size) |
{ |
int i; |
62,6 → 61,7 |
char *str_tab; |
elf_symbol_t *sym_def; |
module_t *dest; |
printf("parse relocation table\n"); |
88,7 → 88,9 |
r_ptr = (uint32_t *)(r_offset + m->bias); |
printf("rel_type: %x, rel_offset: 0x%x\n", rel_type, r_offset); |
sym_def = symbol_def_find(dest, str_tab + sym->st_name); |
sym_def = symbol_def_find(str_tab + sym->st_name, &dest); |
printf("dest name: '%s'\n", dest->dyn.soname); |
printf("dest bias: 0x%x\n", dest->bias); |
if (sym_def) { |
sym_addr = sym_def->st_value + dest->bias; |
printf("symbol definition found, addr=0x%x\n", sym_addr); |
111,7 → 113,7 |
case R_386_RELATIVE: |
printf("fixup R_386_RELATIVE (b+a)\n"); |
*r_ptr += dest->bias; |
*r_ptr += m->bias; |
break; |
} |
} |