|
|
1.1 root 1: /*
2: * @(#)readfile.c 1.1 86/02/03 Copyright (c) 1985 by Sun Microsystems, Inc.
3: */
4: #include <a.out.h>
5:
6: /*
7: * Read in a Unix executable file and return its entry point.
8: * Handle the various a.out formats correctly.
9: * "Io" is the standalone file descriptor to read from.
10: * Print informative little messages if "print" is on.
11: * Returns -1 for errors.
12: *
13: * The parameter <LOAD> must be set in the command line to cc, e.g.
14: * cc -DLOAD=0x4000 -o readfile.c
15: * The makefile takes care of this.
16: */
17: int (*
18: readfile(io, print))()
19: register int io;
20: int print;
21: {
22: struct exec x;
23: register int i;
24: register char *addr;
25: register int shared = 0;
26: register int loadaddr;
27: register int segsiz;
28: register int datasize;
29:
30: i = read(io, (char *)&x, sizeof x);
31: if (x.a_magic == ZMAGIC || x.a_magic == NMAGIC)
32: shared = 1;
33: if (i != sizeof x || (!shared && x.a_magic != OMAGIC)) {
34: printf("Not executable\n");
35: return (int (*)()) -1;
36: }
37: if (print)
38: printf("Size: %d", x.a_text);
39: datasize = x.a_data;
40: if (!shared) {
41: x.a_text = x.a_text + x.a_data;
42: x.a_data = 0;
43: }
44: if (lseek(io, N_TXTOFF(x), 0) == -1)
45: goto shread;
46: if (read(io, (char *)LOAD, (int)x.a_text) < x.a_text)
47: goto shread;
48: addr = (char *)(x.a_text + LOAD);
1.1.1.2 ! root 49: segsiz = SEGSIZ;
1.1 root 50: if (shared)
51: while ((int)addr & (segsiz-1))
52: *addr++ = 0;
53: if (print)
54: printf("+%d", datasize);
55: if (read(io, addr, (int)x.a_data) < x.a_data)
56: goto shread;
57: close(io); /* Done with it. */
58: if (print)
59: printf("+%d", x.a_bss);
60: addr += x.a_data;
61: for (i = 0; i < x.a_bss; i++)
62: *addr++ = 0;
63: if (print)
64: printf(" bytes\n");
1.1.1.2 ! root 65: loadaddr = LOAD;
1.1 root 66: return (int (*)()) (loadaddr);
67:
68: shread:
69: printf("Truncated file\n");
70: return (int (*)()) -1;
71: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.