Changes in / [c936c7f:6c69d19] in mainline
- Files:
-
- 15 added
- 33 deleted
- 31 edited
Legend:
- Unmodified
- Added
- Removed
-
HelenOS.config
rc936c7f r6c69d19 553 553 ! CONFIG_WRITE_CORE_FILES (n/y) 554 554 555 % Include development files (headers, libraries)556 ! [RDFMT=tmpfs] CONFIG_DEVEL_FILES (n/y)557 558 555 % Strip binaries 559 556 ! CONFIG_STRIP_BINARIES (n/y) … … 564 561 % Barebone build with essential binaries only 565 562 ! CONFIG_BAREBONE (n/y) 566 567 % Build pcc binaries568 ! CONFIG_PCC (n/y)569 570 % Build binutils binaries571 ! CONFIG_BINUTILS (n/y)572 563 573 564 % Line debugging information -
Makefile
rc936c7f r6c69d19 100 100 distclean: clean 101 101 rm -f $(CSCOPE).out $(COMMON_MAKEFILE) $(COMMON_HEADER) $(COMMON_HEADER_PREV) $(CONFIG_MAKEFILE) $(CONFIG_HEADER) tools/*.pyc tools/checkers/*.pyc release/HelenOS-* 102 cd ./uspace/app/binutils/; ./distclean.sh103 102 104 103 clean: -
boot/Makefile
rc936c7f r6c69d19 58 58 cp "$$file" "$(DIST_PATH)/lib/" ; \ 59 59 done 60 ifeq ($(CONFIG_DEVEL_FILES), y)61 mkdir "$(DIST_PATH)/inc/c/"62 cp -r -L "$(USPACE_PATH)/lib/c/include/." "$(DIST_PATH)/inc/c/"63 cat "$(USPACE_PATH)/lib/c/arch/$(UARCH)/_link.ld" | sed 's/^STARTUP(.*)$$//g' > "$(DIST_PATH)/inc/_link.ld"64 endif65 60 for file in $(RD_APPS) ; do \ 66 61 cp "$$file" "$(DIST_PATH)/app/" ; \ … … 96 91 rm -rf $(USPACE_PATH)/dist/drv/* 97 92 rm -f $(USPACE_PATH)/dist/lib/* 98 rm -rf $(USPACE_PATH)/dist/inc/*99 93 rm -f $(USPACE_PATH)/dist/app/* 100 94 rm -f $(USPACE_PATH)/dist/cfg/net/* -
boot/Makefile.common
rc936c7f r6c69d19 122 122 RD_LIBS = 123 123 124 ifeq ($(CONFIG_DEVEL_FILES), y)125 RD_LIBS += \126 $(USPACE_PATH)/lib/c/libc.a \127 $(USPACE_PATH)/lib/softint/libsoftint.a \128 $(USPACE_PATH)/lib/softfloat/libsoftfloat.a129 endif130 131 124 ifeq ($(CONFIG_BUILD_SHARED_LIBS), y) 132 125 RD_LIBS += \ … … 145 138 $(USPACE_PATH)/app/blkdump/blkdump \ 146 139 $(USPACE_PATH)/app/bnchmark/bnchmark \ 140 $(USPACE_PATH)/app/cc/cc \ 141 $(USPACE_PATH)/app/ccom/ccom \ 142 $(USPACE_PATH)/app/ccom/mkext/cc_mkext \ 143 $(USPACE_PATH)/app/cpp/cpp \ 147 144 $(USPACE_PATH)/app/dltest/dltest \ 148 145 $(USPACE_PATH)/app/dltest2/dltest2 \ … … 173 170 $(USPACE_PATH)/app/websrv/websrv 174 171 175 ifeq ($(CONFIG_PCC),y)176 RD_APPS_NON_ESSENTIAL += \177 $(USPACE_PATH)/app/cc/cc \178 $(USPACE_PATH)/app/ccom/ccom \179 $(USPACE_PATH)/app/ccom/mkext/cc_mkext \180 $(USPACE_PATH)/app/cpp/cpp181 endif182 183 ifeq ($(CONFIG_BINUTILS),y)184 RD_APPS_NON_ESSENTIAL += \185 $(USPACE_PATH)/app/binutils/bin/as \186 $(USPACE_PATH)/app/binutils/bin/ld187 endif188 189 172 ifneq ($(CONFIG_BAREBONE),y) 190 173 NET_CFG = \ -
kernel/generic/include/lib/elf.h
rc936c7f r6c69d19 42 42 * current ELF version 43 43 */ 44 #define EV_CURRENT 44 #define EV_CURRENT 1 45 45 46 46 /** 47 47 * ELF types 48 48 */ 49 #define ET_NONE 0/* No type */50 #define ET_REL 1/* Relocatable file */51 #define ET_EXEC 2/* Executable */52 #define ET_DYN 3/* Shared object */53 #define ET_CORE 4/* Core */54 #define ET_LOPROC 0xff00/* Processor specific */55 #define ET_HIPROC 0xffff/* Processor specific */49 #define ET_NONE 0 /* No type */ 50 #define ET_REL 1 /* Relocatable file */ 51 #define ET_EXEC 2 /* Executable */ 52 #define ET_DYN 3 /* Shared object */ 53 #define ET_CORE 4 /* Core */ 54 #define ET_LOPROC 0xff00 /* Processor specific */ 55 #define ET_HIPROC 0xffff /* Processor specific */ 56 56 57 57 /** 58 58 * ELF machine types 59 59 */ 60 #define EM_NO 0/* No machine */61 #define EM_SPARC 2/* SPARC */62 #define EM_386 3/* i386 */63 #define EM_MIPS 8/* MIPS RS3000 */64 #define EM_MIPS_RS3_LE 10/* MIPS RS3000 LE */65 #define EM_PPC 20/* PPC32 */66 #define EM_PPC64 21/* PPC64 */67 #define EM_ARM 40/* ARM */68 #define EM_SPARCV9 43/* SPARC64 */69 #define EM_IA_64 50/* IA-64 */70 #define EM_X86_64 62/* AMD64/EMT64 */60 #define EM_NO 0 /* No machine */ 61 #define EM_SPARC 2 /* SPARC */ 62 #define EM_386 3 /* i386 */ 63 #define EM_MIPS 8 /* MIPS RS3000 */ 64 #define EM_MIPS_RS3_LE 10 /* MIPS RS3000 LE */ 65 #define EM_PPC 20 /* PPC32 */ 66 #define EM_PPC64 21 /* PPC64 */ 67 #define EM_ARM 40 /* ARM */ 68 #define EM_SPARCV9 43 /* SPARC64 */ 69 #define EM_IA_64 50 /* IA-64 */ 70 #define EM_X86_64 62 /* AMD64/EMT64 */ 71 71 72 72 /** 73 73 * ELF identification indexes 74 74 */ 75 #define EI_MAG0 76 #define EI_MAG1 77 #define EI_MAG2 78 #define EI_MAG3 79 #define EI_CLASS 4/* File class */80 #define EI_DATA 5/* Data encoding */81 #define EI_VERSION 6/* File version */82 #define EI_OSABI 83 #define EI_ABIVERSION 84 #define EI_PAD 9/* Start of padding bytes */85 #define EI_NIDENT 16/* ELF identification table size */75 #define EI_MAG0 0 76 #define EI_MAG1 1 77 #define EI_MAG2 2 78 #define EI_MAG3 3 79 #define EI_CLASS 4 /* File class */ 80 #define EI_DATA 5 /* Data encoding */ 81 #define EI_VERSION 6 /* File version */ 82 #define EI_OSABI 7 83 #define EI_ABIVERSION 8 84 #define EI_PAD 9 /* Start of padding bytes */ 85 #define EI_NIDENT 16 /* ELF identification table size */ 86 86 87 87 /** 88 88 * ELF magic number 89 89 */ 90 #define ELFMAG0 91 #define ELFMAG1 92 #define ELFMAG2 93 #define ELFMAG3 90 #define ELFMAG0 0x7f 91 #define ELFMAG1 'E' 92 #define ELFMAG2 'L' 93 #define ELFMAG3 'F' 94 94 95 95 /** 96 96 * ELF file classes 97 97 */ 98 #define ELFCLASSNONE 99 #define ELFCLASS32 100 #define ELFCLASS64 98 #define ELFCLASSNONE 0 99 #define ELFCLASS32 1 100 #define ELFCLASS64 2 101 101 102 102 /** 103 103 * ELF data encoding types 104 104 */ 105 #define ELFDATANONE 0 106 #define ELFDATA2LSB 1 /* Least significant byte first (little endian) */ 107 #define ELFDATA2MSB 2 /* Most signigicant byte first (big endian) */ 105 #define ELFDATANONE 0 106 #define ELFDATA2LSB 1 /* Least significant byte first (little endian) */ 107 #define ELFDATA2MSB 2 /* Most signigicant byte first (big endian) */ 108 109 /** 110 * ELF error return codes 111 */ 112 #define EE_OK 0 /* No error */ 113 #define EE_INVALID 1 /* Invalid ELF image */ 114 #define EE_MEMORY 2 /* Cannot allocate address space */ 115 #define EE_INCOMPATIBLE 3 /* ELF image is not compatible with current architecture */ 116 #define EE_UNSUPPORTED 4 /* Non-supported ELF (e.g. dynamic ELFs) */ 117 #define EE_LOADER 5 /* The image is actually a program loader */ 118 #define EE_IRRECOVERABLE 6 108 119 109 120 /** 110 121 * ELF section types 111 122 */ 112 #define SHT_NULL 113 #define SHT_PROGBITS 114 #define SHT_SYMTAB 115 #define SHT_STRTAB 116 #define SHT_RELA 117 #define SHT_HASH 118 #define SHT_DYNAMIC 119 #define SHT_NOTE 120 #define SHT_NOBITS 121 #define SHT_REL 122 #define SHT_SHLIB 123 #define SHT_DYNSYM 124 #define SHT_LOOS 125 #define SHT_HIOS 126 #define SHT_LOPROC 127 #define SHT_HIPROC 128 #define SHT_LOUSER 129 #define SHT_HIUSER 123 #define SHT_NULL 0 124 #define SHT_PROGBITS 1 125 #define SHT_SYMTAB 2 126 #define SHT_STRTAB 3 127 #define SHT_RELA 4 128 #define SHT_HASH 5 129 #define SHT_DYNAMIC 6 130 #define SHT_NOTE 7 131 #define SHT_NOBITS 8 132 #define SHT_REL 9 133 #define SHT_SHLIB 10 134 #define SHT_DYNSYM 11 135 #define SHT_LOOS 0x60000000 136 #define SHT_HIOS 0x6fffffff 137 #define SHT_LOPROC 0x70000000 138 #define SHT_HIPROC 0x7fffffff 139 #define SHT_LOUSER 0x80000000 140 #define SHT_HIUSER 0xffffffff 130 141 131 142 /** 132 143 * ELF section flags 133 144 */ 134 #define SHF_WRITE 0x1 135 #define SHF_ALLOC 0x2 136 #define SHF_EXECINSTR 0x4 137 #define SHF_TLS 0x400 138 #define SHF_MASKPROC 0xf0000000 139 140 /** Macros for decomposing elf_symbol.st_info into binging and type */ 141 #define ELF_ST_BIND(i) ((i) >> 4) 142 #define ELF_ST_TYPE(i) ((i) & 0x0f) 143 #define ELF_ST_INFO(b, t) (((b) << 4) + ((t) & 0x0f)) 145 #define SHF_WRITE 0x1 146 #define SHF_ALLOC 0x2 147 #define SHF_EXECINSTR 0x4 148 #define SHF_TLS 0x400 149 #define SHF_MASKPROC 0xf0000000 144 150 145 151 /** 146 152 * Symbol binding 147 153 */ 148 #define STB_LOCAL 149 #define STB_GLOBAL 150 #define STB_WEAK 151 #define STB_LOPROC 152 #define STB_HIPROC 154 #define STB_LOCAL 0 155 #define STB_GLOBAL 1 156 #define STB_WEAK 2 157 #define STB_LOPROC 13 158 #define STB_HIPROC 15 153 159 154 160 /** 155 161 * Symbol types 156 162 */ 157 #define STT_NOTYPE 158 #define STT_OBJECT 159 #define STT_FUNC 160 #define STT_SECTION 161 #define STT_FILE 162 #define STT_LOPROC 163 #define STT_HIPROC 163 #define STT_NOTYPE 0 164 #define STT_OBJECT 1 165 #define STT_FUNC 2 166 #define STT_SECTION 3 167 #define STT_FILE 4 168 #define STT_LOPROC 13 169 #define STT_HIPROC 15 164 170 165 171 /** 166 172 * Program segment types 167 173 */ 168 #define PT_NULL 169 #define PT_LOAD 170 #define PT_DYNAMIC 171 #define PT_INTERP 172 #define PT_NOTE 173 #define PT_SHLIB 174 #define PT_PHDR 175 #define PT_LOPROC 176 #define PT_HIPROC 174 #define PT_NULL 0 175 #define PT_LOAD 1 176 #define PT_DYNAMIC 2 177 #define PT_INTERP 3 178 #define PT_NOTE 4 179 #define PT_SHLIB 5 180 #define PT_PHDR 6 181 #define PT_LOPROC 0x70000000 182 #define PT_HIPROC 0x7fffffff 177 183 178 184 /** 179 185 * Program segment attributes. 180 186 */ 181 #define PF_X 182 #define PF_W 183 #define PF_R 187 #define PF_X 1 188 #define PF_W 2 189 #define PF_R 4 184 190 185 191 /** … … 189 195 * ELF object file specifications. They are the only types used 190 196 * in ELF header. 197 * 191 198 */ 192 199 typedef uint64_t elf_xword; … … 200 207 * 201 208 * These types are specific for 32-bit format. 209 * 202 210 */ 203 211 typedef uint32_t elf32_addr; … … 208 216 * 209 217 * These types are specific for 64-bit format. 218 * 210 219 */ 211 220 typedef uint64_t elf64_addr; … … 229 238 elf_half e_shstrndx; 230 239 }; 240 231 241 struct elf64_header { 232 242 uint8_t e_ident[EI_NIDENT]; … … 246 256 }; 247 257 248 /* 258 /** 249 259 * ELF segment header. 250 260 * Segments headers are also known as program headers. … … 260 270 elf_word p_align; 261 271 }; 272 262 273 struct elf64_segment_header { 263 274 elf_word p_type; … … 271 282 }; 272 283 273 /* 284 /** 274 285 * ELF section header 275 286 */ … … 286 297 elf_word sh_entsize; 287 298 }; 299 288 300 struct elf64_section_header { 289 301 elf_word sh_name; … … 299 311 }; 300 312 301 /* 313 /** 302 314 * ELF symbol table entry 303 315 */ … … 310 322 elf_half st_shndx; 311 323 }; 324 312 325 struct elf64_symbol { 313 326 elf_word st_name; … … 319 332 }; 320 333 321 /*322 * ELF note segment entry323 */324 struct elf32_note {325 elf_word namesz;326 elf_word descsz;327 elf_word type;328 };329 struct elf64_note {330 elf_xword namesz;331 elf_xword descsz;332 elf_xword type;333 };334 335 334 #ifdef __32_BITS__ 336 335 typedef struct elf32_header elf_header_t; … … 338 337 typedef struct elf32_section_header elf_section_header_t; 339 338 typedef struct elf32_symbol elf_symbol_t; 340 typedef struct elf32_note elf_note_t;341 339 #endif 340 342 341 #ifdef __64_BITS__ 343 342 typedef struct elf64_header elf_header_t; … … 345 344 typedef struct elf64_section_header elf_section_header_t; 346 345 typedef struct elf64_symbol elf_symbol_t; 347 typedef struct elf64_note elf_note_t;348 346 #endif 347 348 extern const char *elf_error(unsigned int rc); 349 349 350 350 /** Interpreter string used to recognize the program loader */ -
kernel/generic/include/mm/as.h
rc936c7f r6c69d19 307 307 extern mem_backend_t phys_backend; 308 308 309 /** 310 * This flags is passed when running the loader, otherwise elf_load() 311 * would return with a EE_LOADER error code. 312 * 313 */ 314 #define ELD_F_NONE 0 315 #define ELD_F_LOADER 1 316 317 extern unsigned int elf_load(elf_header_t *, as_t *, unsigned int); 318 309 319 /* Address space area related syscalls. */ 310 320 extern sysarg_t sys_as_area_create(uintptr_t, size_t, unsigned int); -
kernel/generic/src/lib/elf.c
rc936c7f r6c69d19 47 47 #include <macros.h> 48 48 #include <arch.h> 49 50 #include <lib/elf_load.h>51 49 52 50 static const char *error_codes[] = { -
kernel/generic/src/proc/program.c
rc936c7f r6c69d19 48 48 #include <ipc/ipcrsc.h> 49 49 #include <security/cap.h> 50 #include <lib/elf _load.h>50 #include <lib/elf.h> 51 51 #include <errno.h> 52 52 #include <print.h> -
uspace/Makefile
rc936c7f r6c69d19 37 37 app/blkdump \ 38 38 app/bnchmark \ 39 app/cc \ 40 app/ccom \ 41 app/ccom/mkext \ 42 app/cpp \ 39 43 app/edit \ 40 44 app/ext2info \ … … 111 115 drv/bus/usb/vhc 112 116 113 ifeq ($(CONFIG_PCC),y)114 DIRS += \115 app/cc \116 app/ccom \117 app/ccom/mkext \118 app/cpp119 endif120 121 ifeq ($(CONFIG_BINUTILS),y)122 DIRS += \123 app/binutils124 endif125 126 117 ## Networking 127 118 # -
uspace/app/bdsh/cmds/modules/ls/ls.c
rc936c7f r6c69d19 169 169 170 170 /* fill the name field */ 171 tosort[nbdirs].name = (char *) malloc(str_ size(dp->d_name) + 1);171 tosort[nbdirs].name = (char *) malloc(str_length(dp->d_name) + 1); 172 172 if (!tosort[nbdirs].name) { 173 173 cli_error(CL_ENOMEM, "ls: failed to scan %s", d); 174 174 goto out; 175 175 } 176 177 str_cpy(tosort[nbdirs].name, str_ size(dp->d_name) + 1, dp->d_name);176 177 str_cpy(tosort[nbdirs].name, str_length(dp->d_name) + 1, dp->d_name); 178 178 len = snprintf(buff, PATH_MAX - 1, "%s/%s", d, tosort[nbdirs].name); 179 179 buff[len] = '\0'; -
uspace/app/bdsh/exec.c
rc936c7f r6c69d19 52 52 static int try_access(const char *); 53 53 54 const char *search_dir[] = { " /app", "/srv", NULL };54 const char *search_dir[] = { "app", "srv", NULL }; 55 55 56 56 /* work-around for access() */ -
uspace/app/bdsh/input.c
rc936c7f r6c69d19 169 169 new_iostate.stdout = to; 170 170 } 171 172 if (str_cmp(actual_cmd[0], "batch") == 0 && actual_cmd[1] != NULL) { 173 FILE *batch = fopen(actual_cmd[1], "r"); 174 if (batch == NULL) { 175 printf("Cannot open file %s\n", actual_cmd[1]); 176 rc = errno; 177 } else { 178 cliuser_t fusr; 179 fusr.name = usr->name; 180 fusr.cwd = usr->cwd; 181 fusr.prompt = usr->prompt; 182 fusr.line = malloc(INPUT_MAX + 1); 183 char *cur = fusr.line; 184 char *end = fusr.line + INPUT_MAX; 185 int c = fgetc(batch); 186 while (fusr.line != NULL) { 187 if (c == '\n' || c == EOF || cur == end) { 188 *cur = '\0'; 189 if (cur == fusr.line) { 190 /* skip empty line */ 191 rc = 0; 192 free(cur); 193 } else { 194 printf(">%s\n", fusr.line); 195 rc = process_input(&fusr); 196 /* fusr->line was freed by process_input() */ 197 } 198 if (rc == 0 && c != EOF) { 199 fusr.line = malloc(INPUT_MAX + 1); 200 cur = fusr.line; 201 end = fusr.line + INPUT_MAX; 202 } else { 203 break; 204 } 205 } else { 206 *cur++ = c; 207 } 208 c = fgetc(batch); 209 } 210 fclose(batch); 211 } 212 } else { 213 rc = run_command(actual_cmd, usr, &new_iostate); 214 } 171 172 rc = run_command(cmd, usr, &new_iostate); 215 173 216 174 finit_with_files: -
uspace/app/init/init.c
rc936c7f r6c69d19 294 294 295 295 #ifdef CONFIG_MOUNT_DATA 296 /* Make sure fat is running. */297 if (str_cmp(STRING(RDFMT), "fat") != 0) {298 srv_start("/srv/fat");299 }300 296 mount_data(); 301 297 #else -
uspace/app/taskdump/elf_core.c
rc936c7f r6c69d19 1 1 /* 2 * Copyright (c) 201 1Jiri Svoboda2 * Copyright (c) 2010 Jiri Svoboda 3 3 * All rights reserved. 4 4 * … … 38 38 * Looking at core files produced by Linux, these don't have section headers, 39 39 * only program headers, although objdump shows them as having sections. 40 * Basically at the beginning there should be a note segment followed 41 * by one loadable segment per memory area. 42 * 43 * The note segment contains a series of records with register state, 44 * process info etc. We only write one record NT_PRSTATUS which contains 45 * process/register state (anything which is not register state we fill 46 * with zeroes). 47 */ 48 49 #include <align.h> 50 #include <elf/elf.h> 51 #include <elf/elf_linux.h> 40 * Basically at the beginning there should be a note segment (which we 41 * do not write) and one loadable segment per memory area (which we do write). 42 * 43 * The note segment probably contains register state, etc. -- we don't 44 * deal with these yet. Nevertheless you can use these core files with 45 * objdump or gdb. 46 */ 47 52 48 #include <stdio.h> 53 49 #include <stdlib.h> … … 62 58 #include <udebug.h> 63 59 #include <macros.h> 64 #include <libarch/istate.h> 65 66 #include " elf_core.h"60 61 #include <elf.h> 62 #include "include/elf_core.h" 67 63 68 64 static off64_t align_foff_up(off64_t, uintptr_t, size_t); 69 static int write_all(int, const void *, size_t); 70 static int align_pos(int, size_t); 65 static int write_all(int, void *, size_t); 71 66 static int write_mem_area(int, as_area_info_t *, async_sess_t *); 72 67 … … 88 83 */ 89 84 int elf_core_save(const char *file_name, as_area_info_t *ainfo, unsigned int n, 90 async_sess_t *sess , istate_t *istate)85 async_sess_t *sess) 91 86 { 92 87 elf_header_t elf_hdr; … … 95 90 elf_word flags; 96 91 elf_segment_header_t *p_hdr; 97 elf_prstatus_t pr_status;98 elf_note_t note;99 size_t word_size;100 92 101 93 int fd; … … 103 95 unsigned int i; 104 96 105 #ifdef __32_BITS__ 106 word_size = 4; 107 #endif 108 #ifdef __64_BITS__ 109 word_size = 8; 110 #endif 111 memset(&pr_status, 0, sizeof(pr_status)); 112 istate_to_elf_regs(istate, &pr_status.regs); 113 114 n_ph = n + 1; 115 116 p_hdr = malloc(sizeof(elf_segment_header_t) * n_ph); 97 n_ph = n; 98 99 p_hdr = malloc(sizeof(elf_segment_header_t) * n); 117 100 if (p_hdr == NULL) { 118 101 printf("Failed allocating memory.\n"); … … 132 115 * ELF header 133 116 * program headers 134 * note segment135 117 * repeat: 136 118 * (pad for alignment) 137 * core segment119 * segment data 138 120 * end repeat 139 121 */ … … 165 147 foff = elf_hdr.e_phoff + n_ph * sizeof(elf_segment_header_t); 166 148 167 memset(&p_hdr[0], 0, sizeof(p_hdr[0])); 168 p_hdr[0].p_type = PT_NOTE; 169 p_hdr[0].p_offset = foff; 170 p_hdr[0].p_vaddr = 0; 171 p_hdr[0].p_paddr = 0; 172 p_hdr[0].p_filesz = sizeof(elf_note_t) 173 + ALIGN_UP((str_size("CORE") + 1), word_size) 174 + ALIGN_UP(sizeof(elf_prstatus_t), word_size); 175 p_hdr[0].p_memsz = 0; 176 p_hdr[0].p_flags = 0; 177 p_hdr[0].p_align = 1; 178 179 foff += p_hdr[0].p_filesz; 180 181 for (i = 0; i < n; ++i) { 182 foff = align_foff_up(foff, ainfo[i].start_addr, PAGE_SIZE); 149 for (i = 1; i <= n; ++i) { 150 foff = align_foff_up(foff, ainfo[i - 1].start_addr, PAGE_SIZE); 183 151 184 152 flags = 0; 185 if (ainfo[i ].flags & AS_AREA_READ)153 if (ainfo[i - 1].flags & AS_AREA_READ) 186 154 flags |= PF_R; 187 if (ainfo[i ].flags & AS_AREA_WRITE)155 if (ainfo[i - 1].flags & AS_AREA_WRITE) 188 156 flags |= PF_W; 189 if (ainfo[i ].flags & AS_AREA_EXEC)157 if (ainfo[i - 1].flags & AS_AREA_EXEC) 190 158 flags |= PF_X; 191 159 192 memset(&p_hdr[i + 1], 0, sizeof(p_hdr[i +1]));193 p_hdr[i +1].p_type = PT_LOAD;194 p_hdr[i +1].p_offset = foff;195 p_hdr[i + 1].p_vaddr = ainfo[i].start_addr;196 p_hdr[i +1].p_paddr = 0;197 p_hdr[i + 1].p_filesz = ainfo[i].size;198 p_hdr[i + 1].p_memsz = ainfo[i].size;199 p_hdr[i +1].p_flags = flags;200 p_hdr[i +1].p_align = PAGE_SIZE;201 202 foff += ainfo[i ].size;160 memset(&p_hdr[i - 1], 0, sizeof(p_hdr[i - 1])); 161 p_hdr[i - 1].p_type = PT_LOAD; 162 p_hdr[i - 1].p_offset = foff; 163 p_hdr[i - 1].p_vaddr = ainfo[i - 1].start_addr; 164 p_hdr[i - 1].p_paddr = 0; 165 p_hdr[i - 1].p_filesz = ainfo[i - 1].size; 166 p_hdr[i - 1].p_memsz = ainfo[i - 1].size; 167 p_hdr[i - 1].p_flags = flags; 168 p_hdr[i - 1].p_align = PAGE_SIZE; 169 170 foff += ainfo[i - 1].size; 203 171 } 204 172 … … 219 187 } 220 188 221 if (lseek(fd, p_hdr[0].p_offset, SEEK_SET) == (off64_t) -1) { 222 printf("Failed writing memory data.\n"); 223 free(p_hdr); 224 return EIO; 225 } 226 227 /* 228 * Write note header 229 */ 230 note.namesz = str_size("CORE") + 1; 231 note.descsz = sizeof(elf_prstatus_t); 232 note.type = NT_PRSTATUS; 233 234 rc = write_all(fd, ¬e, sizeof(elf_note_t)); 235 if (rc != EOK) { 236 printf("Failed writing note header.\n"); 237 free(p_hdr); 238 return EIO; 239 } 240 241 rc = write_all(fd, "CORE", note.namesz); 242 if (rc != EOK) { 243 printf("Failed writing note header.\n"); 244 free(p_hdr); 245 return EIO; 246 } 247 248 rc = align_pos(fd, word_size); 249 if (rc != EOK) { 250 printf("Failed writing note header.\n"); 251 free(p_hdr); 252 return EIO; 253 } 254 255 rc = write_all(fd, &pr_status, sizeof(elf_prstatus_t)); 256 if (rc != EOK) { 257 printf("Failed writing register data.\n"); 258 free(p_hdr); 259 return EIO; 260 } 261 262 for (i = 1; i < n_ph; ++i) { 189 for (i = 0; i < n_ph; ++i) { 263 190 if (lseek(fd, p_hdr[i].p_offset, SEEK_SET) == (off64_t) -1) { 264 191 printf("Failed writing memory data.\n"); … … 266 193 return EIO; 267 194 } 268 if (write_mem_area(fd, &ainfo[i - 1], sess) != EOK) {195 if (write_mem_area(fd, &ainfo[i], sess) != EOK) { 269 196 printf("Failed writing memory data.\n"); 270 197 free(p_hdr); … … 283 210 off64_t rva = vaddr % page_size; 284 211 off64_t rfo = foff % page_size; 285 212 286 213 if (rva >= rfo) 287 214 return (foff + (rva - rfo)); 288 215 289 216 return (foff + (page_size + (rva - rfo))); 290 217 } … … 341 268 * failed. 342 269 */ 343 static int write_all(int fd, constvoid *data, size_t len)270 static int write_all(int fd, void *data, size_t len) 344 271 { 345 272 int cnt = 0; … … 360 287 } 361 288 362 static int align_pos(int fd, size_t align)363 {364 off64_t cur_pos;365 size_t rem, adv;366 367 cur_pos = lseek(fd, 0, SEEK_CUR);368 if (cur_pos < 0)369 return -1;370 371 rem = cur_pos % align;372 adv = align - rem;373 374 cur_pos = lseek(fd, adv, SEEK_CUR);375 if (cur_pos < 0)376 return -1;377 378 return EOK;379 }380 289 381 290 /** @} -
uspace/app/taskdump/include/elf_core.h
rc936c7f r6c69d19 37 37 38 38 #include <async.h> 39 #include <elf/elf_linux.h>40 #include <libarch/istate.h>41 39 42 40 extern int elf_core_save(const char *, as_area_info_t *, unsigned int, 43 async_sess_t * , istate_t *);41 async_sess_t *); 44 42 45 43 #endif -
uspace/app/taskdump/include/symtab.h
rc936c7f r6c69d19 36 36 #define SYMTAB_H_ 37 37 38 #include <elf/elf.h>39 38 #include <sys/types.h> 39 #include <elf.h> 40 40 41 41 typedef struct { -
uspace/app/taskdump/symtab.c
rc936c7f r6c69d19 36 36 */ 37 37 38 #include <elf/elf.h>39 38 #include <stdio.h> 40 39 #include <stdlib.h> … … 44 43 #include <fcntl.h> 45 44 45 #include <elf.h> 46 46 #include "include/symtab.h" 47 47 -
uspace/app/taskdump/taskdump.c
rc936c7f r6c69d19 34 34 35 35 #include <async.h> 36 #include <elf/elf_linux.h>37 36 #include <stdio.h> 38 37 #include <stdlib.h> … … 73 72 static char *get_app_task_name(void); 74 73 static char *fmt_sym_address(uintptr_t addr); 75 76 static istate_t reg_state;77 74 78 75 int main(int argc, char *argv[]) … … 296 293 if (write_core_file) { 297 294 printf("Writing core file '%s'\n", core_file_name); 298 299 rc = elf_core_save(core_file_name, ainfo_buf, n_areas, sess, 300 ®_state); 301 295 rc = elf_core_save(core_file_name, ainfo_buf, n_areas, sess); 302 296 if (rc != EOK) { 303 297 printf("Failed writing core file.\n"); … … 327 321 pc = istate_get_pc(&istate); 328 322 fp = istate_get_fp(&istate); 329 330 /* Save register state for dumping to core file later. */331 reg_state = istate;332 323 333 324 sym_pc = fmt_sym_address(pc); -
uspace/app/tetris/tetris.c
rc936c7f r6c69d19 291 291 for (j = i + 1; j <= 5; j++) { 292 292 if (keys[i] == keys[j]) 293 errx(1, " %s", "duplicate command keys specified.");293 errx(1, "duplicate command keys specified."); 294 294 } 295 295 -
uspace/lib/c/Makefile
rc936c7f r6c69d19 59 59 -include arch/$(UARCH)/Makefile.inc 60 60 61 EXTRA_CFLAGS += -I../../srv/loader/include 62 61 63 GENERIC_SOURCES = \ 62 64 generic/libc.c \ … … 69 71 generic/device/hw_res.c \ 70 72 generic/device/char_dev.c \ 71 generic/elf/elf_load.c \72 73 generic/event.c \ 73 74 generic/errno.c \ … … 133 134 generic/dlfcn.c \ 134 135 generic/rtld/rtld.c \ 136 generic/rtld/elf_load.c \ 135 137 generic/rtld/dynamic.c \ 136 138 generic/rtld/module.c \ -
uspace/lib/c/arch/ia32/include/atomic.h
rc936c7f r6c69d19 43 43 { 44 44 asm volatile ( 45 "lock incl % 0\n"46 : "+m" (val->count)45 "lock incl %[count]\n" 46 : [count] "+m" (val->count) 47 47 ); 48 48 } … … 51 51 { 52 52 asm volatile ( 53 "lock decl % 0\n"54 : "+m" (val->count)53 "lock decl %[count]\n" 54 : [count] "+m" (val->count) 55 55 ); 56 56 } … … 61 61 62 62 asm volatile ( 63 "lock xaddl % 1, %0\n"64 : "+m" (val->count),65 "+r" (r)63 "lock xaddl %[r], %[count]\n" 64 : [count] "+m" (val->count), 65 [r] "+r" (r) 66 66 ); 67 67 … … 74 74 75 75 asm volatile ( 76 "lock xaddl % 1, %0\n"77 : "+m" (val->count),78 "+r" (r)76 "lock xaddl %[r], %[count]\n" 77 : [count] "+m" (val->count), 78 [r] "+r" (r) 79 79 ); 80 80 -
uspace/lib/c/arch/ia32/include/ddi.h
rc936c7f r6c69d19 44 44 45 45 asm volatile ( 46 "inb %w 1, %b0\n"47 : "=a" (val)48 : "d" (port)46 "inb %w[port], %b[val]\n" 47 : [val] "=a" (val) 48 : [port] "d" (port) 49 49 ); 50 50 … … 57 57 58 58 asm volatile ( 59 "inw %w 1, %w0\n"60 : "=a" (val)61 : "d" (port)59 "inw %w[port], %w[val]\n" 60 : [val] "=a" (val) 61 : [port] "d" (port) 62 62 ); 63 63 … … 70 70 71 71 asm volatile ( 72 "inl %w 1, %0\n"73 : "=a" (val)74 : "d" (port)72 "inl %w[port], %[val]\n" 73 : [val] "=a" (val) 74 : [port] "d" (port) 75 75 ); 76 76 … … 81 81 { 82 82 asm volatile ( 83 "outb %b 0, %w1\n"84 :: "a" (val),"d" (port)83 "outb %b[val], %w[port]\n" 84 :: [val] "a" (val), [port] "d" (port) 85 85 ); 86 86 } … … 89 89 { 90 90 asm volatile ( 91 "outw %w 0, %w1\n"92 :: "a" (val),"d" (port)91 "outw %w[val], %w[port]\n" 92 :: [val] "a" (val), [port] "d" (port) 93 93 ); 94 94 } … … 97 97 { 98 98 asm volatile ( 99 "outl % 0, %w1\n"100 :: "a" (val),"d" (port)99 "outl %[val], %w[port]\n" 100 :: [val] "a" (val), [port] "d" (port) 101 101 ); 102 102 } -
uspace/lib/c/generic/io/io.c
rc936c7f r6c69d19 594 594 } 595 595 596 data+= now;596 buf += now; 597 597 stream->buf_head += now; 598 598 buf_free -= now; 599 599 bytes_left -= now; 600 600 total_written += now; 601 stream->buf_state = _bs_write;602 601 603 602 if (buf_free == 0) { … … 607 606 } 608 607 } 608 609 if (total_written > 0) 610 stream->buf_state = _bs_write; 609 611 610 612 if (need_flush) -
uspace/lib/c/generic/rtld/module.c
rc936c7f r6c69d19 35 35 */ 36 36 37 #include <adt/list.h>38 #include <elf/elf_load.h>39 #include <fcntl.h>40 #include <loader/pcb.h>41 37 #include <stdio.h> 42 38 #include <stdlib.h> 43 39 #include <unistd.h> 40 #include <fcntl.h> 41 #include <adt/list.h> 42 #include <loader/pcb.h> 44 43 45 44 #include <rtld/rtld.h> … … 48 47 #include <rtld/rtld_arch.h> 49 48 #include <rtld/module.h> 49 #include <elf_load.h> 50 50 51 51 /** (Eagerly) process all relocation tables in a module. … … 93 93 module_t *module_find(const char *name) 94 94 { 95 link_t *head = &runtime_env->modules_head; 96 97 link_t *cur; 95 98 module_t *m; 96 99 const char *p, *soname; … … 107 110 108 111 /* Traverse list of all modules. Not extremely fast, but simple */ 109 list_foreach(runtime_env->modules, cur) { 112 DPRINTF("head = %p\n", head); 113 for (cur = head->next; cur != head; cur = cur->next) { 110 114 DPRINTF("cur = %p\n", cur); 111 115 m = list_get_instance(cur, module_t, modules_link); … … 173 177 174 178 /* Insert into the list of loaded modules */ 175 list_append(&m->modules_link, &runtime_env->modules );179 list_append(&m->modules_link, &runtime_env->modules_head); 176 180 177 181 return m; … … 245 249 void modules_process_relocs(module_t *start) 246 250 { 247 module_t *m; 248 249 list_foreach(runtime_env->modules, cur) { 251 link_t *head = &runtime_env->modules_head; 252 253 link_t *cur; 254 module_t *m; 255 256 for (cur = head->next; cur != head; cur = cur->next) { 250 257 m = list_get_instance(cur, module_t, modules_link); 251 258 … … 261 268 void modules_untag(void) 262 269 { 263 module_t *m; 264 265 list_foreach(runtime_env->modules, cur) { 270 link_t *head = &runtime_env->modules_head; 271 272 link_t *cur; 273 module_t *m; 274 275 for (cur = head->next; cur != head; cur = cur->next) { 266 276 m = list_get_instance(cur, module_t, modules_link); 267 277 m->bfs_tag = false; -
uspace/lib/c/generic/rtld/rtld.c
rc936c7f r6c69d19 44 44 { 45 45 runtime_env = &rt_env_static; 46 list_initialize(&runtime_env->modules );46 list_initialize(&runtime_env->modules_head); 47 47 runtime_env->next_bias = 0x2000000; 48 48 runtime_env->program = NULL; -
uspace/lib/c/generic/rtld/symbol.c
rc936c7f r6c69d19 38 38 #include <stdlib.h> 39 39 40 #include <elf/elf.h>41 40 #include <rtld/rtld.h> 42 41 #include <rtld/rtld_debug.h> 43 42 #include <rtld/symbol.h> 43 #include <elf.h> 44 44 45 45 /* … … 118 118 module_t *m, *dm; 119 119 elf_symbol_t *sym, *s; 120 li st_t queue;120 link_t queue_head; 121 121 size_t i; 122 122 … … 132 132 133 133 /* Insert root (the program) into the queue and tag it */ 134 list_initialize(&queue );134 list_initialize(&queue_head); 135 135 start->bfs_tag = true; 136 list_append(&start->queue_link, &queue );136 list_append(&start->queue_link, &queue_head); 137 137 138 138 /* If the symbol is found, it will be stored in 'sym' */ … … 140 140 141 141 /* While queue is not empty */ 142 while (!list_empty(&queue )) {142 while (!list_empty(&queue_head)) { 143 143 /* Pop first element from the queue */ 144 m = list_get_instance( list_first(&queue), module_t, queue_link);144 m = list_get_instance(queue_head.next, module_t, queue_link); 145 145 list_remove(&m->queue_link); 146 146 … … 162 162 if (dm->bfs_tag == false) { 163 163 dm->bfs_tag = true; 164 list_append(&dm->queue_link, &queue );164 list_append(&dm->queue_link, &queue_head); 165 165 } 166 166 } … … 168 168 169 169 /* Empty the queue so that we leave it in a clean state */ 170 while (!list_empty(&queue ))171 list_remove( list_first(&queue));170 while (!list_empty(&queue_head)) 171 list_remove(queue_head.next); 172 172 173 173 if (!sym) { -
uspace/lib/c/include/rtld/elf_dyn.h
rc936c7f r6c69d19 39 39 #include <sys/types.h> 40 40 41 #include <elf /elf.h>41 #include <elf.h> 42 42 #include <libarch/rtld/elf_dyn.h> 43 43 -
uspace/lib/c/include/rtld/rtld.h
rc936c7f r6c69d19 49 49 50 50 /** List of all loaded modules including rtld and the program */ 51 li st_t modules;51 link_t modules_head; 52 52 53 53 /** Temporary hack to place each module at different address. */ -
uspace/lib/c/include/rtld/symbol.h
rc936c7f r6c69d19 36 36 #define LIBC_RTLD_SYMBOL_H_ 37 37 38 #include <elf/elf.h>39 38 #include <rtld/rtld.h> 39 #include <elf.h> 40 40 41 41 elf_symbol_t *symbol_bfs_find(const char *name, module_t *start, module_t **mod); -
uspace/srv/loader/Makefile
rc936c7f r6c69d19 39 39 LINKER_SCRIPT = $(LIBC_PREFIX)/arch/$(UARCH)/_link-loader.ld 40 40 41 EXTRA_CFLAGS = -Iinclude 42 41 43 BINARY = loader 42 44 STATIC_ONLY = y … … 44 46 GENERIC_SOURCES = \ 45 47 main.c \ 48 elf_load.c \ 46 49 interp.s 47 50 -
uspace/srv/loader/main.c
rc936c7f r6c69d19 59 59 #include <str.h> 60 60 #include <as.h> 61 #include <elf /elf.h>62 #include <elf /elf_load.h>61 #include <elf.h> 62 #include <elf_load.h> 63 63 64 64 #ifdef CONFIG_RTLD … … 348 348 349 349 /* Initialize list of loaded modules */ 350 list_initialize(&runtime_env->modules );351 list_append(&prog_mod.modules_link, &runtime_env->modules );350 list_initialize(&runtime_env->modules_head); 351 list_append(&prog_mod.modules_link, &runtime_env->modules_head); 352 352 353 353 /* Pointer to program module. Used as root of the module graph. */
Note:
See TracChangeset
for help on using the changeset viewer.