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

📄 readobj.c

📁 早期freebsd实现
💻 C
字号:
/*- * Copyright (c) 1982, 1993 *	The Regents of the University of California.  All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright *    notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright *    notice, this list of conditions and the following disclaimer in the *    documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software *    must display the following acknowledgement: *	This product includes software developed by the University of *	California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors *    may be used to endorse or promote products derived from this software *    without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */#ifndef lintstatic char sccsid[] = "@(#)readobj.c	8.1 (Berkeley) 6/6/93";#endif /* not lint *//* * Read in the namelist from the obj file. */#include "defs.h"#include "sym.h"#include "symtab.h"#include "object.h"#include "objfmt.h"#include "main.h"#include "mappings.h"#include "mappings/filetab.h"#include "mappings/linetab.h"#include "objsym.rep"#define MAXSYMNO 6000char *objname = "obj";LOCAL SYM *sym[MAXSYMNO];readobj(file)char *file;{    register FILE *fp;    struct pxhdr hdr;    if ((fp = fopen(file, "r")) == NIL) {	panic("can't open %s", file);    }    get(fp, hdr);    if (hdr.magicnum != MAGICNUM) {	fseek(fp, (long) (HEADER_BYTES - sizeof(struct pxhdr)), 0);	get(fp, hdr);	if (hdr.magicnum != MAGICNUM) {	    fatal("%s is not a Pascal object file", file);	}    }    if (hdr.symtabsize == 0) {	fatal("%s doesn't have symbolic information", file);    }    objsize = hdr.objsize;    fseek(fp, (long) objsize, 1);    if (get(fp, nlhdr) != 1) {	panic("can't read nlhdr");    }    if (option('h')) {	printf("\nHeader information:\n");	printf("\tobject size %d\n", objsize);	printf("\tsymtab size %d\n", hdr.symtabsize);	printf("\tstringsize  %d\n", nlhdr.stringsize);	printf("\tnsyms       %d\n", nlhdr.nsyms);	printf("\tnfiles      %d\n", nlhdr.nfiles);	printf("\tnlines      %d\n", nlhdr.nlines);    }    stringtab = alloc(nlhdr.stringsize, char);    fread(stringtab, sizeof(char), nlhdr.stringsize, fp);    readsyms(fp);    readfiles(fp);    readlines(fp);    fclose(fp);}/* * Allocate and read in file name information table. */LOCAL readfiles(fp)register FILE *fp;{    register int i;    register FILETAB *ftp;    FILETAB temp;    ADDRESS prevaddr;    filetab = alloc(nlhdr.nfiles, FILETAB);    ftp = &filetab[0];    prevaddr = 0;    for (i = 0; i < nlhdr.nfiles; i++) {	fread(&temp, sizeof(FILETAB), 1, fp);	if (temp.addr != prevaddr) {	    ftp++;	}	*ftp = temp;	ftp->filename += (int) stringtab;	prevaddr = ftp->addr;    }    nlhdr.nfiles = (ftp - &filetab[0]) + 1;    skimsource(filetab[0].filename);    dotpfile = filetab[0].filename;}/* * Allocate and read in line number information table. */LOCAL readlines(fp)FILE *fp;{    register LINENO oline;    register ADDRESS oaddr;    register LINETAB *lp;    FILETAB *ftp;    OBJLINE info;    if (nlhdr.nlines == 0) {	return;    }    linetab = alloc(nlhdr.nlines, LINETAB);    for (lp = &linetab[0]; lp < &linetab[nlhdr.nlines]; lp++) {	lp->line = 0;    }    for (ftp = &filetab[0]; ftp < &filetab[nlhdr.nfiles]; ftp++) {	if (ftp->lineindex < nlhdr.nlines) {	    linetab[ftp->lineindex].line = ftp->line;	}    }    oline = 0;    oaddr = 0;    for (lp = &linetab[0]; lp < &linetab[nlhdr.nlines]; lp++) {	if (lp->line != 0) {	    oline = lp->line;	}	info.together = getw(fp);	oline += info.separate.lineincr;	oaddr += info.separate.addrincr;	lp->line = oline;	lp->addr = oaddr;    }}/* * Read in the symbols. */readsyms(fp)FILE *fp;{    register int i;    int symno;    symtab = st_creat(nlhdr.nsyms);    for (i = 0; i < nlhdr.nsyms; i++) {	symno = getw(fp);	if (symno >= MAXSYMNO) {	    panic("symbol number too large (%d)", symno);	}	sym[symno] = readsym(fp);    }    if (backpatch() != 0) {	panic("patchlist not empty after reading namelist");    }    if (program == NIL) {	panic("no program");    }    maketypes();}typedef struct patchinfo {    SYM **patchsym;    struct patchinfo *next_patch;} PATCH;LOCAL PATCH *phead;/* * Go through patchlist looking for symbol numbers for which the * sym array now has a non-NIL entry. * * Afterwards, zap the sym array. */int backpatch(){    register PATCH *p, *last, *next;    register SYM *s, **t;    int count;    last = NIL;    count = 0;    for (p = phead; p != NIL; p = next) {	next = p->next_patch;	t = p->patchsym;	if ((s = sym[(int) *t]) != NIL) {	    *t = s;	    if (last == NIL) {		phead = next;	    } else {		last->next_patch = next;	    }	    dispose(p);	} else {	    last = p;	    count++;	}    }    for (t = &sym[0]; t < &sym[MAXSYMNO]; t++) {	*t = NIL;    }    return(count);}/* * Check to see if the given pointer (really symbol number) should * be added to the patch list.  The argument is double indirect * to do call by reference passing. */chkpatch(p)SYM **p;{    register SYM *s, *t;    register PATCH *patch;    if ((s = *p) != NIL) {	if ((t = sym[(int) s]) != NIL) {	    *p = t;	} else {	    patch = alloc(1, PATCH);	    patch->patchsym = p;	    patch->next_patch = phead;	    phead = patch;	}    }}/* * Free all the object information. */objfree(){    register int i;    st_destroy(symtab);    dispose(stringtab);    dispose(filetab);    dispose(linetab);    clrfunctab();    for (i = 0; i < MAXSYMNO; i++) {	sym[i] = NIL;    }}

⌨️ 快捷键说明

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