V9/jerq/sgs/strip/checkflags.c

/* UNIX HEADER */
#include	<stdio.h>

/* COMMON SGS HEADERS */
#include	"filehdr.h"
#include	"ldfcn.h"


    /*  checkflags(filename, &filehead)
     *
     *  checks and sets object file header flags appropriately
     *
     *  checkflags returns SUCCESS or FAILURE
     *
     *  checkflags will FAIL (and strip won't strip) in the following cases:
     *  if there is no symbol table (strip announces the fact if lflag, xflag
     *  or bflag imply that symbols were expected)
     *  if lflag, xflag or bflag is ON and there are no local symbols 
     *  if lflag is OFF and there are relocation entries 
     *
     *  the file flags in the file header are set to reflect the new state of
     *  of the file:
     *  if xflag, bflag and lflag are all OFF there will be no symbols nor any
     *  line numbers in the file
     *  if xflag is ON then there will be no local symbols nor any line numbers
     *  if bflag is ON then there will be no local symbols except .bb, .eb, .bf
     *  and .ef
     *  if lflag is ON then there will be no line numbers
     */


int
checkflags(filename, filehead)

char	*filename;
FILHDR	*filehead;

{
    /* STRIP FUNCTION CALLED */
    extern		error( );

    /* EXTERNAL VARIABLES USED */
    extern LDFILE	*ldptr;
    extern int		lflag,
			xflag,
			bflag,
			sflag,
			rflag;
	extern int	fflag;

    /* LOCAL VARIABLE */
    unsigned short	filflags;

    if (filehead->f_nsyms == 0L) {
	if (lflag || xflag || bflag || rflag || sflag || fflag ) {
	    error(filename, "no symbol table", 1);
	   onintr();
	}
	return(FAILURE);

    } else if (!(lflag || xflag || bflag || rflag || sflag || fflag)) {
	filehead->f_nsyms = 0L;
    }

    filflags = filehead->f_flags;

    if (sflag && (filflags & F_LSYMS) != 0)
    {
	    error(filename, "no local symbols", 1);
	    return(FAILURE);
    }

	if (((!rflag) && (!fflag) && (!lflag)) && (filflags & F_RELFLG) == 0) {
	    error(filename, "relocation entries; cannot strip", 1);
	    return(FAILURE);
	}

#if !UNIX
	if (fflag && !(filflags & F_EXEC)) {
		error( filename, "not executable, cannot strip", 1);
		return( FAILURE );
	}
#endif

    return(SUCCESS);
}
/*
 *	@(#)checkflags.c	1.6 11/4/83;
 */