Subversion Repositories HelenOS

Compare Revisions

Ignore whitespace Rev 2980 → Rev 2979

/branches/dynload/uspace/lib/rtld/include/arch.h
37,7 → 37,8
 
#include <rtld.h>
 
void rel_table_process(module_t *m, elf_rel_t *rt, size_t rt_size);
void rel_table_process(module_t *m, elf_rel_t *rt, size_t rt_size,
module_t *dest);
 
#endif
 
/branches/dynload/uspace/lib/rtld/include/elf_dyn.h
100,17 → 100,6
#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/symbol.h
38,7 → 38,7
#include <rtld.h>
#include <elf.h>
 
elf_symbol_t *symbol_def_find(char *name, module_t **m);
elf_symbol_t *symbol_def_find(module_t *m, char *name);
 
#endif
 
/branches/dynload/uspace/lib/rtld/include/rtld.h
44,16 → 44,8
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/rtld.c
44,8 → 44,6
#include <elf_load.h>
#include <arch.h>
 
runtime_env_t runtime_env;
 
void _rtld_main(void)
{
pcb_t *pcb;
61,7 → 59,6
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);
73,18 → 70,11
 
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);
rel_table_process(&prog, prog.dyn.jmp_rel, prog.dyn.plt_rel_sz);
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);
 
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>
 
static elf_symbol_t *def_find_in_module(char *name, module_t *m)
elf_symbol_t *symbol_def_find(module_t *m, char *name)
{
elf_symbol_t *sym_table;
elf_symbol_t *sym;
49,10 → 49,8
elf_word nchain;
size_t i;
char *s_name;
char *module_name;
 
module_name = m->dyn.soname;
printf("def_find_in_module('%s', %s)\n", name, module_name);
printf("symbol_def_find(m, '%s')\n", name);
 
sym_table = m->dyn.sym_tab;
nchain = m->dyn.hash[1];
62,13 → 60,8
s_name = m->dyn.str_tab + sym->st_name;
printf("cmp sym '%s'\n", s_name);
if (strcmp(name, s_name) == 0) {
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");
}
printf("found. idx=%d\n", i);
return sym;
}
}
 
76,24 → 69,5
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,7 → 44,8
/**
* Process (fixup) all relocations in a relocation table.
*/
void rel_table_process(module_t *m, elf_rel_t *rt, size_t rt_size)
void rel_table_process(module_t *m, elf_rel_t *rt, size_t rt_size,
module_t *dest)
{
int i;
 
61,7 → 62,6
char *str_tab;
elf_symbol_t *sym_def;
module_t *dest;
 
printf("parse relocation table\n");
 
88,9 → 88,7
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(str_tab + sym->st_name, &dest);
printf("dest name: '%s'\n", dest->dyn.soname);
printf("dest bias: 0x%x\n", dest->bias);
sym_def = symbol_def_find(dest, str_tab + sym->st_name);
if (sym_def) {
sym_addr = sym_def->st_value + dest->bias;
printf("symbol definition found, addr=0x%x\n", sym_addr);
113,7 → 111,7
case R_386_RELATIVE:
printf("fixup R_386_RELATIVE (b+a)\n");
*r_ptr += m->bias;
*r_ptr += dest->bias;
break;
}
}
/branches/dynload/uspace/lib/rtld/dynamic.c
53,9 → 53,6
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);
94,10 → 91,6
 
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,