Files
oldlinux-files/study/linux-travel/MINIX-1.5/1.5/Source/commands/size.c
2024-02-19 00:25:23 -05:00

72 lines
1.5 KiB
C

/* size - tell size of an object file Author: Andy Tanenbaum */
#include <sys/types.h>
#include <fcntl.h>
#define HLONG 8 /* # longs in the header */
#define TEXT 2
#define DATA 3
#define BSS 4
#define CHMEM 6
#define MAGIC 0x0301 /* magic number for an object file */
#define SEPBIT 0x00200000 /* this bit is set for separate I/D */
int heading; /* set when heading printed */
int error;
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]);
exit(error);
}
size(name)
char *name;
{
int fd, separate;
long head[HLONG], dynam, allmem;
if ((fd = open(name, O_RDONLY)) < 0) {
stderr3("size: can't open ", name, "\n");
return;
}
if (read(fd, head, sizeof(head)) != sizeof(head)) {
stderr3("size: ", name, ": header too short\n");
error = 1;
close(fd);
return;
}
if ((head[0] & 0xFFFFL) != MAGIC) {
stderr3("size: ", name, " not an object file\n");
close(fd);
return;
}
separate = (head[0] & SEPBIT ? 1 : 0);
dynam = head[CHMEM] - head[TEXT] - head[DATA] - head[BSS];
if (separate) dynam += head[TEXT];
allmem = (separate ? head[CHMEM] + head[TEXT] : head[CHMEM]);
if (heading++ == 0) prints(" text\t data\t bss\t stack\tmemory\n");
printf("%6ld\t%6ld\t%6ld\t%6ld\t%6ld\t%s\n",
head[TEXT], head[DATA], head[BSS], dynam, allmem, name);
close(fd);
}
stderr3(s1, s2, s3)
char *s1, *s2, *s3;
{
std_err(s1);
std_err(s2);
std_err(s3);
error = 1;
}