Subversion Repositories HelenOS

Compare Revisions

Ignore whitespace Rev 3680 → Rev 3681

/branches/dynload/uspace/lib/rtld/rtld.c
34,75 → 34,9
* @file
*/
 
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <loader/pcb.h>
 
#include <rtld.h>
#include <dynamic.h>
#include <elf_load.h>
#include <module.h>
#include <rtld_arch.h>
 
runtime_env_t runtime_env;
 
void program_run(void *entry, pcb_t *pcb);
 
static void rtld_main(void)
{
static module_t prog;
 
DPRINTF("Hello, world! (from rtld)\n");
 
/*
* First we need to process dynamic sections of the executable
* program and insert it into the module graph.
*/
 
DPRINTF("Parse program .dynamic section at 0x%x\n", __pcb->dynamic);
dynamic_parse(__pcb->dynamic, 0, &prog.dyn);
prog.bias = 0;
prog.dyn.soname = "[program]";
 
/* Initialize list of loaded modules */
list_initialize(&runtime_env.modules_head);
list_append(&prog.modules_link, &runtime_env.modules_head);
 
/* Pointer to program module. Used as root of the module graph. */
runtime_env.program = &prog;
 
/*
* Now we can continue with loading all other modules.
*/
 
DPRINTF("Load all program dependencies\n");
module_load_deps(&prog);
 
/*
* Now relocate/link all modules together.
*/
 
/* Process relocations in all modules */
DPRINTF("Relocate all modules\n");
modules_process_relocs();
 
/*
* Finally, run the main program.
*/
DPRINTF("Run program.. (at 0x%lx)\n", (uintptr_t)__pcb->entry);
 
#ifndef RTLD_DEBUG
close_console();
#endif
program_run(__pcb->entry, __pcb);
}
 
int main(int argc, char *argv[])
{
rtld_main();
return 0;
}
 
/** @}
*/
/branches/dynload/uspace/lib/rtld/Makefile
33,7 → 33,6
#
 
LIBC_PREFIX = ../../lib/libc
SOFTINT_PREFIX = ../../lib/softint
include $(LIBC_PREFIX)/Makefile.toolchain
include arch/$(ARCH)/Makefile.inc
 
42,7 → 41,6
CFLAGS += -Iinclude -I../../srv/loader/include -O0 -ggdb
LFLAGS +=
 
LIBS = $(LIBC_PREFIX)/libc.pic.a $(SOFTINT_PREFIX)/libsoftint.pic.a
DEFS += -DRELEASE=\"$(RELEASE)\"
 
ifdef REVISION
56,7 → 54,7
## Sources
#
 
OUTPUT = rtld
OUTPUT = librtld.a
GENERIC_SOURCES = \
rtld.c \
elf_load.c \
69,7 → 67,7
 
.PHONY: all clean depend disasm sections inc
 
all: inc $(OUTPUT) disasm sections
all: inc $(OUTPUT)
 
inc:
ln -sfn ../arch/$(ARCH)/include include/arch
83,18 → 81,9
depend:
$(CC) $(DEFS) $(CFLAGS) -M $(ARCH_SOURCES) $(GENERIC_SOURCES)> Makefile.depend
 
$(OUTPUT): $(ARCH_OBJECTS) $(GENERIC_OBJECTS) $(LIBS) arch/$(ARCH)/_link.ld
$(LD) -T arch/$(ARCH)/_link.ld $(ARCH_OBJECTS) $(GENERIC_OBJECTS) $(LIBS) $(LFLAGS) -o $@ -Map $(OUTPUT).map
$(OUTPUT): depend $(ARCH_OBJECTS) $(GENERIC_OBJECTS)
$(AR) rc $(OUTPUT) $(ARCH_OBJECTS) $(GENERIC_OBJECTS)
 
disasm:
$(OBJDUMP) -d -S -s $(OUTPUT) >$(OUTPUT).disasm
 
sections:
$(OBJDUMP) -h $(OUTPUT) >$(OUTPUT).sections
 
arch/$(ARCH)/_link.ld: arch/$(ARCH)/_link.ld.in
$(CC) $(DEFS) $(CFLAGS) -DLIBC_PREFIX=$(LIBC_PREFIX) -E -x c $< | grep -v "^\#" > $@
 
%.o: %.S
$(CC) $(DEFS) $(AFLAGS) $(CFLAGS) -D__ASM__ -c $< -o $@
 
/branches/dynload/uspace/lib/rtld/arch/ppc32/_link.ld.in
File deleted
/branches/dynload/uspace/lib/rtld/arch/ppc32/include/elf_dyn.h
40,7 → 40,11
*/
 
#define R_PPC_ADDR32 1
#define R_PPC_ADDR16_LO 4
#define R_PPC_ADDR16_HI 5
#define R_PPC_ADDR16_HA 6
#define R_PPC_REL24 10
#define R_PPC_COPY 19
#define R_PPC_JMP_SLOT 21
#define R_PPC_RELATIVE 22
 
/branches/dynload/uspace/lib/rtld/arch/ppc32/Makefile.inc
29,5 → 29,4
CFLAGS += -D__32_BITS__
 
ARCH_SOURCES := \
arch/$(ARCH)/src/reloc.c \
arch/$(ARCH)/src/start.s
arch/$(ARCH)/src/reloc.c
/branches/dynload/uspace/lib/rtld/arch/ppc32/src/start.s
File deleted
/branches/dynload/uspace/lib/rtld/arch/ppc32/src/reloc.c
144,6 → 144,7
elf_symbol_t *sym_table;
elf_symbol_t *sym;
uint32_t *r_ptr;
uint16_t *r_ptr16;
char *str_tab;
elf_symbol_t *sym_def;
154,6 → 155,8
uint32_t *_plt_ent;
uint32_t plt_n;
uint32_t pidx;
uint32_t t_addr;
uint32_t sym_size;
 
plt = m->dyn.plt_got;
plt_n = m->dyn.plt_rel_sz / sizeof(elf_rela_t);
184,6 → 187,7
 
rel_type = ELF32_R_TYPE(r_info);
r_ptr = (uint32_t *)(r_offset + m->bias);
r_ptr16 = (uint16_t *)(r_offset + m->bias);
 
if (sym->st_name != 0) {
DPRINTF("rel_type: %x, rel_offset: 0x%x\n", rel_type, r_offset);
201,6 → 205,22
}
 
switch (rel_type) {
case R_PPC_ADDR16_LO:
DPRINTF("fixup R_PPC_ADDR16_LO (#lo(s+a))\n");
*r_ptr16 = (sym_addr + r_addend) & 0xffff;
break;
 
case R_PPC_ADDR16_HI:
DPRINTF("fixup R_PPC_ADDR16_HI (#hi(s+a))\n");
*r_ptr16 = (sym_addr + r_addend) >> 16;
break;
 
case R_PPC_ADDR16_HA:
DPRINTF("fixup R_PPC_ADDR16_HA (#ha(s+a))\n");
t_addr = sym_addr + r_addend;
*r_ptr16 = (t_addr >> 16) + ((t_addr & 0x8000) ? 1 : 0);
break;
 
case R_PPC_JMP_SLOT:
DPRINTF("fixup R_PPC_JMP_SLOT (b+v)\n");
pidx = (r_ptr - _plt_ent) / 2;
217,6 → 237,22
DPRINTF("fixup R_PPC_ADDR32 (b+v+a)\n");
*r_ptr = r_addend + sym_addr;
break;
 
case R_PPC_COPY:
/*
* Copy symbol data from shared object to specified
* location.
*/
DPRINTF("fixup R_PPC_COPY (s)\n");
sym_size = sym->st_size;
if (sym_size != sym_def->st_size) {
printf("warning: mismatched symbol sizes\n");
/* Take the lower value. */
if (sym_size > sym_def->st_size)
sym_size = sym_def->st_size;
}
memcpy(r_ptr, (const void *)sym_addr, sym_size);
break;
case R_PPC_RELATIVE:
DPRINTF("fixup R_PPC_RELATIVE (b+a)\n");
229,7 → 265,7
/*TODO*/
break;
default:
printf("unknown relocation type\n");
printf("unknown relocation type %d\n", rel_type);
break;
}
}
/branches/dynload/uspace/lib/rtld/arch/ia32/_link.ld.in
File deleted
/branches/dynload/uspace/lib/rtld/arch/ia32/Makefile.inc
29,5 → 29,4
CFLAGS += -D__32_BITS__
 
ARCH_SOURCES := \
arch/$(ARCH)/src/reloc.c \
arch/$(ARCH)/src/start.c
arch/$(ARCH)/src/reloc.c
/branches/dynload/uspace/lib/rtld/arch/ia32/src/start.c
File deleted
/branches/dynload/uspace/lib/rtld/arch/ia32/src/reloc.c
124,7 → 124,12
// DPRINTF("fixup R_386_RELATIVE (b+a)\n");
*r_ptr += m->bias;
break;
 
default:
printf("Unknown relocation type %d\n", rel_type);
break;
}
 
}
 
}
/branches/dynload/uspace/lib/libc/shared/Makefile
42,8 → 42,11
 
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)/librtld.a
 
DEFS += -DRELEASE=\"$(RELEASE)\"
 
ifdef REVISION
/branches/dynload/uspace/lib/libc/Makefile.app
30,7 → 30,7
#
 
ifeq ($(CONFIG_SHARED_LIBC),y)
LFLAGS := -Bdynamic -I/lib/rtld -rpath-link $(RTLD_PREFIX)
LFLAGS := -Bdynamic -I/app/dload -rpath-link $(RTLD_PREFIX)
LIBS = $(LIBC_PREFIX)/shared/libc.so.0
LD_SCRIPT = $(LIBC_PREFIX)/shared/arch/$(ARCH)/_link.ld
else