Changes in / [1facf8e:0803134] in mainline
- Location:
- uspace
- Files:
-
- 5 added
- 14 deleted
- 15 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/app/bdsh/exec.c
r1facf8e r0803134 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/taskdump/elf_core.c
r1facf8e r0803134 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
r1facf8e r0803134 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
r1facf8e r0803134 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
r1facf8e r0803134 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
r1facf8e r0803134 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/lib/c/Makefile
r1facf8e r0803134 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/generic/rtld/module.c
r1facf8e r0803134 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
r1facf8e r0803134 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
r1facf8e r0803134 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
r1facf8e r0803134 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
r1facf8e r0803134 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
r1facf8e r0803134 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
r1facf8e r0803134 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
r1facf8e r0803134 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.