| Rev | Line |   | 
|---|
| [9] | 1 | /* size - tell size of an object file           Author: Andy Tanenbaum */
 | 
|---|
 | 2 | 
 | 
|---|
 | 3 | #include <sys/types.h>
 | 
|---|
 | 4 | #include <fcntl.h>
 | 
|---|
 | 5 | #include <a.out.h>
 | 
|---|
 | 6 | #include <stdlib.h>
 | 
|---|
 | 7 | #include <unistd.h>
 | 
|---|
 | 8 | #include <stdio.h>
 | 
|---|
 | 9 | 
 | 
|---|
 | 10 | int heading;                    /* set when heading printed */
 | 
|---|
 | 11 | int error;
 | 
|---|
 | 12 | 
 | 
|---|
 | 13 | _PROTOTYPE(int main, (int argc, char **argv));
 | 
|---|
 | 14 | _PROTOTYPE(void size, (char *name));
 | 
|---|
 | 15 | 
 | 
|---|
 | 16 | int main(argc, argv)
 | 
|---|
 | 17 | int argc;
 | 
|---|
 | 18 | char *argv[];
 | 
|---|
 | 19 | {
 | 
|---|
 | 20 |   int i;
 | 
|---|
 | 21 | 
 | 
|---|
 | 22 |   if (argc == 1) {
 | 
|---|
 | 23 |         size("a.out");
 | 
|---|
 | 24 |         exit(error);
 | 
|---|
 | 25 |   }
 | 
|---|
 | 26 |   for (i = 1; i < argc; i++) size(argv[i]);
 | 
|---|
 | 27 |   return(error);
 | 
|---|
 | 28 | }
 | 
|---|
 | 29 | 
 | 
|---|
 | 30 | 
 | 
|---|
 | 31 | 
 | 
|---|
 | 32 | void size(name)
 | 
|---|
 | 33 | char *name;
 | 
|---|
 | 34 | {
 | 
|---|
 | 35 |   int fd, separate;
 | 
|---|
 | 36 |   long dynam, allmem;
 | 
|---|
 | 37 |   struct exec exec;
 | 
|---|
 | 38 | 
 | 
|---|
 | 39 |   if ((fd = open(name, O_RDONLY)) < 0) {
 | 
|---|
 | 40 |         fprintf(stderr, "size: can't open %s\n", name);
 | 
|---|
 | 41 |         error = 1;
 | 
|---|
 | 42 |         return;
 | 
|---|
 | 43 |   }
 | 
|---|
 | 44 |   if (read(fd, (char *)&exec, sizeof(struct exec)) != sizeof(struct exec)) {
 | 
|---|
 | 45 |         fprintf(stderr, "size: %s: header too short\n", name);
 | 
|---|
 | 46 |         error = 1;
 | 
|---|
 | 47 |         close(fd);
 | 
|---|
 | 48 |         return;
 | 
|---|
 | 49 |   }
 | 
|---|
 | 50 |   if (BADMAG(exec)) {
 | 
|---|
 | 51 |         fprintf(stderr, "size: %s not an object file\n", name);
 | 
|---|
 | 52 |         error = 1;
 | 
|---|
 | 53 |         close(fd);
 | 
|---|
 | 54 |         return;
 | 
|---|
 | 55 |   }
 | 
|---|
 | 56 |   separate = (exec.a_flags & A_SEP ? 1 : 0);
 | 
|---|
 | 57 |   dynam = exec.a_total - exec.a_text - exec.a_data - exec.a_bss;
 | 
|---|
 | 58 |   if (separate) dynam += exec.a_text;
 | 
|---|
 | 59 |   allmem = (separate ? exec.a_total + exec.a_text : exec.a_total);
 | 
|---|
 | 60 |   if (heading++ == 0) printf("   text    data     bss    stack   memory\n");
 | 
|---|
 | 61 |   printf("%7ld %7ld %7ld %8ld %8ld  %s\n",
 | 
|---|
 | 62 |          exec.a_text, exec.a_data, exec.a_bss, dynam, allmem, name);
 | 
|---|
 | 63 |   close(fd);
 | 
|---|
 | 64 | }
 | 
|---|
       
      
  Note:
 See   
TracBrowser
 for help on using the repository browser.