Subversion Repositories HelenOS

Compare Revisions

Ignore whitespace Rev 3551 → Rev 3552

/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