Changeset e175d69 in mainline
- Timestamp:
- 2011-05-01T13:08:18Z (14 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 042fbe0
- Parents:
- a41577e (diff), e515a827 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - Files:
-
- 18 added
- 27 edited
Legend:
- Unmodified
- Added
- Removed
-
HelenOS.config
ra41577e re175d69 528 528 ! [PLATFORM=sparc64&MACHINE=generic] CONFIG_AOUT_ISOFS_B (y) 529 529 530 % Dynamic linking support 531 ! [PLATFORM=ia32] CONFIG_RTLD (n/y) 532 ! [PLATFORM=abs32le|PLATFORM=amd64|PLATFORM=arm32|PLATFORM=ia64|PLATFORM=mips32|PLATFORM=ppc32|PLATFORM=sparc64] CONFIG_RTLD (n) 533 534 % Build shared libraries 535 ! [CONFIG_RTLD=y] CONFIG_BUILD_SHARED_LIBS (n/y) 536 ! [CONFIG_RTLD=n] CONFIG_BUILD_SHARED_LIBS (n) 537 538 % Link against shared libraries 539 ! [CONFIG_BUILD_SHARED_LIBS=y] CONFIG_USE_SHARED_LIBS (n/y) 540 ! [CONFIG_BUILD_SHARED_LIBS=n] CONFIG_USE_SHARED_LIBS (n) 541 530 542 % Run devman on startup 531 543 ! CONFIG_START_DEVMAN (y/n) -
boot/Makefile
ra41577e re175d69 55 55 cp "$$file" "$(DIST_PATH)/srv/" ; \ 56 56 done 57 for file in $(RD_LIBS) ; do \ 58 cp "$$file" "$(DIST_PATH)/lib/" ; \ 59 done 57 60 for file in $(RD_APPS) ; do \ 58 61 cp "$$file" "$(DIST_PATH)/app/" ; \ … … 83 86 rm -f $(USPACE_PATH)/dist/srv/* 84 87 rm -rf $(USPACE_PATH)/dist/drv/* 88 rm -f $(USPACE_PATH)/dist/lib/* 85 89 rm -f $(USPACE_PATH)/dist/app/* 86 90 rm -f $(USPACE_PATH)/dist/cfg/net/* -
boot/Makefile.common
ra41577e re175d69 118 118 RD_DRV_CFG = 119 119 120 RD_LIBS = 121 122 ifeq ($(CONFIG_BUILD_SHARED_LIBS), y) 123 RD_LIBS += \ 124 $(USPACE_PATH)/lib/test/libtest.so.0 \ 125 $(USPACE_PATH)/lib/c/libc.so.0 \ 126 $(USPACE_PATH)/lib/softint/libsoftint.so.0 127 RD_APPS += \ 128 $(USPACE_PATH)/app/dltest/dltest 129 endif 130 120 131 RD_APPS_ESSENTIAL = \ 121 132 $(USPACE_PATH)/app/bdsh/bdsh \ … … 124 135 125 136 RD_APPS_NON_ESSENTIAL = \ 137 $(USPACE_PATH)/app/dltest/dltest \ 138 $(USPACE_PATH)/app/dltest2/dltest2 \ 139 $(USPACE_PATH)/app/dload/dload \ 126 140 $(USPACE_PATH)/app/edit/edit \ 127 141 $(USPACE_PATH)/app/kill/kill \ -
kernel/arch/ia32/include/barrier.h
ra41577e re175d69 54 54 NO_TRACE static inline void cpuid_serialization(void) 55 55 { 56 #ifndef __IN_SHARED_LIBC__ 56 57 asm volatile ( 57 58 "xorl %%eax, %%eax\n" … … 59 60 ::: "eax", "ebx", "ecx", "edx", "memory" 60 61 ); 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 61 72 } 62 73 -
uspace/Makefile.common
ra41577e re175d69 40 40 # BINARY (/) binary output name (like appname) 41 41 # LIBRARY (/) library output name (like libname) 42 # 42 43 # EXTRA_OUTPUT additional output targets 43 44 # EXTRA_CLEAN additional cleanup targets 45 # 46 # Optionally, for a binary: 47 # STATIC_NEEDED set to 'y' for init binaries, will build statically 48 # linked version 49 # STATIC_ONLY set to 'y' if binary cannot be linked dynamically 50 # (e.g. uses thread-local variables) 51 # 52 # Optionally, for a libary: 53 # SLIBRARY Name with full version, e.g. libfoo.so.0.0 54 # LSONAME Soname / name with short version, e.g. libfoo.so.0 44 55 # 45 56 # (x) required variables … … 73 84 endif 74 85 86 ifeq ($(CONFIG_BUILD_SHARED_LIBS), y) 87 ifneq ($(SLIBRARY),) 88 LARCHIVE = $(LIBRARY).la 89 LOUTPUT = $(SLIBRARY) 90 EXTRA_OUTPUT += $(LOUTPUT).disasm $(LIBRARY).so $(LSONAME) 91 EXTRA_CLEAN += $(LOUTPUT).map $(LOUTPUT).ldisasm \ 92 $(LIBC_PREFIX)/shared/arch/$(UARCH)/_lib.ld \ 93 $(LIBRARY).so $(LSONAME) 94 endif 95 endif 96 75 97 DEPEND = Makefile.depend 76 98 DEPEND_PREV = $(DEPEND).prev … … 90 112 LIBNET_PREFIX = $(LIB_PREFIX)/net 91 113 114 ifeq ($(STATIC_NEEDED),y) 115 STATIC_BUILD = y 116 else 117 ifeq ($(STATIC_ONLY),y) 118 STATIC_BUILD = y 119 else 120 ifeq ($(CONFIG_USE_SHARED_LIBS), y) 121 STATIC_BUILD = n 122 else 123 STATIC_BUILD = y 124 endif 125 endif 126 endif 127 128 ifeq ($(STATIC_BUILD), y) 92 129 BASE_LIBS = $(LIBC_PREFIX)/libc.a $(LIBSOFTINT_PREFIX)/libsoftint.a 93 94 130 LINKER_SCRIPT ?= $(LIBC_PREFIX)/arch/$(UARCH)/_link.ld 131 else 132 BASE_LIBS = $(LIBC_PREFIX)/libc.so.0 $(LIBSOFTINT_PREFIX)/libsoftint.so.0 133 LFLAGS = -Bdynamic 134 LINKER_SCRIPT ?= $(LIBC_PREFIX)/arch/$(UARCH)/_link-dlexe.ld 135 endif 95 136 96 137 ifeq ($(CONFIG_OPTIMIZE_FOR_SIZE),y) … … 102 143 .PHONY: all clean 103 144 104 all: $(VERSION_DEF) $(COMMON_MAKEFILE) $(CONFIG_MAKEFILE) $(CONFIG_HEADER) $(LIBS) $(OUTPUT) $( EXTRA_OUTPUT)145 all: $(VERSION_DEF) $(COMMON_MAKEFILE) $(CONFIG_MAKEFILE) $(CONFIG_HEADER) $(LIBS) $(OUTPUT) $(LOUTPUT) $(EXTRA_OUTPUT) 105 146 -[ -f $(DEPEND) ] && cp -a $(DEPEND) $(DEPEND_PREV) 106 147 107 148 clean: 108 rm -f $(DEPEND) $(DEPEND_PREV) $(JOB) $(OUTPUT) $( EXTRA_OUTPUT) $(EXTRA_CLEAN)149 rm -f $(DEPEND) $(DEPEND_PREV) $(JOB) $(OUTPUT) $(LARCHIVE) $(LOUTPUT) $(EXTRA_OUTPUT) $(EXTRA_CLEAN) 109 150 find . -name '*.o' -follow -exec rm \{\} \; 151 find . -name '*.lo' -follow -exec rm \{\} \; 110 152 111 153 GCC_CFLAGS = -I$(LIBC_PREFIX)/include -O$(OPTIMIZATION) -imacros $(CONFIG_HEADER) \ … … 130 172 -pipe -g -arch $(CLANG_ARCH) -D__$(ENDIANESS)__ 131 173 174 LIB_CFLAGS = $(CFLAGS) -fPIC -D__IN_SHARED_LIBC__ 175 LIB_LFLAGS = $(LFLAGS) -shared -soname $(LSONAME) --whole-archive 176 132 177 ifeq ($(CONFIG_DEBUG),y) 133 178 GCC_CFLAGS += -Werror … … 175 220 176 221 OBJECTS := $(addsuffix .o,$(basename $(SOURCES))) 222 LOBJECTS := $(addsuffix .lo,$(basename $(SOURCES))) 177 223 178 224 ifneq ($(BINARY),) … … 191 237 endif 192 238 239 ifneq ($(SLIBRARY),) 240 %.disasm: $(LOUTPUT) 241 ifeq ($(CONFIG_LINE_DEBUG),y) 242 $(OBJDUMP) -d -S $< > $@ 243 else 244 $(OBJDUMP) -d $< > $@ 245 endif 246 247 $(LOUTPUT): $(LARCHIVE) $(LIBC_PREFIX)/arch/$(UARCH)/_link-shlib.ld 248 $(LD) -T $(LIBC_PREFIX)/arch/$(UARCH)/_link-shlib.ld $(LIB_LFLAGS) $(LARCHIVE) -o $@ -Map $(LOUTPUT).map 249 250 $(LIBRARY).so: 251 ln -s $(SLIBRARY) $@ 252 253 $(LSONAME): 254 ln -s $(SLIBRARY) $@ 255 endif 256 193 257 ifneq ($(LIBRARY),) 194 258 %.a: $(OBJECTS) … … 196 260 endif 197 261 262 ifneq ($(SLIBRARY),) 263 %.la: $(LOBJECTS) 264 $(AR) rc $@ $(LOBJECTS) 265 endif 266 198 267 %.o: %.S $(DEPEND) 199 268 $(CC) $(DEFS) $(CFLAGS) -D__ASM__ -c $< -o $@ … … 210 279 %.o: %.c $(DEPEND) 211 280 $(CC) $(DEFS) $(CFLAGS) -c $< -o $@ 281 ifeq ($(PRECHECK),y) 282 $(JOBFILE) $(JOB) $< $@ cc core $(DEFS) $(CFLAGS) 283 endif 284 285 %.lo: %.S $(DEPEND) 286 $(CC) $(DEFS) $(LIB_CFLAGS) -D__ASM__ -c $< -o $@ 287 ifeq ($(PRECHECK),y) 288 $(JOBFILE) $(JOB) $< $@ as asm/preproc $(DEFS) $(CFLAGS) -D__ASM__ 289 endif 290 291 %.lo: %.s $(DEPEND) 292 $(AS) $(AFLAGS) -o $@ $< 293 ifeq ($(PRECHECK),y) 294 $(JOBFILE) $(JOB) $< $@ as asm 295 endif 296 297 %.lo: %.c $(DEPEND) 298 $(CC) $(DEFS) $(LIB_CFLAGS) -c $< -o $@ 212 299 ifeq ($(PRECHECK),y) 213 300 $(JOBFILE) $(JOB) $< $@ cc core $(DEFS) $(CFLAGS) … … 223 310 $(OUTPUT): $(OBJECTS) 224 311 312 $(LARCHIVE): $(LOBJECTS) -
uspace/app/init/Makefile
ra41577e re175d69 30 30 USPACE_PREFIX = ../.. 31 31 BINARY = init 32 STATIC_NEEDED = y 32 33 33 34 SOURCES = \ -
uspace/lib/c/Makefile
ra41577e re175d69 43 43 LINKER_SCRIPTS = \ 44 44 $(LIBC_PREFIX)/arch/$(UARCH)/_link.ld \ 45 $(LIBC_PREFIX)/arch/$(UARCH)/_link-loader.ld 45 $(LIBC_PREFIX)/arch/$(UARCH)/_link-loader.ld \ 46 $(LIBC_PREFIX)/arch/$(UARCH)/_link-shlib.ld \ 47 $(LIBC_PREFIX)/arch/$(UARCH)/_link-dlexe.ld 46 48 47 49 PRE_DEPEND = $(INCLUDE_KERNEL) $(INCLUDE_ARCH) $(INCLUDE_LIBARCH) $(COMMON_HEADER_ARCH) … … 49 51 EXTRA_CLEAN = $(INCLUDE_KERNEL) $(INCLUDE_ARCH) $(INCLUDE_LIBARCH) $(COMMON_HEADER_ARCH) $(LINKER_SCRIPTS) 50 52 LIBRARY = libc 53 SLIBRARY = libc.so.0.0 54 LSONAME = libc.so.0 55 51 56 52 57 -include $(COMMON_MAKEFILE) 53 58 -include $(CONFIG_MAKEFILE) 54 59 -include arch/$(UARCH)/Makefile.inc 60 61 EXTRA_CFLAGS += -I../../srv/loader/include 55 62 56 63 GENERIC_SOURCES = \ … … 118 125 generic/sort.c \ 119 126 generic/stats.c \ 120 generic/assert.c \ 127 generic/assert.c 128 129 ifeq ($(CONFIG_RTLD), y) 130 GENERIC_SOURCES += \ 131 generic/dlfcn.c \ 132 generic/rtld/rtld.c \ 133 generic/rtld/elf_load.c \ 134 generic/rtld/dynamic.c \ 135 generic/rtld/module.c \ 136 generic/rtld/symbol.c 137 endif 121 138 122 139 SOURCES = \ … … 143 160 $(GCC) $(DEFS) $(CFLAGS) -DLIBC_PATH=$(CURDIR) -DLOADER -E -x c $< | grep -v "^\#" > $@ 144 161 162 $(LIBC_PREFIX)/arch/$(UARCH)/_link-shlib.ld: $(LIBC_PREFIX)/arch/$(UARCH)/_link.ld.in 163 $(GCC) $(DEFS) $(CFLAGS) -DLIBC_PATH=$(CURDIR) -DSHLIB -E -x c $< | grep -v "^\#" > $@ 164 165 $(LIBC_PREFIX)/arch/$(UARCH)/_link-dlexe.ld: $(LIBC_PREFIX)/arch/$(UARCH)/_link.ld.in 166 $(GCC) $(DEFS) $(CFLAGS) -DLIBC_PATH=$(CURDIR) -DDLEXE -E -x c $< | grep -v "^\#" > $@ 167 145 168 $(COMMON_HEADER_ARCH): $(COMMON_HEADER) 146 169 ln -sfn ../../../$< $@ -
uspace/lib/c/arch/ia32/Makefile.inc
ra41577e re175d69 36 36 arch/$(UARCH)/src/setjmp.S \ 37 37 arch/$(UARCH)/src/stacktrace.c \ 38 arch/$(UARCH)/src/stacktrace_asm.S 38 arch/$(UARCH)/src/stacktrace_asm.S \ 39 arch/$(UARCH)/src/rtld/dynamic.c \ 40 arch/$(UARCH)/src/rtld/reloc.c 39 41 40 42 .PRECIOUS: arch/$(UARCH)/src/entry.o -
uspace/lib/c/arch/ia32/_link.ld.in
ra41577e re175d69 1 #ifndef SHLIB 1 2 STARTUP(LIBC_PATH/arch/UARCH/src/entry.o) 2 3 ENTRY(__entry) 4 #endif 3 5 4 6 PHDRS { 5 #if def LOADER7 #if defined(LOADER) || defined(DLEXE) 6 8 interp PT_INTERP; 7 9 text PT_LOAD FILEHDR PHDRS FLAGS(5); … … 10 12 #endif 11 13 data PT_LOAD FLAGS(6); 14 #if defined(SHLIB) || defined(DLEXE) 15 dynamic PT_DYNAMIC; 16 #endif 12 17 debug PT_NOTE; 13 18 } 14 19 15 20 SECTIONS { 16 #if def LOADER21 #if defined(LOADER) || defined(DLEXE) 17 22 .interp : { 18 23 *(.interp); 19 24 } :interp 20 25 #endif 26 #ifdef LOADER 21 27 . = 0x70001000 + SIZEOF_HEADERS; 22 28 #else … … 31 37 *(.rodata .rodata.*); 32 38 } :text 39 40 #if defined(SHLIB) || defined(DLEXE) 41 .rel.plt : { 42 *(.rel.plt); 43 } 44 /* 45 *.rel.dyn MUST FOLLOW IMMEDIATELY after .rel.plt 46 * without alignment gap or DT_REL will be broken 47 */ 48 .rel.dyn : { 49 *(.rel.*); 50 } :text 33 51 52 .plt : { 53 *(.plt); 54 } :text 55 56 .dynsym : { 57 *(.dynsym); 58 } :text 59 60 .dynstr : { 61 *(.dynstr); 62 } :text 63 64 .hash : { 65 *(.hash); 66 } :text 67 #endif 34 68 . = . + 0x1000; 69 70 #if defined(SHLIB) || defined(DLEXE) 71 .dynamic : { 72 *(.dynamic); 73 } :data :dynamic 74 #endif 35 75 36 76 .data : { … … 38 78 } :data 39 79 80 #if defined(SHLIB) || defined(DLEXE) 81 .data.rel : { 82 *(.data.rel .data.rel.*); 83 } :data 84 85 .got : { 86 *(.got); 87 } :data 88 .got.plt : { 89 *(.got.plt); 90 } :data 91 #endif 92 93 #ifndef DLEXE 40 94 .tdata : { 41 95 _tdata_start = .; … … 49 103 50 104 _tls_alignment = ALIGNOF(.tdata); 105 #endif 51 106 52 107 .bss : { 108 *(.dynbss); 53 109 *(COMMON); 54 110 *(.bss); -
uspace/lib/c/arch/ia32/src/syscall.S
ra41577e re175d69 32 32 __syscall_fast_func: 33 33 .long __syscall_slow 34 .size __syscall_fast_func, . - __syscall_fast_func 34 35 35 36 .text … … 71 72 */ 72 73 .global __syscall_fast 74 .type __syscall_fast, @function 75 73 76 __syscall_fast: 74 77 pushl %ebx … … 95 98 popl %ebx 96 99 ret 100 101 .size __syscall_fast, . - __syscall_fast -
uspace/lib/c/arch/ia32/src/tls.c
ra41577e re175d69 37 37 #include <tls.h> 38 38 #include <sys/types.h> 39 #include <align.h> 39 40 40 41 tcb_t * __alloc_tls(void **data, size_t size) … … 48 49 } 49 50 51 /* 52 * Rtld TLS support 53 */ 54 55 typedef struct { 56 unsigned long int ti_module; 57 unsigned long int ti_offset; 58 } tls_index; 59 60 void __attribute__ ((__regparm__ (1))) 61 *___tls_get_addr(tls_index *ti); 62 63 void __attribute__ ((__regparm__ (1))) 64 *___tls_get_addr(tls_index *ti) 65 { 66 size_t tls_size; 67 uint8_t *tls; 68 69 /* Calculate size of TLS block */ 70 tls_size = ALIGN_UP(&_tbss_end - &_tdata_start, &_tls_alignment); 71 72 /* The TLS block is just before TCB */ 73 tls = (uint8_t *)__tcb_get() - tls_size; 74 75 return tls + ti->ti_offset; 76 } 77 50 78 /** @} 51 79 */ -
uspace/lib/c/generic/libc.c
ra41577e re175d69 53 53 #include "private/io.h" 54 54 55 #ifdef CONFIG_RTLD 56 #include <rtld/rtld.h> 57 #endif 58 55 59 static bool env_setup = false; 56 60 … … 77 81 char **argv; 78 82 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 79 88 /* 80 89 * Get command line arguments and initialize -
uspace/lib/c/include/loader/pcb.h
ra41577e re175d69 72 72 /** Pointer to ELF dynamic section of the program. */ 73 73 void *dynamic; 74 /** Pointer to dynamic linker state structure (runtime_env_t). */ 75 void *rtld_runtime; 74 76 } pcb_t; 75 77 -
uspace/lib/softint/Makefile
ra41577e re175d69 31 31 EXTRA_CFLAGS = -Iinclude 32 32 LIBRARY = libsoftint 33 SLIBRARY = libsoftint.so.0.0 34 LSONAME = libsoftint.so.0 33 35 34 36 SOURCES = \ -
uspace/srv/bd/rd/Makefile
ra41577e re175d69 30 30 USPACE_PREFIX = ../../.. 31 31 BINARY = rd 32 STATIC_NEEDED = y 32 33 33 34 SOURCES = \ -
uspace/srv/devman/Makefile
ra41577e re175d69 30 30 USPACE_PREFIX = ../.. 31 31 BINARY = devman 32 STATIC_NEEDED = y 32 33 33 34 SOURCES = \ -
uspace/srv/devmap/Makefile
ra41577e re175d69 30 30 USPACE_PREFIX = ../.. 31 31 BINARY = devmap 32 STATIC_NEEDED = y 32 33 33 34 SOURCES = \ -
uspace/srv/fs/devfs/Makefile
ra41577e re175d69 32 32 EXTRA_CFLAGS += -I$(LIBFS_PREFIX) 33 33 BINARY = devfs 34 STATIC_NEEDED = y 34 35 35 36 SOURCES = \ -
uspace/srv/fs/fat/Makefile
ra41577e re175d69 32 32 EXTRA_CFLAGS += -I$(LIBBLOCK_PREFIX) -I$(LIBFS_PREFIX) 33 33 BINARY = fat 34 STATIC_NEEDED = y 34 35 35 36 SOURCES = \ -
uspace/srv/fs/tmpfs/Makefile
ra41577e re175d69 32 32 EXTRA_CFLAGS += -I$(LIBBLOCK_PREFIX) -I$(LIBFS_PREFIX) 33 33 BINARY = tmpfs 34 STATIC_NEEDED = y 34 35 35 36 SOURCES = \ -
uspace/srv/loader/Makefile
ra41577e re175d69 42 42 43 43 BINARY = loader 44 STATIC_ONLY = y 44 45 45 46 GENERIC_SOURCES = \ -
uspace/srv/loader/elf_load.c
ra41577e re175d69 103 103 * 104 104 */ 105 int elf_load_file(const char *file_name, size_t so_bias, elf_info_t *info) 105 int elf_load_file(const char *file_name, size_t so_bias, eld_flags_t flags, 106 elf_info_t *info) 106 107 { 107 108 elf_ld_t elf; … … 118 119 elf.fd = fd; 119 120 elf.info = info; 121 elf.flags = flags; 120 122 121 123 rc = elf_load(&elf, so_bias); … … 124 126 125 127 return rc; 126 }127 128 /** Run an ELF executable.129 *130 * Transfers control to the entry point of an ELF executable loaded131 * 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 entry_point_jmp(info->entry, pcb);139 140 /* not reached */141 128 } 142 129 … … 153 140 pcb->entry = info->entry; 154 141 pcb->dynamic = info->dynamic; 142 pcb->rtld_runtime = NULL; 155 143 } 156 144 … … 306 294 break; 307 295 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"; 310 298 break; 311 299 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; 312 309 case PT_SHLIB: 313 case PT_LOPROC:314 case PT_HIPROC:310 // case PT_LOPROC: 311 // case PT_HIPROC: 315 312 default: 316 313 DPRINTF("Segment p_type %d unknown.\n", entry->p_type); … … 383 380 AS_AREA_READ | AS_AREA_WRITE | AS_AREA_CACHEABLE); 384 381 if (a == (void *)(-1)) { 385 DPRINTF("Memory mapping failed.\n"); 382 DPRINTF("memory mapping failed (0x%x, %d)\n", 383 base+bias, mem_sz); 386 384 return EE_MEMORY; 387 385 } … … 425 423 } 426 424 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); 427 432 rc = as_area_change_flags(seg_ptr, flags); 428 433 if (rc != 0) { -
uspace/srv/loader/include/elf_load.h
ra41577e re175d69 43 43 #include "elf.h" 44 44 45 typedef enum { 46 /** Leave all segments in RW access mode. */ 47 ELDF_RW = 1 48 } eld_flags_t; 49 45 50 /** 46 51 * Some data extracted from the headers are stored here … … 67 72 uintptr_t bias; 68 73 74 /** Flags passed to the ELF loader. */ 75 eld_flags_t flags; 76 69 77 /** A copy of the ELF file header */ 70 78 elf_header_t *header; … … 74 82 } elf_ld_t; 75 83 76 int elf_load_file(const char *file_name, size_t so_bias, el f_info_t *info);77 void elf_run(elf_info_t *info, pcb_t *pcb);84 int elf_load_file(const char *file_name, size_t so_bias, eld_flags_t flags, 85 elf_info_t *info); 78 86 void elf_create_pcb(elf_info_t *info, pcb_t *pcb); 79 87 -
uspace/srv/loader/main.c
ra41577e re175d69 55 55 #include <macros.h> 56 56 #include <loader/pcb.h> 57 #include <entry_point.h> 57 58 #include <errno.h> 58 59 #include <async.h> … … 62 63 #include <elf.h> 63 64 #include <elf_load.h> 65 66 #ifdef CONFIG_RTLD 67 #include <rtld/rtld.h> 68 #include <rtld/dynamic.h> 69 #include <rtld/module.h> 70 71 static int ldr_load_dyn_linked(elf_info_t *p_info); 72 #endif 64 73 65 74 #define DPRINTF(...) … … 89 98 90 99 static elf_info_t prog_info; 91 static elf_info_t interp_info;92 93 static bool is_dyn_linked;94 100 95 101 /** Used to limit number of connections to one. */ 96 102 static bool connected = false; 103 104 #ifdef CONFIG_RTLD 105 /** State structure of the dynamic linker. */ 106 runtime_env_t dload_re; 107 static module_t prog_mod; 108 #endif 97 109 98 110 static void ldr_get_taskid(ipc_callid_t rid, ipc_call_t *request) … … 283 295 int rc; 284 296 285 rc = elf_load_file(pathname, 0, &prog_info);297 rc = elf_load_file(pathname, 0, 0, &prog_info); 286 298 if (rc != EE_OK) { 287 299 DPRINTF("Failed to load executable '%s'.\n", pathname); … … 302 314 if (prog_info.interp == NULL) { 303 315 /* Statically linked program */ 304 is_dyn_linked = false;305 316 async_answer_0(rid, EOK); 306 317 return 0; 307 318 } 308 319 309 rc = elf_load_file(prog_info.interp, 0, &interp_info); 310 if (rc != EE_OK) { 311 DPRINTF("Failed to load interpreter '%s.'\n", 312 prog_info.interp); 313 async_answer_0(rid, EINVAL); 314 return 1; 315 } 316 317 is_dyn_linked = true; 318 async_answer_0(rid, EOK); 319 320 DPRINTF("Binary is dynamically linked.\n"); 321 #ifdef CONFIG_RTLD 322 DPRINTF(" - pcb address: %p\n", &pcb); 323 DPRINTF( "- prog dynamic: %p\n", prog_info.dynamic); 324 325 rc = ldr_load_dyn_linked(&prog_info); 326 #else 327 rc = ENOTSUP; 328 #endif 329 async_answer_0(rid, rc); 320 330 return 0; 321 331 } 322 332 333 #ifdef CONFIG_RTLD 334 335 static int ldr_load_dyn_linked(elf_info_t *p_info) 336 { 337 runtime_env = &dload_re; 338 339 DPRINTF("Load dynamically linked program.\n"); 340 341 /* 342 * First we need to process dynamic sections of the executable 343 * program and insert it into the module graph. 344 */ 345 346 DPRINTF("Parse program .dynamic section at %p\n", p_info->dynamic); 347 dynamic_parse(p_info->dynamic, 0, &prog_mod.dyn); 348 prog_mod.bias = 0; 349 prog_mod.dyn.soname = "[program]"; 350 351 /* Initialize list of loaded modules */ 352 list_initialize(&runtime_env->modules_head); 353 list_append(&prog_mod.modules_link, &runtime_env->modules_head); 354 355 /* Pointer to program module. Used as root of the module graph. */ 356 runtime_env->program = &prog_mod; 357 358 /* Work around non-existent memory space allocation. */ 359 runtime_env->next_bias = 0x1000000; 360 361 /* 362 * Now we can continue with loading all other modules. 363 */ 364 365 DPRINTF("Load all program dependencies\n"); 366 module_load_deps(&prog_mod); 367 368 /* 369 * Now relocate/link all modules together. 370 */ 371 372 /* Process relocations in all modules */ 373 DPRINTF("Relocate all modules\n"); 374 modules_process_relocs(&prog_mod); 375 376 /* Pass runtime evironment pointer through PCB. */ 377 pcb.rtld_runtime = (void *) runtime_env; 378 379 return 0; 380 } 381 #endif 323 382 324 383 /** Run the previously loaded program. … … 332 391 const char *cp; 333 392 393 DPRINTF("Set task name\n"); 394 334 395 /* Set the task name. */ 335 396 cp = str_rchr(pathname, '/'); … … 337 398 task_set_name(cp); 338 399 339 if (is_dyn_linked == true) { 340 /* Dynamically linked program */ 341 DPRINTF("Run ELF interpreter.\n"); 342 DPRINTF("Entry point: %p\n", interp_info.entry); 343 344 async_answer_0(rid, EOK); 345 elf_run(&interp_info, &pcb); 346 } else { 347 /* Statically linked program */ 348 async_answer_0(rid, EOK); 349 elf_run(&prog_info, &pcb); 350 } 400 /* Run program */ 401 DPRINTF("Reply OK\n"); 402 async_answer_0(rid, EOK); 403 DPRINTF("Jump to entry point at %p\n", pcb.entry); 404 entry_point_jmp(prog_info.entry, &pcb); 351 405 352 406 /* Not reached */ -
uspace/srv/net/tl/icmp/Makefile
ra41577e re175d69 32 32 EXTRA_CFLAGS = -I$(LIBNET_PREFIX)/include 33 33 BINARY = icmp 34 STATIC_ONLY = y 34 35 35 36 SOURCES = \ -
uspace/srv/ns/Makefile
ra41577e re175d69 30 30 USPACE_PREFIX = ../.. 31 31 BINARY = ns 32 STATIC_NEEDED = y 32 33 33 34 SOURCES = \ -
uspace/srv/vfs/Makefile
ra41577e re175d69 30 30 USPACE_PREFIX = ../.. 31 31 BINARY = vfs 32 STATIC_NEEDED = y 32 33 33 34 SOURCES = \
Note:
See TracChangeset
for help on using the changeset viewer.