strip.c

Go to the documentation of this file.
00001 /* strip - remove symbols.              Author: Dick van Veen */
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 /* Strip [file] ...
00013  *
00014  *      -       when no file is present, a.out is assumed.
00015  *
00016  */
00017 
00018 #define A_OUT           "a.out"
00019 #define NAME_LENGTH     128     /* max file path name */
00020 
00021 char buffer[BUFSIZ];            /* used to copy executable */
00022 char new_file[NAME_LENGTH];     /* contains name of temporary */
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);              /* no symbol table present */
00067         return;
00068   }
00069   symb_size = header.a_syms;
00070   header.a_syms = 0L;           /* remove table size */
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);      /* variable size header */
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 }

Generated on Fri Apr 14 22:57:11 2006 for minix by  doxygen 1.4.6