|
|
1.1 root 1: /*
2: * file map routines
3: */
4: #include <u.h>
5: #include <libc.h>
6: #include <bio.h>
7: #include <mach.h>
8:
9: static int reloc(Map*, ulong, long*);
10:
11: Map *
12: newmap(Map *map, int fd, int n)
13: {
14: int size;
15:
16: size = sizeof(Map)+(n-1)*sizeof(struct segment);
17: if (map == 0)
18: map = malloc(size);
19: else
20: map = realloc(map, size);
21: if (map == 0) {
22: werrstr("out of memory: %r");
23: return 0;
24: }
25: memset(map, 0, size);
26: map->fd = fd;
27: map->nsegs = n;
28: return map;
29: }
30:
31: int
32: setmap(Map *map, ulong b, ulong e, ulong f, char *name)
33: {
34: int i;
35:
36: if (map == 0)
37: return 0;
38: for (i = 0; i < map->nsegs; i++)
39: if (!map->seg[i].inuse)
40: break;
41: if (i >= map->nsegs)
42: return 0;
43: map->seg[i].b = b;
44: map->seg[i].e = e;
45: map->seg[i].f = f;
46: map->seg[i].inuse = 1;
47: map->seg[i].name = name;
48: return 1;
49: }
50:
51: int
52: findseg(Map *map, char *name)
53: {
54: int i;
55:
56: if (!map)
57: return -1;
58: for (i = 0; i < map->nsegs; i++)
59: if (map->seg[i].inuse && !strcmp(map->seg[i].name, name))
60: return i;
61: return -1;
62: }
63:
64: void
65: unusemap(Map *map, int i)
66: {
67: if (map != 0 && 0 <= i && i < map->nsegs)
68: map->seg[i].inuse = 0;
69: }
70:
71: Map *
72: loadmap(Map *map, int fd, Fhdr *fp)
73: {
74: map = newmap(map, fd, 2);
75: if (map == 0)
76: return 0;
77: map->seg[0].b = fp->txtaddr;
78: map->seg[0].e = fp->txtaddr+fp->txtsz;
79: map->seg[0].f = fp->txtoff;
80: map->seg[0].inuse = 1;
81: map->seg[0].name = "text";
82: map->seg[1].b = fp->dataddr;
83: map->seg[1].e = fp->dataddr+fp->datsz;
84: map->seg[1].f = fp->datoff;
85: map->seg[1].inuse = 1;
86: map->seg[1].name = "data";
87: return map;
88: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.