00001
00002
00003 #include <sys/types.h>
00004 #include <sys/stat.h>
00005 #include <fcntl.h>
00006 #include <a.out.h>
00007 #include <unistd.h>
00008 #include <string.h>
00009 #include <stdlib.h>
00010 #include <stdio.h>
00011
00012
00013
00014
00015
00016
00017
00018 #define A_OUT "a.out"
00019 #define NAME_LENGTH 128
00020
00021 char buffer[BUFSIZ];
00022 char new_file[NAME_LENGTH];
00023 struct exec header;
00024
00025 _PROTOTYPE(int main, (int argc, char **argv));
00026 _PROTOTYPE(void strip, (char *file));
00027 _PROTOTYPE(int read_header, (int fd));
00028 _PROTOTYPE(int write_header, (int fd));
00029 _PROTOTYPE(int make_tmp, (char *new_name, char *name));
00030 _PROTOTYPE(int copy_file, (int fd1, int fd2, long size));
00031
00032 int main(argc, argv)
00033 int argc;
00034 char **argv;
00035 {
00036 argv++;
00037 if (*argv == NULL)
00038 strip(A_OUT);
00039 else
00040 while (*argv != NULL) {
00041 strip(*argv);
00042 argv++;
00043 }
00044 return(0);
00045 }
00046
00047 void strip(file)
00048 char *file;
00049 {
00050 int fd, new_fd;
00051 struct stat buf;
00052 long symb_size, relo_size;
00053
00054 fd = open(file, O_RDONLY);
00055 if (fd == -1) {
00056 fprintf(stderr, "can't open %s\n", file);
00057 close(fd);
00058 return;
00059 }
00060 if (read_header(fd)) {
00061 fprintf(stderr, "%s: not an executable file\n", file);
00062 close(fd);
00063 return;
00064 }
00065 if (header.a_syms == 0L) {
00066 close(fd);
00067 return;
00068 }
00069 symb_size = header.a_syms;
00070 header.a_syms = 0L;
00071 fstat(fd, &buf);
00072 relo_size = buf.st_size - (A_MINHDR + header.a_text + header.a_data + symb_size);
00073 new_fd = make_tmp(new_file, file);
00074 if (new_fd == -1) {
00075 fprintf(stderr, "can't create temporary file\n");
00076 close(fd);
00077 return;
00078 }
00079 if (write_header(new_fd)) {
00080 fprintf(stderr, "can't write temporary file\n");
00081 unlink(new_file);
00082 close(fd);
00083 close(new_fd);
00084 return;
00085 }
00086 if (copy_file(fd, new_fd, header.a_text + header.a_data)) {
00087 fprintf(stderr, "can't copy %s\n", file);
00088 unlink(new_file);
00089 close(fd);
00090 close(new_fd);
00091 return;
00092 }
00093 if (relo_size != 0) {
00094 lseek(fd, symb_size, 1);
00095 if (copy_file(fd, new_fd, relo_size)) {
00096 fprintf(stderr, "can't copy %s\n", file);
00097 unlink(new_file);
00098 close(fd);
00099 close(new_fd);
00100 return;
00101 }
00102 }
00103 close(fd);
00104 close(new_fd);
00105 if (unlink(file) == -1) {
00106 fprintf(stderr, "can't unlink %s\n", file);
00107 unlink(new_file);
00108 return;
00109 }
00110 link(new_file, file);
00111 unlink(new_file);
00112 chmod(file, buf.st_mode);
00113 }
00114
00115 int read_header(fd)
00116 int fd;
00117 {
00118 if (read(fd, (char *) &header, A_MINHDR) != A_MINHDR) return(1);
00119 if (BADMAG(header)) return (1);
00120 if (header.a_hdrlen > sizeof(struct exec)) return (1);
00121 lseek(fd, 0L, SEEK_SET);
00122 if (read(fd, (char *)&header, (int)header.a_hdrlen) != (int) header.a_hdrlen)
00123 return(1);
00124 return(0);
00125 }
00126
00127 int write_header(fd)
00128 int fd;
00129 {
00130 lseek(fd, 0L, SEEK_SET);
00131 if (write(fd, (char *)&header, (int)header.a_hdrlen) != (int)header.a_hdrlen)
00132 return(1);
00133 return(0);
00134 }
00135
00136 int make_tmp(new_name, name)
00137 char *new_name, *name;
00138 {
00139 int len;
00140 char *nameptr;
00141
00142 len = strlen(name);
00143 if (len + 1 > NAME_LENGTH) return(-1);
00144 strcpy(new_name, name);
00145 nameptr = strrchr(new_name, '/');
00146 if (nameptr == NULL) nameptr = new_name - 1;
00147 if (nameptr - new_name + 6 + 1 > NAME_LENGTH) return (-1);
00148 strcpy(nameptr + 1, "XXXXXX");
00149 mktemp(new_name);
00150 return(creat(new_name, 0777));
00151 }
00152
00153 int copy_file(fd1, fd2, size)
00154 int fd1, fd2;
00155 long size;
00156 {
00157 int length;
00158
00159 while (size > 0) {
00160 if (size < sizeof(buffer))
00161 length = size;
00162 else
00163 length = sizeof(buffer);
00164 if (read(fd1, buffer, length) != length) return(1);
00165 if (write(fd2, buffer, length) != length) return (1);
00166 size -= length;
00167 }
00168 return(0);
00169 }