Subversion Repositories HelenOS

Compare Revisions

Ignore whitespace Rev 2979 → Rev 2980

/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;
}
}