File:  [Power 6/32 Unix Tahoe 4.2BSD] / cci / usr / src / bin / cdb / symfix.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs
Sun Jul 28 12:24:19 2019 UTC (6 years, 11 months ago) by root
Branches: bsd, MAIN
CVS tags: v12b, v121, HEAD
Power 6/32 Unix version 1.2b

static char sccsid[] = "@(#)symfix.c	2.4";

#include <stdio.h>
#include <fcntl.h>
#include <a.out.h>
#include "basic.h"

long	lseek();

typedef struct exec EXECR, *pEXECR;
#define cbEXECR sizeof(EXECR)

/* stuff directly related to the symbol table */
typedef struct SYMS {	/* same record as `nlist, but with my names */
	char	name[8];	/* symbol name */
	int	type;		/* type flag */
	uint	value;		/* something appropriate to the type */
} 
SYMR, *pSYMR;
#define cbSYMR sizeof(SYMR)


FLAGT	vfDirty;	/* indicates current cache has been mofified */
short	vfnSym;
short	visymMax;	/* number of symbols */
long	vcbSymFirst;	/* byte offset to first symbol */
#define iCacheMax  1024			/* number of symbols in cache */
SYMR	vsymCache[iCacheMax];	/* symbol cache */
short	viCacheMac;		/* max index into cache */
#define cbSymCache sizeof(vsymCache)
short	viSMin, viSMax;	/* min/max values for what is in cache */

char	sbHdrLn[] = "~_l";
short	cbHdrLn = 3;


/* I N I T   S Y M F I L E */

void InitSymfile(sbSymName)
char	*sbSymName;
{
	short	magic, relflg;
	long	cbData, cbText;
	EXECR	execSym;

/* printf("Opening file %s\n", sbSymName); */
	vfnSym = open(sbSymName, O_RDWR);
	if (vfnSym < 0) {
		perror(sbSymName);
		exit(1);
	}

	if (read(vfnSym, &execSym, cbEXECR) == cbEXECR) {
		visymMax = execSym.a_syms / cbSYMR;
		cbData = execSym.a_data;
		cbText = execSym.a_text;
		vcbSymFirst = cbText + cbData;	/* will be adjusted at end */
		if (execSym.a_flag != 1)
			vcbSymFirst <<= 1;
		vcbSymFirst += cbEXECR;
	} 
	else {
		perror("Bad read of file header");
		exit(1);
	}
	vfDirty = false;
} /* InitSymfile */


/* W R I T E   C A C H E */

void WriteCache()
{
	long	ret, l1, l2, offset;
	short	cbWrite, x;

	l1 = viSMin;
	l2 = cbSYMR;
	offset = vcbSymFirst + (l1 * l2);
	/* we write out this buffer before reading in the next */
	if ((ret=lseek(vfnSym, offset, 0)) < 0l) {
		perror("Bad seek in WriteCache");
		exit(1);
	}
	l1 = viSMax - viSMin;
	cbWrite = l2 * l1;
	x = write(vfnSym, vsymCache, cbWrite);
	if (x < 0) {
		perror("Bad write in WriteCache");
		exit(1);
	}
	vfDirty = false;
} /* WriteCache */


/* S E T   C A C H E */

void SetCache(isym)
short	isym;
{
	short	cRead;
	long	l1, l2, ret, offset;

	if (isym >= viSMin AND isym < viSMax)
		return;	/* it is already in there, somewhere */
	if (vfDirty) {
		WriteCache();
	}
	l1 = isym;
	l2 = cbSYMR;
	offset = vcbSymFirst + (l1 * l2);
	if ((ret=lseek(vfnSym, offset, 0)) < 0l) {
		printf("ret = %ld l1 %ld  l2 %ld  offset %ld\n", ret, l1, l2, offset);
		perror("Bad seek in SetCache");
		exit(1);
	}
	cRead = read(vfnSym, vsymCache, cbSymCache);
	if (cRead < 0) {
		perror("Bad read in SetCache");
		exit(1);
	}
	viSMin = isym;
	viCacheMac = cRead / cbSYMR;
	viSMax = isym + viCacheMac;
} /* SetCache */


/* M U N C H   S Y M S */

void MunchSyms()
{
	short	isym, i;
	pSYMR	sym;

	viSMin = 0;
	viSMax = -1;
	isym = 0;

	while (isym < visymMax) {
		SetCache(isym);
		for (i=(isym-viSMin); i<viCacheMac; i++, isym++) {
			sym = vsymCache + i;
			if (sym->type ==  N_TEXT) {
				if ( (strncmp(sym->name, sbHdrLn, cbHdrLn) == 0)
				    AND ((sym->name[cbHdrLn] == 'N')
				    OR (sym->name[cbHdrLn] == 'E')) ) {
					/* this is either line number or proc end number */
					sym->type = N_ABS;
					vfDirty = true;
				}
			}
		}
	}
	if (vfDirty)
		WriteCache();
	close(vfnSym);
} /* MunchSyms */


/* M A I N */

void main(argc, argv)
int	argc;
char	*argv[];
{
	FLAGT	fDidOne;
	short	i;
	char	*cp;

	fDidOne = false;

	for (i=1; i<argc; ++i) {
		if (*(cp=argv[i]) != '-') {
			fDidOne = true;
			InitSymfile(cp);
			MunchSyms();
		}
	} /* for */

	if (!fDidOne) {
		/* then let's assume they want a.out done */
		InitSymfile("a.out");
		MunchSyms();
	}
	exit(0);
} /* main */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.