1 /* strip - remove symbols. Author: Dick van Veen */
14 * - when no file is present, a.out is assumed.
19 #define NAME_LENGTH 128 /* max file path name */
21 char buffer
[BUFSIZ
]; /* used to copy executable */
22 char new_file
[NAME_LENGTH
]; /* contains name of temporary */
25 _PROTOTYPE(int main
, (int argc
, char **argv
));
26 _PROTOTYPE(void strip
, (char *file
));
27 _PROTOTYPE(int read_header
, (int fd
));
28 _PROTOTYPE(int write_header
, (int fd
));
29 _PROTOTYPE(int make_tmp
, (char *new_name
, char *name
));
30 _PROTOTYPE(int copy_file
, (int fd1
, int fd2
, long size
));
40 while (*argv
!= NULL
) {
52 long symb_size
, relo_size
;
54 fd
= open(file
, O_RDONLY
);
56 fprintf(stderr
, "can't open %s\n", file
);
60 if (read_header(fd
)) {
61 fprintf(stderr
, "%s: not an executable file\n", file
);
65 if (header
.a_syms
== 0L) {
66 close(fd
); /* no symbol table present */
69 symb_size
= header
.a_syms
;
70 header
.a_syms
= 0L; /* remove table size */
72 relo_size
= buf
.st_size
- (A_MINHDR
+ header
.a_text
+ header
.a_data
+ symb_size
);
73 new_fd
= make_tmp(new_file
, file
);
75 fprintf(stderr
, "can't create temporary file\n");
79 if (write_header(new_fd
)) {
80 fprintf(stderr
, "can't write temporary file\n");
86 if (copy_file(fd
, new_fd
, header
.a_text
+ header
.a_data
)) {
87 fprintf(stderr
, "can't copy %s\n", file
);
94 lseek(fd
, symb_size
, 1);
95 if (copy_file(fd
, new_fd
, relo_size
)) {
96 fprintf(stderr
, "can't copy %s\n", file
);
105 if (unlink(file
) == -1) {
106 fprintf(stderr
, "can't unlink %s\n", file
);
110 link(new_file
, file
);
112 chmod(file
, buf
.st_mode
);
118 if (read(fd
, (char *) &header
, A_MINHDR
) != A_MINHDR
) return(1);
119 if (BADMAG(header
)) return (1);
120 if (header
.a_hdrlen
> sizeof(struct exec
)) return (1);
121 lseek(fd
, 0L, SEEK_SET
); /* variable size header */
122 if (read(fd
, (char *)&header
, (int)header
.a_hdrlen
) != (int) header
.a_hdrlen
)
130 lseek(fd
, 0L, SEEK_SET
);
131 if (write(fd
, (char *)&header
, (int)header
.a_hdrlen
) != (int)header
.a_hdrlen
)
136 int make_tmp(new_name
, name
)
137 char *new_name
, *name
;
143 if (len
+ 1 > NAME_LENGTH
) return(-1);
144 strcpy(new_name
, name
);
145 nameptr
= strrchr(new_name
, '/');
146 if (nameptr
== NULL
) nameptr
= new_name
- 1;
147 if (nameptr
- new_name
+ 6 + 1 > NAME_LENGTH
) return (-1);
148 strcpy(nameptr
+ 1, "XXXXXX");
150 return(creat(new_name
, 0777));
153 int copy_file(fd1
, fd2
, size
)
160 if (size
< sizeof(buffer
))
163 length
= sizeof(buffer
);
164 if (read(fd1
, buffer
, length
) != length
) return(1);
165 if (write(fd2
, buffer
, length
) != length
) return (1);