|
|
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 */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.