/branches/dynload/uspace/app/dltest/dltest.c |
---|
66,13 → 66,13 |
int main(int argc, char *argv[]) |
{ |
kputint(-1); |
// kputint(-1); |
/* kputint(0x100); |
printf("Hello from dltest!\n"); |
kputint(0x200); |
while(1);*/ |
printf("Hello from dltest!\n"); |
while(1); |
// while(1); |
return 0; |
} |
/branches/dynload/uspace/app/dltest/Makefile |
---|
38,7 → 38,7 |
include $(LIBC_PREFIX)/Makefile.toolchain |
CFLAGS += -I../../lib/libc -O0 |
LFLAGS := -Bdynamic -I/lib/rtld.so -rpath-link $(RTLD_PREFIX) |
LFLAGS := -Bdynamic -I/lib/rtld -rpath-link $(RTLD_PREFIX) |
# LIBS = $(LIBC_PREFIX)/libc.a |
LIBS = ../../lib/libc-shared/libc.so.0 |
/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 |
/branches/dynload/uspace/srv/loader/include/elf_load.h |
---|
42,6 → 42,11 |
#include "elf.h" |
typedef enum { |
/** Leave all segments in RW access mode. */ |
ELDF_RW = 1 |
} eld_flags_t; |
/** |
* Some data extracted from the headers are stored here |
*/ |
66,6 → 71,9 |
/** Difference between run-time addresses and link-time addresses */ |
uintptr_t bias; |
/** Flags passed to the ELF loader. */ |
eld_flags_t flags; |
/** A copy of the ELF file header */ |
elf_header_t *header; |
73,7 → 81,8 |
elf_info_t *info; |
} elf_ld_t; |
int elf_load_file(char *file_name, size_t so_bias, elf_info_t *info); |
int elf_load_file(char *file_name, size_t so_bias, eld_flags_t flags, |
elf_info_t *info); |
void elf_run(elf_info_t *info, pcb_t *pcb); |
void elf_create_pcb(elf_info_t *info, pcb_t *pcb); |
/branches/dynload/uspace/srv/loader/main.c |
---|
231,7 → 231,7 |
// printf("Load program '%s'\n", pathname); |
rc = elf_load_file(pathname, 0, &prog_info); |
rc = elf_load_file(pathname, 0, 0, &prog_info); |
if (rc < 0) { |
printf("failed to load program\n"); |
ipc_answer_0(rid, EINVAL); |
254,7 → 254,7 |
} |
printf("Load dynamic linker '%s'\n", prog_info.interp); |
rc = elf_load_file(prog_info.interp, RTLD_BIAS, &interp_info); |
rc = elf_load_file(prog_info.interp, RTLD_BIAS, 0, &interp_info); |
if (rc < 0) { |
printf("failed to load dynamic linker\n"); |
ipc_answer_0(rid, EINVAL); |
/branches/dynload/uspace/srv/loader/elf_load.c |
---|
99,7 → 99,8 |
* |
* @return EOK on success or negative error code. |
*/ |
int elf_load_file(char *file_name, size_t so_bias, elf_info_t *info) |
int elf_load_file(char *file_name, size_t so_bias, eld_flags_t flags, |
elf_info_t *info) |
{ |
elf_ld_t elf; |
116,6 → 117,7 |
elf.fd = fd; |
elf.info = info; |
elf.flags = flags; |
rc = elf_load(&elf, so_bias); |
307,8 → 309,8 |
return load_segment(elf, entry); |
break; |
case PT_INTERP: |
/* Assume silently interp == "/lib/rtld.so" */ |
elf->info->interp = "/lib/rtld.so"; |
/* Assume silently interp == "/lib/rtld" */ |
elf->info->interp = "/lib/rtld"; |
break; |
case PT_DYNAMIC: |
case PT_SHLIB: |
425,7 → 427,13 |
dp += now; |
} |
// printf("set area flags to %d\n", flags); |
/* |
* The caller wants to modify the segments first. He will then |
* need to set the right access mode and ensure SMC coherence. |
*/ |
if ((elf->flags & ELDF_RW) != 0) return EE_OK; |
printf("set area flags to %d\n", flags); |
rc = as_area_change_flags((uint8_t *)entry->p_vaddr + bias, flags); |
if (rc != 0) { |
printf("failed to set memory area flags\n"); |
/branches/dynload/boot/arch/ia32/Makefile.inc |
---|
56,7 → 56,7 |
$(USPACEDIR)/app/bdsh/bdsh |
RD_LIBS = \ |
$(USPACEDIR)/lib/rtld/rtld.so \ |
$(USPACEDIR)/lib/rtld/rtld \ |
$(USPACEDIR)/lib/libc-shared/libc.so.0 |
build: $(BASE)/image.iso |