shithub: scc

Download patch

ref: a4f55bc2a984f51aa2afef82f7f6257dece7a09d
parent: 6a2031a326adf120eaa2c0baa5201f074251ed9c
author: Roberto E. Vargas Caballero <[email protected]>
date: Fri Jan 4 10:33:43 EST 2019

Remove libcoff32

The work of this library is going to be done by libmach.

--- a/src/Makefile
+++ b/src/Makefile
@@ -4,7 +4,7 @@
 include $(PROJECTDIR)/scripts/rules.mk
 
 TOOLS = cc1 cc2 ld as nm objdump
-LIBS  = libscc libcoff32 libc libcrt libmach
+LIBS  = libscc libc libcrt libmach
 DIRS  = $(TOOLS) $(LIBS)
 
 all: $(TOOLS)
--- a/src/ld/coff32.c
+++ /dev/null
@@ -1,403 +1,0 @@
-static char sccsid[] = "@(#) ./ld/coff32.c";
-
-#include <assert.h>
-#include <ctype.h>
-#include <errno.h>
-#include <limits.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include <scc/coff32/aouthdr.h>
-#include <scc/coff32/filehdr.h>
-#include <scc/coff32/scnhdr.h>
-#include <scc/coff32/syms.h>
-#include <scc/coff32/coff32.h>
-#include <scc/scc.h>
-#include "ld.h"
-
-#define NUMSCN_MAX 65536
-#define NUMENT_MAX 2147483648
-
-static long textpc = 0x1000;
-
-/*
- * check overflow in: off + ptr + nitem*size
- */
-static char *
-symname(Obj *obj, SYMENT *ent)
-{
-	long off;
-
-	if (ent->n_zeroes != 0)
-		return ent->n_name;
-
-	off = ent->n_offset;
-	if (off >= obj->strsiz) {
-		fprintf(stderr,
-		        "ld: invalid offset in symbol table: %zd\n", off);
-		return "";
-	}
-
-	return &obj->strtbl[off];
-}
-
-static int
-readstr(Obj *obj, long off)
-{
-	unsigned char buff[4];
-	char *str;
-	size_t siz;
-
-	if (fseek(obj->fp, off, SEEK_SET) == EOF)
-		return -1;
-
-	if (fread(buff, 4, 1, obj->fp) != 1)
-		return -1;
-
-	(*obj->unpack)(buff, "l", &siz);
-
-	siz -= 4;
-	if (siz == 0) {
-		obj->strtbl = NULL;
-		obj->strsiz = 0;
-		return 0;
-	}
-
-	if (siz > SIZE_MAX || (str = malloc(siz)) == NULL)
-		outmem();
-
-	if (fread(str, siz, 1, obj->fp) != 1)
-		return -1;
-
-	obj->strtbl = str;
-	obj->strsiz = siz;
-
-	return 0;
-}
-
-static int
-readsects(Obj *obj, long off)
-{
-	unsigned a, nsec, i;
-	unsigned char buff[SCNHSZ];
-	SCNHDR *scns, *p;
-	FILHDR *hdr;
-	Symbol *sym;
-	Section *sp;
-
-	hdr = obj->filhdr;
-	nsec = hdr->f_nscns;
-
-	scns = NULL;
-	if (nsec <= SIZE_MAX / sizeof(*scns))
-		scns = malloc(nsec * sizeof(*scns));
-	if (!scns)
-		outmem();
-	obj->scnhdr = scns;
-
-	if (fseek(obj->fp, off, SEEK_SET) == EOF)
-		return -1;
-
-	a = obj->align - 1;
-	for (i = 0; i < nsec; ++i) {
-		p = &scns[i];
-		if (fread(buff, SCNHSZ, 1, obj->fp) != 1)
-			return -1;
-		coff32_unpack_scn(obj->unpack, buff, p);
-		sp = slookup(p->s_name);
-		p->s_vaddr = sp->base + sp->size;
-		sp->size += p->s_size;
-	}
-
-	return 0;
-}
-
-static int
-readents(Obj *obj, long off)
-{
-	SYMENT *ent, *ents;
-	SCNHDR *scn, *scns = obj->scnhdr;
-	FILHDR *hdr = obj->filhdr;;
-	long nsyms = hdr->f_nsyms;
-	unsigned nsect;
-	unsigned char buff[SYMESZ];
-	char *s;
-	int aux;
-	Symbol *sym;
-
-
-	if (fseek(obj->fp, off, SEEK_SET) == EOF)
-		return -1;
-
-	ents = NULL;
-	if (nsyms <= SIZE_MAX/sizeof(SYMENT))
-		ents = malloc((nsyms * sizeof(SYMENT)));
-	if (!ents)
-		outmem();
-	obj->enthdr = ents;
-
-	aux = 0;
-	for (ent = ents; ent < &ents[nsyms]; ++ent) {
-		if (fread(buff, SYMESZ, 1, obj->fp) != 1)
-			return -1;
-		coff32_unpack_ent(obj->unpack, buff, ent);
-		s = ent->n_name;
-		if (!s[0] && !s[1] && !s[2] && !s[3])
-			(*obj->unpack)(buff, "ll", &ent->n_zeroes, &ent->n_offset);
-
-		if (aux > 0) {
-			aux--;
-			continue;
-		}
-		aux = ent->n_numaux;
-
-		scn = NULL;
-		switch (ent->n_scnum) {
-		case N_DEBUG:
-			continue;
-		case N_ABS:
-			break;
-		case N_UNDEF:
-			/* TODO: deal wth common blocks */
-			break;
-		default:
-			nsect = ent->n_scnum-1;
-			if (nsect >= hdr->f_nscns)
-				corrupted(obj->fname, obj->member);
-			scn = &scns[nsect];
-			ent->n_value += scn->s_vaddr;
-		}
-
-		if (ent->n_sclass == C_EXT && ent->n_scnum != N_UNDEF) {
-			Symbol *sym = lookup(symname(obj, ent), INSTALL);
-
-			if (sym->flags & SDEFINED) {
-				redefined(obj, sym);
-			} else {
-				sym->flags |= SDEFINED;
-				sym->where = obj;
-				if (scn)
-					sym->section = slookup(scn->s_name);
-			}
-		}
-	}
-
-	return 0;
-}
-
-static long
-fileptr(long off, long ptr, long nitem, long size)
-{
-	if (off < 0 || ptr < 0 || nitem < 0 || size < 0)
-		return -1;
-
-	if (off > LONG_MAX - ptr)
-		return -1;
-	off += ptr;
-
-	if (size > 0) {
-		if (nitem > LONG_MAX / size)
-			return -1;
-		size *= nitem;
-	}
-
-	if (off > LONG_MAX - size)
-		return -1;
-	off += size;
-
-	return off;
-}
-
-Obj *
-load(Obj *obj)
-{
-	unsigned char buff[FILHSZ];
-	FILHDR *hdr;
-	char *strtbl;
-	long symoff, secoff, stroff, pos;
-
-	pos = ftell(obj->fp);
-	if (fread(buff, FILHSZ, 1, obj->fp) != 1)
-		goto bad_file;
-
-	if ((hdr = malloc(sizeof(*hdr))) == NULL)
-		outmem();
-	coff32_unpack_hdr(obj->unpack, buff, hdr);
-	obj->filhdr = hdr;
-
-	stroff = fileptr(pos, hdr->f_symptr, hdr->f_nsyms, SYMESZ);
-	symoff = fileptr(pos, hdr->f_symptr, 0, 0);
-	secoff = fileptr(pos, hdr->f_opthdr, 1, FILHSZ);
-
-	if (stroff < 0 || symoff < 0 || secoff < 0)
-		goto bad_file;
-
-	if (readstr(obj, stroff) < 0)
-		goto bad_file;
-	if (readsects(obj, secoff) < 0)
-		goto bad_file;
-	if (readents(obj, symoff) < 0)
-		goto bad_file;
-	return add(obj);
-
-bad_file:
-	fprintf(stderr,
-	        "ld: %s: %s\n",
-	         obj->fname,
-	         (ferror(obj->fp)) ? strerror(errno) : "corrupted file");
-	exit(EXIT_FAILURE);
-}
-
-Obj *
-probe(char *fname, char *member, FILE *fp)
-{
-	int c;
-	int c1, c2;
-	long pos;
-	unsigned short magic;
-	unsigned align;
-	int (*unpack)(unsigned char *, char *, ...);
-	int (*pack)(unsigned char *, char *, ...);
-	Obj *obj;
-
-	pos = ftell(fp);
-	c1 = getc(fp);
-	c2 = getc(fp);
-	fseek(fp, pos, SEEK_SET);
-
-	if (ferror(fp))
-		die("ld: %s: %s", fname, strerror(errno));
-
-	if (c1 == EOF || c2 == EOF)
-		return 0;
-	magic = c1 | c2 << 8;
-
-	switch (magic) {
-	case COFF_I386MAGIC:
-	case COFF_Z80MAGIC:
-		unpack = lunpack;
-		pack = lpack;
-		align = 2;
-		break;
-	default:
-		return NULL;
-	}
-
-	obj = newobj(fname, member, fp);
-	obj->unpack = unpack;
-	obj->align = align;
-	obj->offset = pos;
-
-	return obj;
-}
-
-static void
-wrhdr(FILE *fp)
-{
-	FILHDR hdr;
-	Section *sp;
-	unsigned char buff[FILHSZ];
-
-	if (numsects > NUMSCN_MAX || numsymbols > NUMENT_MAX) {
-		fprintf(stderr, "ld: too many symbols or sections\n");
-		exit(EXIT_FAILURE);
-	}
-
-	/*
-	 * we set the timestamp to 0 to make the output
-	 * reproductible and to avoid a not standard use
-	 * of time()
-	 */
-	hdr.f_symptr = 0;
-	hdr.f_magic = COFF_Z80MAGIC;
-	hdr.f_nscns = numsects;
-	hdr.f_symptr = 0;
-	hdr.f_timdat = 0;
-	hdr.f_nsyms = 0;
-	hdr.f_opthdr = AOUTSZ;
-	hdr.f_flags = F_EXEC | F_AR32WR; /* TODO: set the correct endianess */
-
-	if (!sflag) {
-		hdr.f_symptr = 0; /* TODO: set correct value here */
-		hdr.f_flags |= F_SYMS;
-		hdr.f_nsyms = numsymbols;
-	}
-
-	coff32_pack_hdr(lpack, buff, &hdr);
-	fwrite(buff, FILHSZ, 1, fp);
-}
-
-static void
-wraout(FILE *fp)
-{
-	AOUTHDR aout;
-	unsigned char buff[AOUTSZ];
-	Symbol *sym;
-	long addr;
-
-	if ((sym = lookup(entry, NOINSTALL)) != NULL) {
-		addr = sym->value;
-	} else {
-		fprintf(stderr,
-		        "ld: warning: cannot find entry symbol '%s'; defaulting to 0\n",
-		        entry);
-		addr = 0;
-	} 
-
-	aout.magic = ZMAGIC;
-	aout.vstamp = 0;
-	aout.entry = addr;
-	aout.tsize = tsize;
-	aout.dsize = dsize;
-	aout.bsize = bsize;
-	aout.text_start = textpc;
-	aout.data_start = textpc + dsize;
-
-	coff32_pack_aout(lpack, buff, &aout);
-	fwrite(buff, AOUTSZ, 1, fp);
-}
-
-static void
-wrscn(FILE *fp, Section *sp, long pc)
-{
-	SCNHDR scn;
-	unsigned char buff[SCNHSZ];
-
-	strcpy(scn.s_name, sp->name);
-	scn.s_paddr = pc;
-	scn.s_vaddr = pc;
-	scn.s_size = sp->size;
-	scn.s_scnptr = 0; /* TODO: file ptr */
-	scn.s_relptr = 0;
-	scn.s_lnnoptr = 0;
-	scn.s_nrelloc = 0;
-	scn.s_nlnno = 0;
-	scn.s_flags = 0; /* TODO: Add flags */
-
-	coff32_pack_scn(lpack, buff, &scn);
-	fwrite(buff, SCNHSZ, 1, fp);
-}
-
-void
-writeout(FILE *fp)
-{
-	Section *sp;
-	long pc = textpc;
-
-	wrhdr(fp);
-	wraout(fp);
-
-	for (sp = sectlst; sp; sp = sp->next) {
-		wrscn(fp, sp, pc);
-		pc += sp->size;
-	}
-
-	/* TODO: run over all the files */
-
-	if (fflush(fp) == EOF) {
-		perror("ld: error writing output file");
-		exit(EXIT_FAILURE);
-	}
-}
--- a/src/ld/deps.mk
+++ b/src/ld/deps.mk
@@ -1,12 +1,5 @@
 
 #deps
-coff32.o: $(INCDIR)/scc/scc/coff32/aouthdr.h
-coff32.o: $(INCDIR)/scc/scc/coff32/coff32.h
-coff32.o: $(INCDIR)/scc/scc/coff32/filehdr.h
-coff32.o: $(INCDIR)/scc/scc/coff32/scnhdr.h
-coff32.o: $(INCDIR)/scc/scc/coff32/syms.h
-coff32.o: $(INCDIR)/scc/scc/scc.h
-coff32.o: ld.h
 main.o: $(INCDIR)/scc/scc/ar.h
 main.o: $(INCDIR)/scc/scc/scc.h
 main.o: $(INCDIR)/scc/scc/syslibs.h
--- a/src/libcoff32/Makefile
+++ /dev/null
@@ -1,24 +1,0 @@
-.POSIX:
-
-PROJECTDIR = ../..
-include $(PROJECTDIR)/scripts/rules.mk
-
-OBJS = coff32_pack_hdr.o \
-       coff32_unpack_hdr.o \
-       coff32_pack_scn.o \
-       coff32_unpack_scn.o \
-       coff32_pack_aout.o \
-       coff32_unpack_aout.o \
-       coff32_pack_ent.o \
-       coff32_unpack_ent.o \
-
-TARGET = $(LIBDIR)/libcoff32.a
-
-all: $(TARGET)
-
-$(TARGET): $(OBJS)
-	mklib -o $@ $?
-
-dep: inc-dep
-
-include deps.mk
--- a/src/libcoff32/coff32_pack_aout.c
+++ /dev/null
@@ -1,9 +1,0 @@
-#include <assert.h>
-
-#include <scc/coff32/aouthdr.h>
-#include <scc/coff32/coff32.h>
-
-void
-coff32_pack_aout(packfun fun, unsigned char *buff, AOUTHDR *aout)
-{
-}
--- a/src/libcoff32/coff32_pack_ent.c
+++ /dev/null
@@ -1,20 +1,0 @@
-#include <assert.h>
-
-#include <scc/coff32/syms.h>
-#include <scc/coff32/coff32.h>
-
-void
-coff32_pack_ent(packfun fun, unsigned char *buff, SYMENT *ent)
-{
-	int n;
-
-	n = (*fun)(buff,
-		   "'8lsscc",
-		   &ent->n_name,
-		   &ent->n_value,
-		   &ent->n_scnum,
-		   &ent->n_type,
-		   &ent->n_sclass,
-		   &ent->n_numaux);
-	assert(n == SYMESZ);
-}
--- a/src/libcoff32/coff32_pack_hdr.c
+++ /dev/null
@@ -1,21 +1,0 @@
-#include <assert.h>
-
-#include <scc/coff32/filehdr.h>
-#include <scc/coff32/coff32.h>
-
-void
-coff32_pack_hdr(packfun fun, unsigned char *buff, FILHDR *hdr)
-{
-	int n;
-
-	n = (*fun)(buff,
-	           "sslllss",
-	           hdr->f_magic,
-	           hdr->f_nscns,
-	           hdr->f_timdat,
-	           hdr->f_symptr,
-	           hdr->f_nsyms,
-	           hdr->f_opthdr,
-	           hdr->f_flags);
-	assert(n == FILHSZ);
-}
--- a/src/libcoff32/coff32_pack_scn.c
+++ /dev/null
@@ -1,24 +1,0 @@
-#include <assert.h>
-
-#include <scc/coff32/scnhdr.h>
-#include <scc/coff32/coff32.h>
-
-void
-coff32_pack_scn(packfun fun, unsigned char *buff, SCNHDR *scn)
-{
-	int n;
-
-	n = (*fun)(buff,
-                  "'8llllllssl",
-	          scn->s_name,
-	          scn->s_paddr,
-	          scn->s_vaddr,
-	          scn->s_size,
-	          scn->s_scnptr,
-	          scn->s_relptr,
-	          scn->s_lnnoptr,
-	          scn->s_nrelloc,
-	          scn->s_nlnno,
-	          scn->s_flags);
-	assert(n == SCNHSZ);
-}
--- a/src/libcoff32/coff32_unpack_aout.c
+++ /dev/null
@@ -1,9 +1,0 @@
-#include <assert.h>
-
-#include <scc/coff32/aouthdr.h>
-#include <scc/coff32/coff32.h>
-
-void
-coff32_unpack_aout(packfun fun, unsigned char *buff, AOUTHDR *ent)
-{
-}
--- a/src/libcoff32/coff32_unpack_ent.c
+++ /dev/null
@@ -1,20 +1,0 @@
-#include <assert.h>
-
-#include <scc/coff32/syms.h>
-#include <scc/coff32/coff32.h>
-
-void
-coff32_unpack_ent(packfun fun, unsigned char *buff, SYMENT *ent)
-{
-	int n;
-
-	n = (*fun)(buff,
-		   "'8lsscc",
-		   &ent->n_name,
-		   &ent->n_value,
-		   &ent->n_scnum,
-		   &ent->n_type,
-		   &ent->n_sclass,
-		   &ent->n_numaux);
-	assert(n == SYMESZ);
-}
--- a/src/libcoff32/coff32_unpack_hdr.c
+++ /dev/null
@@ -1,22 +1,0 @@
-#include <assert.h>
-
-#include <scc/coff32/filehdr.h>
-#include <scc/coff32/coff32.h>
-
-void
-coff32_unpack_hdr(packfun fun, unsigned char *buff, FILHDR *hdr)
-{
-	int n;
-
-	n = (*fun)(buff,
-	           "sslllss",
-	           &hdr->f_magic,
-	           &hdr->f_nscns,
-	           &hdr->f_timdat,
-	           &hdr->f_symptr,
-	           &hdr->f_nsyms,
-	           &hdr->f_opthdr,
-	           &hdr->f_flags);
-	assert(n == FILHSZ);
-}
-
--- a/src/libcoff32/coff32_unpack_scn.c
+++ /dev/null
@@ -1,24 +1,0 @@
-#include <assert.h>
-
-#include <scc/coff32/scnhdr.h>
-#include <scc/coff32/coff32.h>
-
-void
-coff32_unpack_scn(packfun fun, unsigned char *buff, SCNHDR *scn)
-{
-	int n;
-
-	n = (*fun)(buff,
-                  "'8llllllssl",
-	          scn->s_name,
-	          &scn->s_paddr,
-	          &scn->s_vaddr,
-	          &scn->s_size,
-	          &scn->s_scnptr,
-	          &scn->s_relptr,
-	          &scn->s_lnnoptr,
-	          &scn->s_nrelloc,
-	          &scn->s_nlnno,
-	          &scn->s_flags);
-	assert(n == SCNHSZ);
-}
--- a/src/libcoff32/deps.mk
+++ /dev/null
@@ -1,17 +1,0 @@
-#deps
-coff32_pack_aout.o: $(INCDIR)/scc/scc/coff32/aouthdr.h
-coff32_pack_aout.o: $(INCDIR)/scc/scc/coff32/coff32.h
-coff32_pack_ent.o: $(INCDIR)/scc/scc/coff32/coff32.h
-coff32_pack_ent.o: $(INCDIR)/scc/scc/coff32/syms.h
-coff32_pack_hdr.o: $(INCDIR)/scc/scc/coff32/coff32.h
-coff32_pack_hdr.o: $(INCDIR)/scc/scc/coff32/filehdr.h
-coff32_pack_scn.o: $(INCDIR)/scc/scc/coff32/coff32.h
-coff32_pack_scn.o: $(INCDIR)/scc/scc/coff32/scnhdr.h
-coff32_unpack_aout.o: $(INCDIR)/scc/scc/coff32/aouthdr.h
-coff32_unpack_aout.o: $(INCDIR)/scc/scc/coff32/coff32.h
-coff32_unpack_ent.o: $(INCDIR)/scc/scc/coff32/coff32.h
-coff32_unpack_ent.o: $(INCDIR)/scc/scc/coff32/syms.h
-coff32_unpack_hdr.o: $(INCDIR)/scc/scc/coff32/coff32.h
-coff32_unpack_hdr.o: $(INCDIR)/scc/scc/coff32/filehdr.h
-coff32_unpack_scn.o: $(INCDIR)/scc/scc/coff32/coff32.h
-coff32_unpack_scn.o: $(INCDIR)/scc/scc/coff32/scnhdr.h