scc

A fork of https://git.simple-cc.org/scc/ for Qute

git clone https://git.8pit.net/scc.git

 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
10Map *
11elfloadmap(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}