elfloadmap.c (921B)
1 #include <stdio.h> 2 #include <string.h> 3 4 #include <scc/mach.h> 5 #include <scc/elf.h> 6 7 #include "../libmach.h" 8 #include "fun.h" 9 10 Map * 11 elfloadmap(Obj *obj, FILE *fp) 12 { 13 int i; 14 int nsec, nseg; 15 Map *map; 16 Section sec; 17 FILE *src; 18 Elf *elf = obj->data; 19 Elfhdr *hdr = &elf->hdr; 20 Elfphdr *phdr; 21 22 nseg = hdr->phnum; 23 nsec = elf->nsec; 24 if ((map = newmap(nsec, nseg)) == NULL) 25 return NULL; 26 27 memset(&sec, 0, sizeof(sec)); 28 for (i = 0; i < nseg; ++i) { 29 phdr = &elf->phdr[i]; 30 sec.name = NULL; 31 sec.load = phdr->vaddr; 32 sec.base = phdr->paddr; 33 sec.offset = obj->pos + phdr->offset; 34 sec.align = phdr->align; 35 sec.size = phdr->memsz; 36 sec.index = i; 37 38 if (mapseg(map, &sec, fp, phdr->filesz) < 0) 39 return NULL; 40 } 41 42 for (i = 0; getsec(obj, &i, &sec); ++i) { 43 sec.offset += obj->pos; 44 src = ((sec.flags & SALLOC) != 0) ? fp : NULL; 45 46 if (mapsec(map, &sec, src, sec.size) < 0) 47 return NULL; 48 } 49 50 return map; 51 }