/
9-10.C
30 lines (27 loc) · 831 Bytes
/
9-10.C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
/* Copyright (c) 1992 by AT&T Bell Laboratories. */
/* Advanced C++ Programming Styles and Idioms */
/* James O. Coplien */
/* All rights reserved. */
#include <a.out.h>
#include <fcntl.h>
#include <sys/types.h>
#include <stdlib.h>
#include <osfcn.h>
caddr_t load(const char *filename) {
char buf[64];
caddr_t oadx = (caddr_t)sbrk(0);
caddr_t adx = ((char*)oadx) + PAGSIZ -
(((long)oadx) % PAGSIZ);
sprintf(buf, "ld -N -Ttext %X -A a.out %s -o a.out.new",
adx, filename);
system(buf);
int fd = open(filename, O_RDONLY);
exec Exec;
read(fd, (char *)&Exec, sizeof(exec));
sbrk(PAGSIZ - (((long)oadx) % PAGSIZ));
caddr_t ldadx = (caddr_t)sbrk(Exec.a_text +
Exec.a_data + Exec.a_bss);
read(fd, ldadx, Exec.a_text + Exec.a_data);
close(fd);
return ldadx;
}