65 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			65 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* size - tell size of an object file		Author: Andy Tanenbaum */
 | |
| 
 | |
| #include <sys/types.h>
 | |
| #include <fcntl.h>
 | |
| #include <a.out.h>
 | |
| #include <stdlib.h>
 | |
| #include <unistd.h>
 | |
| #include <stdio.h>
 | |
| 
 | |
| int heading;			/* set when heading printed */
 | |
| int error;
 | |
| 
 | |
| int main(int argc, char **argv);
 | |
| void size(char *name);
 | |
| 
 | |
| int main(argc, argv)
 | |
| int argc;
 | |
| char *argv[];
 | |
| {
 | |
|   int i;
 | |
| 
 | |
|   if (argc == 1) {
 | |
| 	size("a.out");
 | |
| 	exit(error);
 | |
|   }
 | |
|   for (i = 1; i < argc; i++) size(argv[i]);
 | |
|   return(error);
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| void size(name)
 | |
| char *name;
 | |
| {
 | |
|   int fd, separate;
 | |
|   long dynam, allmem;
 | |
|   struct exec exec;
 | |
| 
 | |
|   if ((fd = open(name, O_RDONLY)) < 0) {
 | |
| 	fprintf(stderr, "size: can't open %s\n", name);
 | |
| 	error = 1;
 | |
| 	return;
 | |
|   }
 | |
|   if (read(fd, (char *)&exec, sizeof(struct exec)) != sizeof(struct exec)) {
 | |
| 	fprintf(stderr, "size: %s: header too short\n", name);
 | |
| 	error = 1;
 | |
| 	close(fd);
 | |
| 	return;
 | |
|   }
 | |
|   if (BADMAG(exec)) {
 | |
| 	fprintf(stderr, "size: %s not an object file\n", name);
 | |
| 	error = 1;
 | |
| 	close(fd);
 | |
| 	return;
 | |
|   }
 | |
|   separate = (exec.a_flags & A_SEP ? 1 : 0);
 | |
|   dynam = exec.a_total - exec.a_text - exec.a_data - exec.a_bss;
 | |
|   if (separate) dynam += exec.a_text;
 | |
|   allmem = (separate ? exec.a_total + exec.a_text : exec.a_total);
 | |
|   if (heading++ == 0) printf("   text    data     bss    stack   memory\n");
 | |
|   printf("%7ld %7ld %7ld %8ld %8ld  %s\n",
 | |
|          exec.a_text, exec.a_data, exec.a_bss, dynam, allmem, name);
 | |
|   close(fd);
 | |
| }
 | 
