Changes in / [7308e84:04803bf] in mainline


Ignore:
Files:
74 added
12 deleted
25 edited

Legend:

Unmodified
Added
Removed
  • HelenOS.config

    r7308e84 r04803bf  
    525525! [PLATFORM=sparc64&MACHINE=generic] CONFIG_AOUT_ISOFS_B (y)
    526526
     527% Build shared C library
     528! CONFIG_BUILD_SHARED_LIBC (y/n)
     529
     530% Link against shared C library
     531! [CONFIG_BUILD_SHARED_LIBC=y] CONFIG_USE_SHARED_LIBC (n/y)
     532! [CONFIG_BUILD_SHARED_LIBC=n] CONFIG_USE_SHARED_LIBC (n)
     533
    527534% Load disk drivers on startup
    528535! CONFIG_START_BD (n/y)
  • boot/Makefile

    r7308e84 r04803bf  
    5555                cp "$$file" "$(DIST_PATH)/srv/" ; \
    5656        done
     57        for file in $(RD_LIBS) ; do \
     58                cp "$$file" "$(DIST_PATH)/lib/" ; \
     59        done
    5760        for file in $(RD_APPS) ; do \
    5861                cp "$$file" "$(DIST_PATH)/app/" ; \
     
    8386        rm -f $(USPACE_PATH)/dist/srv/*
    8487        rm -rf $(USPACE_PATH)/dist/drv/*
     88        rm -f $(USPACE_PATH)/dist/lib/*
    8589        rm -f $(USPACE_PATH)/dist/app/*
    8690        rm -f $(USPACE_PATH)/dist/cfg/net/*
  • boot/Makefile.common

    r7308e84 r04803bf  
    118118RD_DRV_CFG =
    119119
     120RD_LIBS = \
     121        $(USPACE_PATH)/lib/libtest/libtest.so.0
     122
     123ifeq ($(CONFIG_BUILD_SHARED_LIBC), y)
     124        RD_LIBS += $(USPACE_PATH)/lib/c/shared/libc.so.0
     125        RD_APPS += $(USPACE_PATH)/app/dltest/dltest
     126endif
     127
    120128RD_APPS_ESSENTIAL = \
    121129        $(USPACE_PATH)/app/bdsh/bdsh \
     
    124132
    125133RD_APPS_NON_ESSENTIAL = \
     134        $(USPACE_PATH)/app/dltest2/dltest2 \
     135        $(USPACE_PATH)/app/dload/dload \
    126136        $(USPACE_PATH)/app/edit/edit \
    127137        $(USPACE_PATH)/app/kill/kill \
  • boot/arch/mips32/src/Makefile

    r7308e84 r04803bf  
    11#
    2 # Copyright (c) 2005 Martin Decky
    3 # Copyright (c) 2007 Jakub Jermar
     2# Copyright (c) 2006 Martin Decky
    43# All rights reserved.
    54#
     
    2827#
    2928
    30 include Makefile.common
     29include ../../../../version
     30-include ../../../../Makefile.config
    3131
    32 .PHONY: all clean
     32## Toolchain configuration
     33#
    3334
    34 all: ../../../../version ../../../../Makefile.common ../../../../Makefile.config ../../../../config.h
    35         -[ -f $(DEPEND) ] && mv -f $(DEPEND) $(DEPEND_PREV)
    36         $(MAKE) -f Makefile.build PRECHECK=$(PRECHECK)
     35ifndef CROSS_PREFIX
     36        CROSS_PREFIX = /usr/local
     37endif
     38
     39BFD_ARCH = mips
     40TARGET = mipsel-linux-gnu
     41TOOLCHAIN_DIR = $(CROSS_PREFIX)/mipsel/bin
     42
     43ifeq ($(MACHINE),lgxemul)
     44        BFD_NAME = elf32-tradlittlemips
     45        BFD = ecoff-littlemips
     46endif
     47ifeq ($(MACHINE),bgxemul)
     48        BFD_NAME = elf32-tradbigmips
     49        BFD = ecoff-bigmips
     50        TOOLCHAIN_DIR = $(CROSS_PREFIX)/mips/bin
     51        TARGET = mips-linux-gnu
     52endif
     53ifeq ($(MACHINE),msim)
     54        BFD_NAME = elf32-tradlittlemips
     55        BFD = binary
     56endif
     57
     58ifeq ($(COMPILER),gcc_native)
     59        CC = gcc
     60        AS = as
     61        LD = ld
     62        OBJCOPY = objcopy
     63        OBJDUMP = objdump
     64endif
     65
     66ifeq ($(COMPILER),gcc_cross)
     67        CC = $(TOOLCHAIN_DIR)/$(TARGET)-gcc
     68        AS = $(TOOLCHAIN_DIR)/$(TARGET)-as
     69        LD = $(TOOLCHAIN_DIR)/$(TARGET)-ld
     70        OBJCOPY = $(TOOLCHAIN_DIR)/$(TARGET)-objcopy
     71        OBJDUMP = $(TOOLCHAIN_DIR)/$(TARGET)-objdump
     72endif
     73
     74CFLAGS = -DRELEASE=$(RELEASE) -I. -I../../../generic -imacros ../../../../config.h -nostdinc -nostdlib -fno-builtin -Werror-implicit-function-declaration -Wmissing-prototypes -Werror -O3 -mno-abicalls -G 0 -fno-zero-initialized-in-bss -mhard-float -mips3 -pipe
     75
     76SOURCES = \
     77        main.c \
     78        msim.c \
     79        _components.c \
     80        ../../../generic/printf.c \
     81        ../../../generic/string.c \
     82        asm.S \
     83        boot.S
     84
     85COMPONENTS = \
     86        $(KERNELDIR)/kernel.bin \
     87        $(USPACEDIR)/srv/ns/ns \
     88        $(USPACEDIR)/srv/loader/loader \
     89        $(USPACEDIR)/app/init/init \
     90        $(USPACEDIR)/srv/devmap/devmap \
     91        $(USPACEDIR)/srv/bd/rd/rd \
     92        $(USPACEDIR)/srv/vfs/vfs
     93ifeq ($(RDFMT),tmpfs)
     94        COMPONENTS += $(USPACEDIR)/srv/fs/tmpfs/tmpfs
     95endif
     96ifeq ($(RDFMT),fat)
     97        COMPONENTS += $(USPACEDIR)/srv/fs/fat/fat
     98endif
     99
     100RD_SRVS = \
     101        $(USPACEDIR)/srv/fb/fb \
     102        $(USPACEDIR)/srv/kbd/kbd \
     103        $(USPACEDIR)/srv/console/console \
     104        $(USPACEDIR)/srv/fs/devfs/devfs \
     105        $(USPACEDIR)/srv/fs/tmpfs/tmpfs \
     106        $(USPACEDIR)/srv/fs/fat/fat \
     107        $(USPACEDIR)/srv/bd/file_bd/file_bd \
     108        $(USPACEDIR)/srv/bd/gxe_bd/gxe_bd
     109
     110RD_APPS = \
     111        $(USPACEDIR)/app/getvc/getvc \
     112        $(USPACEDIR)/app/tetris/tetris \
     113        $(USPACEDIR)/app/tester/tester \
     114        $(USPACEDIR)/app/dload/dload \
     115        $(USPACEDIR)/app/dltest/dltest \
     116        $(USPACEDIR)/app/dltest2/dltest2 \
     117        $(USPACEDIR)/app/trace/trace \
     118        $(USPACEDIR)/app/bdsh/bdsh \
     119        $(USPACEDIR)/app/klog/klog
     120
     121RD_LIBS = \
     122        $(USPACEDIR)/lib/libc/shared/libc.so.0 \
     123        $(USPACEDIR)/lib/libtest/libtest.so.0
     124
     125OBJECTS := $(addsuffix .o,$(basename $(SOURCES)))
     126COMPONENT_OBJECTS := $(addsuffix .o,$(basename $(notdir $(COMPONENTS))))
     127
     128.PHONY: all clean depend
     129
     130all: image.boot
     131
     132-include Makefile.depend
     133
     134image.boot: image.raw
     135        $(OBJCOPY) -O $(BFD) $< $@
     136
     137image.raw: depend _components.h _link.ld $(COMPONENT_OBJECTS) initrd.o $(OBJECTS)
     138        $(LD) -no-check-sections -N -T _link.ld -o $@ $(COMPONENT_OBJECTS) initrd.o $(OBJECTS)
     139
     140depend:
     141        -makedepend -f - -- $(DEFS) $(CFLAGS) -- $(SOURCES) > Makefile.depend 2> /dev/null
    37142
    38143clean:
    39         rm -f $(USPACEDIR)/dist/srv/*
    40         rm -f $(USPACEDIR)/dist/app/*
    41         rm -f $(USPACEDIR)/dist/cfg/net/*
    42 
    43         for file in $(RD_SRVS) ; do \
     144        -for file in $(RD_SRVS) ; do \
    44145                rm -f $(USPACEDIR)/dist/srv/`basename $$file` ; \
    45146        done
    46         for file in $(RD_APPS) ; do \
     147        -for file in $(RD_APPS) ; do \
    47148                rm -f $(USPACEDIR)/dist/app/`basename $$file` ; \
    48149        done
    49         for file in $(NET_CFG) ; do \
    50                 rm -f $(USPACEDIR)/dist/cfg/net/`basename $$file` ; \
     150        -rm -f _components.h _components.c _link.ld $(COMPONENT_OBJECTS) initrd.o $(OBJECTS) initrd.img image.raw image.boot Makefile.depend
     151
     152_components.h _components.c _link.ld $(COMPONENT_OBJECTS) initrd.o: $(COMPONENTS) $(RD_SRVS) $(RD_LIBS) $(RD_APPS) _link.ld.in
     153        for file in $(RD_SRVS) ; do \
     154                cp $$file $(USPACEDIR)/dist/srv/ ; \
    51155        done
    52         rm -f $(DEPEND) $(DEPEND_PREV) $(JOB) $(OUTPUT) $(RAW) $(COMPS).h $(COMPS).c $(LINK) $(INITRD).img $(INITRD).fs
    53         find . -name '*.o' -follow -exec rm \{\} \;
    54         find . -name '*.co' -follow -exec rm \{\} \;
     156        for lib in $(RD_LIBS) ; do \
     157                cp $$lib $(USPACEDIR)/dist/lib/ ; \
     158        done
     159        for file in $(RD_APPS) ; do \
     160                cp $$file $(USPACEDIR)/dist/app/ ; \
     161        done
     162ifeq ($(RDFMT),tmpfs)
     163        ../../../../tools/mktmpfs.py $(USPACEDIR)/dist/ initrd.fs
     164endif
     165ifeq ($(RDFMT),fat)
     166        ../../../../tools/mkfat.py $(USPACEDIR)/dist/ initrd.fs
     167endif
     168        ../../../../tools/mkhord.py 16384 initrd.fs initrd.img
     169        rm initrd.fs
     170        ../../../tools/pack.py $(OBJCOPY) $(BFD_NAME) $(BFD_ARCH) 16384 "unsigned int" $(COMPONENTS) ./initrd.img
     171
     172%.o: %.S
     173        $(CC) $(DEFS) $(CFLAGS) -D__ASM__ -c $< -o $@
     174
     175%.o: %.c
     176        $(CC) $(DEFS) $(CFLAGS) -c $< -o $@
  • defaults/amd64/Makefile.config

    r7308e84 r04803bf  
    33
    44# Ramdisk format
    5 RDFMT = fat
     5RDFMT = tmpfs
    66
    77# Compiler
     
    5959CONFIG_VESA_BPP = 16
    6060
     61# Use shared C library
     62CONFIG_SHARED_LIBC = n
     63
    6164# Load disk drivers on startup
    6265CONFIG_START_BD = n
  • defaults/arm32/Makefile.config

    r7308e84 r04803bf  
    33
    44# Ramdisk format
    5 RDFMT = fat
     5RDFMT = tmpfs
    66
    77# Compiler
     
    3535CONFIG_HID_OUT = generic
    3636
     37# Use shared C library
     38CONFIG_SHARED_LIBC = n
     39
    3740# Load disk drivers on startup
    3841CONFIG_START_BD = n
  • defaults/ia32/Makefile.config

    r7308e84 r04803bf  
    66
    77# Ramdisk format
    8 RDFMT = fat
     8RDFMT = tmpfs
    99
    1010# Compiler
     
    6565CONFIG_VESA_BPP = 16
    6666
     67# Use shared C library
     68CONFIG_SHARED_LIBC = n
     69
    6770# Load disk drivers on startup
    6871CONFIG_START_BD = n
  • defaults/ia64/Makefile.config

    r7308e84 r04803bf  
    33
    44# Ramdisk format
    5 RDFMT = fat
     5RDFMT = tmpfs
    66
    77# Compiler
     
    4747CONFIG_HID_OUT = generic
    4848
     49# Use shared C library
     50CONFIG_SHARED_LIBC = n
     51
    4952# Load disk drivers on startup
    5053CONFIG_START_BD = n
  • defaults/mips32/Makefile.config

    r7308e84 r04803bf  
    33
    44# Ramdisk format
    5 RDFMT = fat
     5RDFMT = tmpfs
    66
    77# Compiler
     
    4141CONFIG_HID_OUT = generic
    4242
     43# Use shared C library
     44CONFIG_SHARED_LIBC = n
     45
    4346# Load disk drivers on startup
    4447CONFIG_START_BD = n
  • defaults/ppc32/Makefile.config

    r7308e84 r04803bf  
    33
    44# Ramdisk format
    5 RDFMT = fat
     5RDFMT = tmpfs
    66
    77# Compiler
     
    4141CONFIG_BAT = y
    4242
     43# Use shared C library
     44CONFIG_SHARED_LIBC = n
     45
    4346# Load disk drivers on startup
    4447CONFIG_START_BD = n
  • kernel/arch/ia32/include/barrier.h

    r7308e84 r04803bf  
    5454NO_TRACE static inline void cpuid_serialization(void)
    5555{
     56#ifndef __IN_SHARED_LIBC__
    5657        asm volatile (
    5758                "xorl %%eax, %%eax\n"
     
    5960                ::: "eax", "ebx", "ecx", "edx", "memory"
    6061        );
     62#else
     63        /* Must not clobber PIC register ebx */
     64        asm volatile (
     65                "movl %%ebx, %%esi\n"
     66                "xorl %%eax, %%eax\n"
     67                "cpuid\n"
     68                "movl %%esi, %%ebx\n"
     69                ::: "eax", "ecx", "edx", "esi", "memory"
     70        );
     71#endif
    6172}
    6273
  • kernel/generic/include/syscall/syscall.h

    r7308e84 r04803bf  
    9090        SYS_SYSINFO_GET_DATA,
    9191       
     92        SYS_DEBUG_PUTINT,
    9293        SYS_DEBUG_ENABLE_CONSOLE,
    9394        SYS_DEBUG_DISABLE_CONSOLE,
  • kernel/generic/src/syscall/syscall.c

    r7308e84 r04803bf  
    5555#include <console/console.h>
    5656#include <udebug/udebug.h>
     57
     58/** Print a hex integer into klog */
     59static sysarg_t sys_debug_putint(sysarg_t i)
     60{
     61        printf("[task:0x%x]", i);
     62        return 0;
     63}
    5764
    5865/** Dispatch system call */
     
    180187       
    181188        /* Debug calls */
     189        (syshandler_t) sys_debug_putint,
    182190        (syshandler_t) sys_debug_enable_console,
    183191        (syshandler_t) sys_debug_disable_console
  • uspace/Makefile

    r7308e84 r04803bf  
    3535DIRS = \
    3636        app/bdsh \
     37        app/dload \
     38        app/dltest2 \
    3739        app/edit \
    3840        app/getterm \
     
    9294        drv/test2
    9395
     96## Shared C library
     97ifeq ($(CONFIG_BUILD_SHARED_LIBC), y)
     98        DIRS += \
     99                lib/c/shared \
     100                app/dltest
     101endif
     102
    94103## Networking
    95104#
     
    146155        lib/softint \
    147156        lib/softfloat \
     157        lib/libtest \
    148158        lib/drv \
    149159        lib/packet \
  • uspace/lib/c/Makefile

    r7308e84 r04803bf  
    3434INCLUDE_ARCH = include/arch
    3535INCLUDE_LIBARCH = include/libarch
     36INCLUDE_RTLDARCH = rtld/include/arch
    3637
    3738COMMON_MAKEFILE = $(ROOT_PATH)/Makefile.common
     
    4142CONFIG_MAKEFILE = $(ROOT_PATH)/Makefile.config
    4243
    43 PRE_DEPEND = $(INCLUDE_KERNEL) $(INCLUDE_ARCH) $(INCLUDE_LIBARCH) $(COMMON_HEADER_ARCH)
     44PRE_DEPEND = $(INCLUDE_KERNEL) $(INCLUDE_ARCH) $(INCLUDE_LIBARCH) $(INCLUDE_RTLDARCH) $(COMMON_HEADER_ARCH)
    4445EXTRA_OUTPUT = $(LINKER_SCRIPT)
    45 EXTRA_CLEAN = $(INCLUDE_KERNEL) $(INCLUDE_ARCH) $(INCLUDE_LIBARCH) $(COMMON_HEADER_ARCH) $(LINKER_SCRIPT)
     46EXTRA_CLEAN = $(INCLUDE_KERNEL) $(INCLUDE_ARCH) $(INCLUDE_LIBARCH) $(INCLUDE_RTLDARCH) $(COMMON_HEADER_ARCH) $(LINKER_SCRIPT)
    4647LIBRARY = libc
    4748
     
    4950-include $(CONFIG_MAKEFILE)
    5051-include arch/$(UARCH)/Makefile.inc
     52-include rtld/arch/$(UARCH)/Makefile.inc
     53
     54EXTRA_CFLAGS += -Irtld/include -I../../srv/loader/include
    5155
    5256GENERIC_SOURCES = \
     
    6064        generic/device/hw_res.c \
    6165        generic/device/char_dev.c \
     66        generic/dlfcn.c \
    6267        generic/event.c \
    6368        generic/errno.c \
     
    112117        generic/arg_parse.c \
    113118        generic/sort.c \
    114         generic/stats.c
     119        generic/stats.c \
     120        rtld/rtld.c \
     121        rtld/elf_load.c \
     122        rtld/dynamic.c \
     123        rtld/module.c \
     124        rtld/symbol.c
    115125
    116126SOURCES = \
     
    126136        ln -sfn ../$< $@
    127137
     138$(INCLUDE_RTLDARCH): rtld/arch/$(UARCH)/include
     139        ln -sfn ../../$< $@
     140
    128141$(INCLUDE_KERNEL)/arch: ../../../kernel/generic/include/arch $(INCLUDE_KERNEL)
    129142
  • uspace/lib/c/arch/ia32/src/syscall.S

    r7308e84 r04803bf  
    7171 */
    7272.global __syscall_fast
     73        .type __syscall_fast, @function
     74
    7375__syscall_fast:
    7476        pushl %ebx
     
    9597        popl %ebx
    9698        ret
     99
     100        .size __syscall_fast, . - __syscall_fast
  • uspace/lib/c/arch/ia32/src/tls.c

    r7308e84 r04803bf  
    3737#include <tls.h>
    3838#include <sys/types.h>
     39#include <align.h>
    3940
    4041tcb_t * __alloc_tls(void **data, size_t size)
     
    4849}
    4950
     51//#ifdef __SHARED__
     52
     53typedef struct {
     54        unsigned long int ti_module;
     55        unsigned long int ti_offset;
     56} tls_index;
     57
     58void __attribute__ ((__regparm__ (1)))
     59    *___tls_get_addr(tls_index *ti);
     60
     61void __attribute__ ((__regparm__ (1)))
     62    *___tls_get_addr(tls_index *ti)
     63{
     64        size_t tls_size;
     65        uint8_t *tls;
     66
     67        /* Calculate size of TLS block */
     68        tls_size = ALIGN_UP(&_tbss_end - &_tdata_start, &_tls_alignment);
     69
     70        /* The TLS block is just before TCB */
     71        tls = (uint8_t *)__tcb_get() - tls_size;
     72
     73        return tls + ti->ti_offset;
     74}
     75
     76//#endif
     77
    5078/** @}
    5179 */
  • uspace/lib/c/arch/mips32/src/tls.c

    r7308e84 r04803bf  
    4747}
    4848
     49typedef struct {
     50        unsigned long ti_module;
     51        unsigned long ti_offset;
     52} tls_index;
     53
     54void *__tls_get_addr(tls_index *ti);
     55
     56/* mips32 uses TLS variant 1 */
     57void *__tls_get_addr(tls_index *ti)
     58{
     59        uint8_t *tls;
     60        uint32_t v;
     61
     62        tls = (uint8_t *)__tcb_get() + sizeof(tcb_t);
     63
     64        /* Hopefully this is right. No docs found. */
     65        v = (uint32_t) (tls + ti->ti_offset + 0x8000);
     66        return (void *) v;
     67}
     68
    4969/** @}
    5070 */
  • uspace/lib/c/arch/ppc32/src/tls.c

    r7308e84 r04803bf  
    11/*
    22 * Copyright (c) 2006 Ondrej Palkovsky
     3 * Copyright (c) 2008 Jiri Svoboda
    34 * All rights reserved.
    45 *
     
    3435
    3536#include <tls.h>
     37#include <align.h>
    3638#include <sys/types.h>
    3739
     
    4648}
    4749
     50static void kputint(unsigned i)
     51{
     52        asm volatile (
     53                "mr %%r3, %0\n"
     54                "li %%r9, 32\n"
     55                "sc\n"
     56                :
     57                : "r" (i)
     58                : "%r3","%r9"
     59        ) ;
     60}
     61
     62typedef struct {
     63        unsigned long int ti_module;
     64        unsigned long int ti_offset;
     65} tls_index;
     66
     67void *__tls_get_addr(tls_index *ti);
     68
     69/* ppc32 uses TLS variant 1 */
     70void *__tls_get_addr(tls_index *ti)
     71{
     72        uint8_t *tls;
     73
     74        /* The TLS section is just after TCB */
     75        tls = (uint8_t *)__tcb_get() + sizeof(tcb_t);
     76
     77        /* Hopefully this is right. No docs found. */
     78        return tls + ti->ti_offset + 32768;
     79}
     80
    4881/** @}
    4982 */
  • uspace/lib/c/generic/libc.c

    r7308e84 r04803bf  
    5353#include "private/io.h"
    5454
     55/* From librtld. */
     56#include <rtld.h>
     57//#include <string.h>
     58
    5559static bool env_setup = false;
    5660
     
    7781        char **argv;
    7882       
     83#ifdef __IN_SHARED_LIBC__
     84        if (__pcb != NULL && __pcb->rtld_runtime != NULL) {
     85                runtime_env = (runtime_env_t *) __pcb->rtld_runtime;
     86        }
     87#endif
    7988        /*
    8089         * Get command line arguments and initialize
  • uspace/lib/c/include/as.h

    r7308e84 r04803bf  
    5656extern void *as_area_create(void *address, size_t size, int flags);
    5757extern int as_area_resize(void *address, size_t size, int flags);
    58 extern int as_area_change_flags(void *address, int flags);
     58int as_area_change_flags(void *address, int flags);
    5959extern int as_area_destroy(void *address);
    6060extern void *set_maxheapsize(size_t mhs);
  • uspace/lib/c/include/loader/pcb.h

    r7308e84 r04803bf  
    7272        /** Pointer to ELF dynamic section of the program. */
    7373        void *dynamic;
     74        /** Pointer to dynamic linker state structure (runtime_env_t). */
     75        void *rtld_runtime;
    7476} pcb_t;
    7577
  • uspace/srv/loader/elf_load.c

    r7308e84 r04803bf  
    103103 *
    104104 */
    105 int elf_load_file(const char *file_name, size_t so_bias, elf_info_t *info)
     105int elf_load_file(const char *file_name, size_t so_bias, eld_flags_t flags,
     106    elf_info_t *info)
    106107{
    107108        elf_ld_t elf;
     
    118119        elf.fd = fd;
    119120        elf.info = info;
     121        elf.flags = flags;
    120122
    121123        rc = elf_load(&elf, so_bias);
     
    124126
    125127        return rc;
    126 }
    127 
    128 /** Run an ELF executable.
    129  *
    130  * Transfers control to the entry point of an ELF executable loaded
    131  * earlier with elf_load_file(). This function does not return.
    132  *
    133  * @param info Info structure filled earlier by elf_load_file()
    134  *
    135  */
    136 void elf_run(elf_info_t *info, pcb_t *pcb)
    137 {
    138         program_run(info->entry, pcb);
    139 
    140         /* not reached */
    141128}
    142129
     
    153140        pcb->entry = info->entry;
    154141        pcb->dynamic = info->dynamic;
     142        pcb->rtld_runtime = NULL;
    155143}
    156144
     
    306294                break;
    307295        case PT_INTERP:
    308                 /* Assume silently interp == "/rtld.so" */
    309                 elf->info->interp = "/rtld.so";
     296                /* Assume silently interp == "/app/dload" */
     297                elf->info->interp = "/app/dload";
    310298                break;
    311299        case PT_DYNAMIC:
     300                /* Record pointer to dynamic section into info structure */
     301                elf->info->dynamic =
     302                    (void *)((uint8_t *)entry->p_vaddr + elf->bias);
     303                DPRINTF("dynamic section found at 0x%x\n",
     304                        (uintptr_t)elf->info->dynamic);
     305                break;
     306        case 0x70000000:
     307                /* FIXME: MIPS reginfo */
     308                break;
    312309        case PT_SHLIB:
    313         case PT_LOPROC:
    314         case PT_HIPROC:
     310//      case PT_LOPROC:
     311//      case PT_HIPROC:
    315312        default:
    316313                DPRINTF("Segment p_type %d unknown.\n", entry->p_type);
     
    383380            AS_AREA_READ | AS_AREA_WRITE | AS_AREA_CACHEABLE);
    384381        if (a == (void *)(-1)) {
    385                 DPRINTF("Memory mapping failed.\n");
     382                DPRINTF("memory mapping failed (0x%x, %d)\n",
     383                        base+bias, mem_sz);
    386384                return EE_MEMORY;
    387385        }
     
    425423        }
    426424
     425        /*
     426         * The caller wants to modify the segments first. He will then
     427         * need to set the right access mode and ensure SMC coherence.
     428         */
     429        if ((elf->flags & ELDF_RW) != 0) return EE_OK;
     430
     431//      printf("set area flags to %d\n", flags);
    427432        rc = as_area_change_flags(seg_ptr, flags);
    428433        if (rc != 0) {
  • uspace/srv/loader/include/elf_load.h

    r7308e84 r04803bf  
    4343#include "elf.h"
    4444
     45typedef enum {
     46        /** Leave all segments in RW access mode. */
     47        ELDF_RW = 1
     48} eld_flags_t;
     49
    4550/**
    4651 * Some data extracted from the headers are stored here
     
    6772        uintptr_t bias;
    6873
     74        /** Flags passed to the ELF loader. */
     75        eld_flags_t flags;
     76
    6977        /** A copy of the ELF file header */
    7078        elf_header_t *header;
     
    7482} elf_ld_t;
    7583
    76 int elf_load_file(const char *file_name, size_t so_bias, elf_info_t *info);
    77 void elf_run(elf_info_t *info, pcb_t *pcb);
     84int elf_load_file(const char *file_name, size_t so_bias, eld_flags_t flags,
     85    elf_info_t *info);
    7886void elf_create_pcb(elf_info_t *info, pcb_t *pcb);
    7987
  • uspace/srv/loader/main.c

    r7308e84 r04803bf  
    6565#define DPRINTF(...)
    6666
     67void program_run(void *entry, pcb_t *pcb);
     68
    6769/** Pathname of the file that will be loaded */
    6870static char *pathname = NULL;
     
    283285        int rc;
    284286       
    285         rc = elf_load_file(pathname, 0, &prog_info);
     287        rc = elf_load_file(pathname, 0, 0, &prog_info);
    286288        if (rc != EE_OK) {
    287289                DPRINTF("Failed to load executable '%s'.\n", pathname);
     
    307309        }
    308310       
    309         rc = elf_load_file(prog_info.interp, 0, &interp_info);
     311        printf("Load ELF interpreter '%s'\n", prog_info.interp);
     312        rc = elf_load_file(prog_info.interp, 0, 0, &interp_info);
    310313        if (rc != EE_OK) {
    311314                DPRINTF("Failed to load interpreter '%s.'\n",
     
    315318        }
    316319       
     320        printf("Run interpreter.\n");
     321        printf("entry point: 0x%lx\n", (unsigned long) interp_info.entry);
     322        printf("pcb address: 0x%lx\n", (unsigned long) &pcb);
     323        printf("prog dynamic: 0x%lx\n", (unsigned long) prog_info.dynamic);
     324
    317325        is_dyn_linked = true;
    318326        async_answer_0(rid, EOK);
     
    343351               
    344352                async_answer_0(rid, EOK);
    345                 elf_run(&interp_info, &pcb);
     353                program_run(interp_info.entry, &pcb);
    346354        } else {
    347355                /* Statically linked program */
    348356                async_answer_0(rid, EOK);
    349                 elf_run(&prog_info, &pcb);
     357                program_run(prog_info.entry, &pcb);
    350358        }
    351359       
Note: See TracChangeset for help on using the changeset viewer.