Subversion Repositories HelenOS

Compare Revisions

Ignore whitespace Rev 3221 → Rev 3400

/branches/dynload/uspace/app/dltest/dltest.c
54,10 → 54,12
 
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);
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/rtld.so -rpath-link $(RTLD_PREFIX)
LFLAGS := -Bdynamic -I/lib/rtld.so -rpath-link $(RTLD_PREFIX)
 
# LIBS = $(LIBC_PREFIX)/libc.a
LIBS = ../../lib/libc-shared/libc.so.0
/branches/dynload/uspace/lib/rtld/include/arch.h
File deleted
/branches/dynload/uspace/lib/rtld/include/rtld_arch.h
0,0 → 1,48
/*
* Copyright (c) 2008 Jiri Svoboda
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* - Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* - The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
 
/** @addtogroup generic
* @{
*/
/** @file
*/
 
#ifndef RTLD_ARCH_H_
#define RTLD_ARCH_H_
 
#include <rtld.h>
 
void module_process_pre_arch(module_t *m);
 
void rel_table_process(module_t *m, elf_rel_t *rt, size_t rt_size);
void rela_table_process(module_t *m, elf_rela_t *rt, size_t rt_size);
 
#endif
 
/** @}
*/
/branches/dynload/uspace/lib/rtld/elf_load.c
1,0 → 0,0
link ../../app/iloader/elf_load.c
link ../../srv/loader/elf_load.c
/branches/dynload/uspace/lib/rtld/module.c
39,12 → 39,12
#include <unistd.h>
#include <fcntl.h>
#include <libadt/list.h>
#include <loader/pcb.h>
 
#include <rtld.h>
#include <dynamic.h>
#include <pcb.h>
#include <elf_load.h>
#include <arch.h>
#include <rtld_arch.h>
#include <module.h>
 
/** (Eagerly) process all relocation tables in a module.
126,9 → 126,10
exit(1);
}
 
/* Prepend soname with slash */
/* Prepend soname with '/lib/' */
name_buf[0] = '/';
strcpy(name_buf + 1, name);
strcpy(name_buf, "/lib/");
strcpy(name_buf + 5, name);
 
/* FIXME: need to vary bias / allocate address space */
m->bias = 0x20000;
136,7 → 137,7
 
rc = elf_load_file(name_buf, m->bias, &info);
if (rc < 0) {
printf("Failed to load '%s'\n");
printf("Failed to load '%s'\n", name_buf);
exit(1);
}
 
/branches/dynload/uspace/lib/rtld/rtld.c
37,19 → 37,20
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <loader/pcb.h>
 
#include <rtld.h>
#include <dynamic.h>
#include <pcb.h>
#include <elf_load.h>
#include <module.h>
#include <arch.h>
#include <rtld_arch.h>
 
runtime_env_t runtime_env;
 
void program_run(void *entry, pcb_t *pcb);
 
void _rtld_main(void)
{
pcb_t *pcb;
static module_t prog;
module_t *rtld;
 
66,9 → 67,8
printf("Parse rtld .dynamic section at 0x%x\n", runtime_env.rtld_dynamic);
dynamic_parse(runtime_env.rtld_dynamic, rtld->bias, &rtld->dyn);
 
pcb = __pcb_get();
printf("Parse program .dynamic section at 0x%x\n", pcb->dynamic);
dynamic_parse(pcb->dynamic, 0, &prog.dyn);
printf("Parse program .dynamic section at 0x%x\n", __pcb->dynamic);
dynamic_parse(__pcb->dynamic, 0, &prog.dyn);
prog.bias = 0;
prog.dyn.soname = "[program]";
 
98,9 → 98,29
/*
* Finally, run the main program.
*/
printf("Run program.. (at 0x%x)\n", (uintptr_t)pcb->entry);
pcb->entry();
printf("Run program.. (at 0x%x)\n", (uintptr_t)__pcb->entry);
//__pcb->entry();
program_run(__pcb->entry, __pcb);
}
 
/** Fake main to satisfy dependency from libc */
int main(int argc, char *argv[])
{
return 0;
}
 
typedef void (*ep2)(void *);
 
void program_run(void *entry, pcb_t *pcb)
{
asm (
// "xorl %%ebx, %%ebx\n"
// "movl 0(%%ebx), %%ecx\n"
"mov %%eax, %%ebx\n"
"jmp *%0\n"
:: "m" (entry), "a" (pcb)
);
}
 
/** @}
*/
/branches/dynload/uspace/lib/rtld/Makefile
37,7 → 37,7
include $(LIBC_PREFIX)/Makefile.toolchain
include arch/$(ARCH)/Makefile.inc
 
CFLAGS += -I../../srv/loader/include -Iinclude -fPIC -O0 -ggdb
CFLAGS += -Iinclude -I../../srv/loader/include -fPIC -O0 -ggdb
LFLAGS += -shared --no-undefined -soname rtld.so
 
LIBS = $(LIBC_PREFIX)/libc.pic.a $(SOFTINT_PREFIX)/libsoftint.pic.a
/branches/dynload/uspace/lib/rtld/arch/ia32/Makefile.inc
27,10 → 27,10
#
 
CFLAGS += -D__32_BITS__
LFLAGS += -e __bootstrap
LFLAGS += -e __entry
 
ARCH_SOURCES := \
arch/$(ARCH)/src/entry.s \
arch/$(ARCH)/src/bootstrap.c \
arch/$(ARCH)/src/runtime.c \
arch/$(ARCH)/src/reloc.c
 
/branches/dynload/uspace/lib/rtld/arch/ia32/src/entry.s
28,15 → 28,15
 
.section .text
 
.globl __bootstrap
.globl __entry
.hidden __bootstrap
 
.type __entry, @function
 
## Rtld entry point
#
# %ebx contains the PCB pointer
#
__entry:
mov %ss, %ax
mov %ax, %ds
mov %ax, %es
mov %ax, %fs
 
# Pass the PCB pointer to __bootstrap as the first argument
pushl %ebx
call __bootstrap
/branches/dynload/uspace/lib/rtld/arch/ia32/src/runtime.c
40,14 → 40,14
 
static void kputint(unsigned i)
{
unsigned dummy;
asm volatile (
"movl $31, %%eax;"
"int $0x30"
: "=d" (dummy) /* output - %edx clobbered */
: "d" (i) /* input */
: "%eax","%ecx" /* all scratch registers clobbered */
);
// unsigned dummy;
// asm volatile (
// "movl $31, %%eax;"
// "int $0x30"
// : "=d" (dummy) /* output - %edx clobbered */
// : "d" (i) /* input */
// : "%eax","%ecx" /* all scratch registers clobbered */
// );
}
 
typedef struct {
/branches/dynload/uspace/lib/rtld/arch/ia32/src/bootstrap.c
34,12 → 34,12
* @file
*/
 
#include <loader/pcb.h>
#include <elf_dyn.h>
#include <rtld.h>
#include <pcb.h>
 
void __main(void);
void __io_init(void);
void __main(pcb_t *pcb);
//void __io_init(void);
void __exit(void);
 
static void kputint(unsigned i)
46,15 → 46,15
{
unsigned dummy;
asm volatile (
"movl $31, %%eax;"
"movl $32, %%eax;"
"int $0x30"
: "=d" (dummy) /* output - %edx clobbered */
: "d" (i) /* input */
: "%eax","%ecx" /* all scratch registers clobbered */
);
);
}
 
void __bootstrap(void)
void __bootstrap(pcb_t *pcb)
{
unsigned bias;
unsigned *got;
74,11 → 74,8
elf_rel_t *rel_table;
elf_rel_t *jmp_rel_table;
size_t jmp_rel_entries;
pcb_t *pcb;
pcb = __pcb_get();
 
/* The program loader (iloader) kindly provided us with these */
/* The program loader kindly provided us with these */
dynamic = pcb->rtld_dynamic;
bias = pcb->rtld_bias;
/*
97,6 → 94,7
: "=r" (bias), "=r" (dynamic)
);
*/
kputint(pcb);
kputint(bias);
kputint((unsigned)dynamic);
 
128,13 → 126,13
++i;
}
kputint(1);
kputint((unsigned)sym_table);
kputint((unsigned)rel_table);
kputint((unsigned)rel_entries);
// kputint(1);
// kputint((unsigned)sym_table);
// kputint((unsigned)rel_table);
// kputint((unsigned)rel_entries);
 
/* Now relocate all our dynsyms */
kputint(-1);
// kputint(-1);
for (i=0; i<rel_entries; i++) {
kputint(i);
221,16 → 219,22
}
 
kputint(-1);
kputint(0x42);
 
/* This will come in handy */
__pcb = pcb;
runtime_env.rtld_dynamic = dynamic;
runtime_env.rtld.bias = bias;
 
kputint(0x43);
/* Init libc and run rtld main */
__main();
__main(pcb);
 
kputint(33);
__io_init();
kputint(0x44);
 
// kputint(33);
// __io_init();
kputint(34);
_rtld_main();
kputint(35);
/branches/dynload/uspace/lib/libc/Makefile
54,7 → 54,7
generic/string.c \
generic/fibril.c \
generic/pcb.c \
generic/smc.h \
generic/smc.c \
generic/thread.c \
generic/tls.c \
generic/task.c \
/branches/dynload/uspace/srv/loader/main.c
231,7 → 231,7
}
 
printf("Load dynamic linker '%s'\n", prog_info.interp);
rc = elf_load_file("/rtld.so", RTLD_BIAS, &interp_info);
rc = elf_load_file(prog_info.interp, RTLD_BIAS, &interp_info);
if (rc < 0) {
printf("failed to load dynamic linker\n");
ipc_answer_0(rid, EINVAL);
245,7 → 245,9
pcb.rtld_bias = RTLD_BIAS;
 
printf("run dynamic linker\n");
printf("entry point: 0x%llx\n", interp_info.entry);
printf("rtld_dynamic = 0x%lx\n", pcb.rtld_dynamic);
printf("entry point: 0x%lx\n", interp_info.entry);
printf("pcb address: 0x%lx\n", &pcb);
close_console();
 
ipc_answer_0(rid, EOK);
/branches/dynload/uspace/srv/loader/elf_load.c
97,7 → 97,7
 
fd = open(file_name, O_RDONLY);
if (fd < 0) {
printf("failed opening file\n");
printf("failed opening file (error %d)\n", fd);
return -1;
}
 
286,8 → 286,8
return load_segment(elf, entry);
break;
case PT_INTERP:
/* Assume silently interp == "/rtld.so" */
elf->info->interp = "/rtld.so";
/* Assume silently interp == "/lib/rtld.so" */
elf->info->interp = "/lib/rtld.so";
break;
case PT_DYNAMIC:
case PT_SHLIB:
/branches/dynload/uspace/Makefile
36,6 → 36,8
lib/libfs \
lib/softint \
lib/softfloat \
lib/rtld \
lib/libc-shared \
srv/ns \
srv/loader \
srv/fb \
49,6 → 51,7
app/tetris \
app/tester \
app/cli \
app/dltest \
app/klog \
app/init
 
/branches/dynload/boot/arch/ia32/Makefile.inc
44,11 → 44,16
$(USPACEDIR)/app/tetris/tetris \
$(USPACEDIR)/app/tester/tester \
$(USPACEDIR)/app/cli/cli \
$(USPACEDIR)/app/dltest/dltest \
$(USPACEDIR)/app/klog/klog
 
RD_LIBS = \
$(USPACEDIR)/lib/rtld/rtld.so \
$(USPACEDIR)/lib/libc-shared/libc.so.0
 
build: $(BASE)/image.iso
 
$(BASE)/image.iso: arch/$(ARCH)/grub/stage2_eltorito arch/$(ARCH)/grub/menu.lst $(KERNELDIR)/kernel.bin $(INIT_TASKS) $(RD_TASKS)
$(BASE)/image.iso: arch/$(ARCH)/grub/stage2_eltorito arch/$(ARCH)/grub/menu.lst $(KERNELDIR)/kernel.bin $(INIT_TASKS) $(RD_TASKS) $(RD_LIBS)
mkdir -p arch/$(ARCH)/iso/boot/grub
cp arch/$(ARCH)/grub/stage2_eltorito arch/$(ARCH)/iso/boot/grub/
cp arch/$(ARCH)/grub/menu.lst arch/$(ARCH)/iso/boot/grub/
59,6 → 64,9
for task in $(RD_TASKS) ; do \
cp $$task $(USPACEDIR)/dist/sbin/ ; \
done
for task in $(RD_LIBS) ; do \
cp $$task $(USPACEDIR)/dist/lib/ ; \
done
$(BASE)/tools/mktmpfs.py 4096 $(USPACEDIR)/dist/ arch/$(ARCH)/iso/boot/initrd.img
mkisofs -J -r -b boot/grub/stage2_eltorito -no-emul-boot -boot-load-size 4 -boot-info-table -o $(BASE)/image.iso arch/$(ARCH)/iso/
 
66,5 → 74,8
-for task in $(RD_TASKS) ; do \
rm -f $(USPACEDIR)/dist/sbin/`basename $$task` ; \
done
-for lib in $(RD_LIBS) ; do \
rm -f $(USPACEDIR)/dist/lib/`basename $$lib` ; \
done
-rm -fr arch/$(ARCH)/iso
-rm -f $(BASE)/image.iso