warn(fn);
warn("%s", fn);
s_sym(fn, fd, ep, sp)	const char *fn;	int fd;	register EXEC *ep;	struct stat *sp;{	register char *neweof, *mineof;	int zmagic;	zmagic = ep->a_data &&		 (N_GETMAGIC(*ep) == ZMAGIC || N_GETMAGIC(*ep) == QMAGIC);	/*	 * If no symbols or data/text relocation info and	 * the file data segment size is already minimized, quit.	 */	if (!ep->a_syms && !ep->a_trsize && !ep->a_drsize) {#if 0		if (!zmagic)			return 0;		if (sp->st_size < N_TRELOFF(*ep))#endif			return 0;	}	/*	 * New file size is the header plus text and data segments; OMAGIC	 * and NMAGIC formats have the text/data immediately following the	 * header.  ZMAGIC format wastes the rest of of header page.	 */	neweof = (char *)ep + N_TRELOFF(*ep);#if 0	/*	 * Unfortunately, this can't work correctly without changing the way	 * the loader works.  We could cap it at one page, or even fiddle with	 * a_data and a_bss, but this only works for CLBYTES == NBPG.  If we	 * are on a system where, e.g., CLBYTES is 8k and NBPG is 4k, and we	 * happen to remove 4.5k, we will lose.  And we really don't want to	 * fiddle with pages, because that breaks binary compatibility.  Lose.	 */	if (zmagic) {		/*		 * Get rid of unneeded zeroes at the end of the data segment		 * to reduce the file size even more.		 */		mineof = (char *)ep + N_DATOFF(*ep);		while (neweof > mineof && neweof[-1] == '\0')			neweof--;	}#endif	/* Set symbol size and relocation info values to 0. */	ep->a_syms = ep->a_trsize = ep->a_drsize = 0;	/* Truncate the file. */	if (ftruncate(fd, neweof - (char *)ep)) {		warn(fn);		return 1;	}	return 0;}