⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 strip.c

📁 操作系统源代码
💻 C
字号:
/* strip - remove symbols.		Author: Dick van Veen */#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <a.out.h>#include <unistd.h>#include <string.h>#include <stdlib.h>#include <stdio.h>/* Strip [file] ... * *	-	when no file is present, a.out is assumed. * */#define A_OUT		"a.out"#define NAME_LENGTH	128	/* max file path name */char buffer[BUFSIZ];		/* used to copy executable */char new_file[NAME_LENGTH];	/* contains name of temporary */struct exec header;_PROTOTYPE(int main, (int argc, char **argv));_PROTOTYPE(void strip, (char *file));_PROTOTYPE(int read_header, (int fd));_PROTOTYPE(int write_header, (int fd));_PROTOTYPE(int make_tmp, (char *new_name, char *name));_PROTOTYPE(int copy_file, (int fd1, int fd2, long size));int main(argc, argv)int argc;char **argv;{  argv++;  if (*argv == NULL)	strip(A_OUT);  else	while (*argv != NULL) {		strip(*argv);		argv++;	}  return(0);}void strip(file)char *file;{  int fd, new_fd;  struct stat buf;  long symb_size, relo_size;  fd = open(file, O_RDONLY);  if (fd == -1) {	fprintf(stderr, "can't open %s\n", file);	close(fd);	return;  }  if (read_header(fd)) {	fprintf(stderr, "%s: not an executable file\n", file);	close(fd);	return;  }  if (header.a_syms == 0L) {	close(fd);		/* no symbol table present */	return;  }  symb_size = header.a_syms;  header.a_syms = 0L;		/* remove table size */  fstat(fd, &buf);  relo_size = buf.st_size - (A_MINHDR + header.a_text + header.a_data + symb_size);  new_fd = make_tmp(new_file, file);  if (new_fd == -1) {	fprintf(stderr, "can't create temporary file\n");	close(fd);	return;  }  if (write_header(new_fd)) {	fprintf(stderr, "can't write temporary file\n");	unlink(new_file);	close(fd);	close(new_fd);	return;  }  if (copy_file(fd, new_fd, header.a_text + header.a_data)) {	fprintf(stderr, "can't copy %s\n", file);	unlink(new_file);	close(fd);	close(new_fd);	return;  }  if (relo_size != 0) {	lseek(fd, symb_size, 1);	if (copy_file(fd, new_fd, relo_size)) {	    fprintf(stderr, "can't copy %s\n", file);	    unlink(new_file);	    close(fd);	    close(new_fd);	    return;	}  }  close(fd);  close(new_fd);  if (unlink(file) == -1) {	fprintf(stderr, "can't unlink %s\n", file);	unlink(new_file);	return;  }  link(new_file, file);  unlink(new_file);  chmod(file, buf.st_mode);}int read_header(fd)int fd;{  if (read(fd, (char *) &header, A_MINHDR) != A_MINHDR) return(1);  if (BADMAG(header)) return (1);  if (header.a_hdrlen > sizeof(struct exec)) return (1);  lseek(fd, 0L, SEEK_SET);	/* variable size header */  if (read(fd, (char *)&header, (int)header.a_hdrlen) != (int) header.a_hdrlen)	return(1);  return(0);}int write_header(fd)int fd;{  lseek(fd, 0L, SEEK_SET);  if (write(fd, (char *)&header, (int)header.a_hdrlen) != (int)header.a_hdrlen)	return(1);  return(0);}int make_tmp(new_name, name)char *new_name, *name;{  int len;  char *nameptr;  len = strlen(name);  if (len + 1 > NAME_LENGTH) return(-1);  strcpy(new_name, name);  nameptr = strrchr(new_name, '/');  if (nameptr == NULL) nameptr = new_name - 1;  if (nameptr - new_name + 6 + 1 > NAME_LENGTH) return (-1);  strcpy(nameptr + 1, "XXXXXX");  mktemp(new_name);  return(creat(new_name, 0777));}int copy_file(fd1, fd2, size)int fd1, fd2;long size;{  int length;  while (size > 0) {	if (size < sizeof(buffer))		length = size;	else		length = sizeof(buffer);	if (read(fd1, buffer, length) != length) return(1);	if (write(fd2, buffer, length) != length) return (1);	size -= length;  }  return(0);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -