/branches/dynload/uspace/lib/rtld/module.c |
---|
135,7 → 135,7 |
m->bias = 0x20000; |
printf("filename:'%s'\n", name_buf); |
rc = elf_load_file(name_buf, m->bias, &info); |
rc = elf_load_file(name_buf, m->bias, ELDF_RW, &info); |
if (rc < 0) { |
printf("Failed to load '%s'\n", name_buf); |
exit(1); |
/branches/dynload/uspace/lib/rtld/rtld.c |
---|
52,7 → 52,7 |
void _rtld_main(void) |
{ |
static module_t prog; |
module_t *rtld; |
// module_t *rtld; |
printf("Hello, world! (from rtld)\n"); |
63,9 → 63,9 |
*/ |
/* 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); |
// 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); |
printf("Parse program .dynamic section at 0x%x\n", __pcb->dynamic); |
dynamic_parse(__pcb->dynamic, 0, &prog.dyn); |
75,7 → 75,7 |
/* Initialize list of loaded modules */ |
list_initialize(&runtime_env.modules_head); |
list_append(&prog.modules_link, &runtime_env.modules_head); |
list_append(&rtld->modules_link, &runtime_env.modules_head); |
// list_append(&rtld->modules_link, &runtime_env.modules_head); |
/* Pointer to program module. Used as root of the dependency graph */ |
runtime_env.program = &prog; |
/branches/dynload/uspace/lib/rtld/Makefile |
---|
37,8 → 37,10 |
include $(LIBC_PREFIX)/Makefile.toolchain |
include arch/$(ARCH)/Makefile.inc |
CFLAGS += -Iinclude -I../../srv/loader/include -fPIC -O0 -ggdb |
LFLAGS += -shared --no-undefined -soname rtld.so |
#CFLAGS += -Iinclude -I../../srv/loader/include -fPIC -O0 -ggdb |
#LFLAGS += -shared --no-undefined -soname rtld.so |
CFLAGS += -Iinclude -I../../srv/loader/include -O0 -ggdb |
LFLAGS += |
LIBS = $(LIBC_PREFIX)/libc.pic.a $(SOFTINT_PREFIX)/libsoftint.pic.a |
DEFS += -DRELEASE=\"$(RELEASE)\" |
54,7 → 56,7 |
## Sources |
# |
OUTPUT = rtld.so |
OUTPUT = rtld |
GENERIC_SOURCES = \ |
rtld.c \ |
elf_load.c \ |
/branches/dynload/uspace/lib/rtld/arch/ia32/_link.ld.in |
---|
6,7 → 6,7 |
} |
SECTIONS { |
. = 0x1000; |
. = 0x40001000; |
.init ALIGN(0x1000) : SUBALIGN(0x1000) { |
*(.init); |
/branches/dynload/uspace/lib/rtld/arch/ia32/src/runtime.c |
---|
58,20 → 58,20 |
void __attribute__ ((__regparm__ (1))) |
*___tls_get_addr(tls_index *ti); |
void __attribute__ ((__regparm__ (1))) |
*___tls_get_addr(tls_index *ti) |
{ |
size_t tls_size; |
uint8_t *tls; |
//void __attribute__ ((__regparm__ (1))) |
// *___tls_get_addr(tls_index *ti) |
//{ |
// size_t tls_size; |
// uint8_t *tls; |
// |
// /* Calculate size of TLS block */ |
// tls_size = ALIGN_UP(&_tbss_end - &_tdata_start, &_tls_alignment); |
// |
// /* The TLS block is just before TCB */ |
// tls = (uint8_t *)__tcb_get() - tls_size; |
// |
// return tls + ti->ti_offset; |
//} |
/* Calculate size of TLS block */ |
tls_size = ALIGN_UP(&_tbss_end - &_tdata_start, &_tls_alignment); |
/* The TLS block is just before TCB */ |
tls = (uint8_t *)__tcb_get() - tls_size; |
return tls + ti->ti_offset; |
} |
/** @} |
*/ |
/branches/dynload/uspace/lib/rtld/arch/ia32/src/bootstrap.c |
---|
105,7 → 105,7 |
rel_entries = 0; |
jmp_rel_table = 0; |
jmp_rel_entries = 0; |
/* |
i = 0; |
while (dynamic[i].d_tag != 0) { |
dptr = (void *)(dynamic[i].d_un.d_val + bias); |
114,9 → 114,9 |
switch (dynamic[i].d_tag) { |
case DT_PLTRELSZ: jmp_rel_entries = dval/8; break; |
case DT_JMPREL: jmp_rel_table = dptr; break; |
case DT_PLTGOT: |
case DT_PLTGOT:*/ |
/* GOT address */ |
got = dptr; break; |
/*got = dptr; break; |
case DT_SYMTAB: sym_table = dptr; break; |
case DT_REL: rel_table = dptr; break; |
case DT_RELSZ: rel_entries = dval / 8; break; |
125,7 → 125,7 |
++i; |
} |
*/ |
// kputint(1); |
// kputint((unsigned)sym_table); |
// kputint((unsigned)rel_table); |
133,7 → 133,7 |
/* Now relocate all our dynsyms */ |
// kputint(-1); |
/* |
for (i=0; i<rel_entries; i++) { |
kputint(i); |
r_offset = rel_table[i].r_offset; |
174,9 → 174,9 |
break; |
} |
} |
*/ |
kputint(-1); |
/* |
for (i=0; i<jmp_rel_entries; i++) { |
kputint(i); |
r_offset = jmp_rel_table[i].r_offset; |
217,7 → 217,7 |
break; |
} |
} |
*/ |
kputint(-1); |
kputint(0x42); |
/branches/dynload/uspace/lib/libc/arch/ia32/src/tls.c |
---|
36,6 → 36,7 |
#include <tls.h> |
#include <sys/types.h> |
#include <align.h> |
tcb_t * __alloc_tls(void **data, size_t size) |
{ |
47,5 → 48,32 |
tls_free_variant_2(tcb, size); |
} |
//#ifdef __SHARED__ |
typedef struct { |
unsigned long int ti_module; |
unsigned long int ti_offset; |
} tls_index; |
void __attribute__ ((__regparm__ (1))) |
*___tls_get_addr(tls_index *ti); |
void __attribute__ ((__regparm__ (1))) |
*___tls_get_addr(tls_index *ti) |
{ |
size_t tls_size; |
uint8_t *tls; |
/* Calculate size of TLS block */ |
tls_size = ALIGN_UP(&_tbss_end - &_tdata_start, &_tls_alignment); |
/* The TLS block is just before TCB */ |
tls = (uint8_t *)__tcb_get() - tls_size; |
return tls + ti->ti_offset; |
} |
//#endif |
/** @} |
*/ |
/branches/dynload/uspace/lib/libc-shared/Makefile |
---|
41,7 → 41,8 |
LFLAGS = -shared -soname libc.so.0 --whole-archive |
LIBS = $(LIBC_PREFIX)/libc.pic.a $(SOFTINT_PREFIX)/libsoftint.a $(RTLD_PREFIX)/rtld.so |
LIBS = $(LIBC_PREFIX)/libc.pic.a $(SOFTINT_PREFIX)/libsoftint.a |
# $(RTLD_PREFIX)/rtld.so |
DEFS += -DRELEASE=\"$(RELEASE)\" |
ifdef REVISION |