Module Name:    src
Committed By:   christos
Date:           Thu Feb 23 18:49:00 UTC 2017

Modified Files:
        src/usr.bin/elf2ecoff: elf2ecoff.c

Log Message:
This only works with 32 bit Elf and COFF files, make it specific this way
and use sized types so that it works on 64 bit systems (so it can become
a tool).


To generate a diff of this commit:
cvs rdiff -u -r1.30 -r1.31 src/usr.bin/elf2ecoff/elf2ecoff.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/usr.bin/elf2ecoff/elf2ecoff.c
diff -u src/usr.bin/elf2ecoff/elf2ecoff.c:1.30 src/usr.bin/elf2ecoff/elf2ecoff.c:1.31
--- src/usr.bin/elf2ecoff/elf2ecoff.c:1.30	Sat Sep  3 07:35:24 2016
+++ src/usr.bin/elf2ecoff/elf2ecoff.c	Thu Feb 23 13:49:00 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: elf2ecoff.c,v 1.30 2016/09/03 11:35:24 christos Exp $	*/
+/*	$NetBSD: elf2ecoff.c,v 1.31 2017/02/23 18:49:00 christos Exp $	*/
 
 /*
  * Copyright (c) 1997 Jonathan Stone
@@ -56,8 +56,8 @@
 #define	ISLAST(p)	(p->n_un.n_name == 0 || p->n_un.n_name[0] == 0)
 
 struct sect {
-	unsigned long vaddr;
-	unsigned long len;
+	uint32_t vaddr;
+	uint32_t len;
 };
 
 struct elf_syms {
@@ -83,12 +83,12 @@ static void    safewrite(int, const void
 static void    copy(int, int, off_t, off_t);
 static void    combine(struct sect *, struct sect *, int);
 static void    translate_syms(struct elf_syms *, struct ecoff_syms *);
-static void    elf_symbol_table_to_ecoff(int, int, struct ecoff_exechdr *,
+static void    elf_symbol_table_to_ecoff(int, int, struct ecoff32_exechdr *,
     off_t, off_t, off_t, off_t);
-static int     make_ecoff_section_hdrs(struct ecoff_exechdr *,
-    struct ecoff_scnhdr *);
-static void    write_ecoff_symhdr(int, struct ecoff_exechdr *,
-    struct ecoff_symhdr *, long, long, long, long);
+static int     make_ecoff_section_hdrs(struct ecoff32_exechdr *,
+    struct ecoff32_scnhdr *);
+static void    write_ecoff_symhdr(int, struct ecoff32_exechdr *,
+    struct ecoff32_symhdr *, int32_t, int32_t, int32_t, int32_t);
 static void    pad16(int, int, const char *);
 static void    bswap32_region(int32_t* , int);
 static void    elf_read_syms(struct elf_syms *, int, off_t, off_t, off_t,
@@ -107,12 +107,12 @@ main(int argc, char **argv)
 	int     pad;
 	struct sect text, data, bss;	/* a.out-compatible sections */
 
-	struct ecoff_exechdr ep;
-	struct ecoff_scnhdr esecs[6];
-	struct ecoff_symhdr symhdr;
+	struct ecoff32_exechdr ep;
+	struct ecoff32_scnhdr esecs[6];
+	struct ecoff32_symhdr symhdr;
 
 	int     infile, outfile;
-	unsigned long cur_vma = ULONG_MAX;
+	uint32_t cur_vma = UINT32_MAX;
 	int     nsecs = 0;
 	int	mipsel;
 
@@ -247,8 +247,8 @@ usage:
 
 			if (debug) {
 				fprintf(stderr, "  combinining PH %zu type %d "
-				    "flags 0x%x with data, ndata = %ld, "
-				    "nbss =%ld\n", i, ph[i].p_type,
+				    "flags 0x%x with data, ndata = %d, "
+				    "nbss =%d\n", i, ph[i].p_type,
 				    ph[i].p_flags, ndata.len, nbss.len);
 			}
 			combine(&data, &ndata, 0);
@@ -260,7 +260,7 @@ usage:
 			ntxt.len = ph[i].p_filesz;
 			if (debug) {
 				fprintf(stderr, "  combinining PH %zu type %d "
-				    "flags 0x%x with text, len = %ld\n",
+				    "flags 0x%x with text, len = %d\n",
 				    i, ph[i].p_type, ph[i].p_flags, ntxt.len);
 			}
 			combine(&text, &ntxt, 0);
@@ -312,7 +312,7 @@ usage:
 	ep.f.f_nscns = 6;
 	ep.f.f_timdat = 0;	/* bogus */
 	ep.f.f_symptr = 0;
-	ep.f.f_nsyms = sizeof(struct ecoff_symhdr);
+	ep.f.f_nsyms = sizeof(struct ecoff32_symhdr);
 	ep.f.f_opthdr = sizeof ep.a;
 	ep.f.f_flags = 0x100f;	/* Stripped, not sharable. */
 
@@ -395,13 +395,13 @@ usage:
 		 * that the section can be loaded before copying. */
 		if (ph[i].p_type == PT_LOAD && ph[i].p_filesz) {
 			if (cur_vma != ph[i].p_vaddr) {
-				unsigned long gap = ph[i].p_vaddr - cur_vma;
+				uint32_t gap = ph[i].p_vaddr - cur_vma;
 				char    obuf[1024];
 				if (gap > 65536)
-					errx(1, "Intersegment gap (%ld bytes) "
+					errx(1, "Intersegment gap (%d bytes) "
 					    "too large", gap);
 				if (debug)
-					fprintf(stderr, "Warning: %ld byte "
+					fprintf(stderr, "Warning: %d byte "
 					    "intersegment gap.\n", gap);
 				memset(obuf, 0, sizeof obuf);
 				while (gap) {
@@ -424,7 +424,7 @@ usage:
 
 	if (debug)
 		fprintf(stderr, "writing syms at offset 0x%lx\n",
-		    (u_long) ep.f.f_symptr + sizeof(symhdr));
+		    (uint32_t) ep.f.f_symptr + sizeof(symhdr));
 
 	/* Copy and translate the symbol table... */
 	elf_symbol_table_to_ecoff(outfile, infile, &ep,
@@ -512,7 +512,7 @@ saveRead(int file, off_t offset, off_t l
 	if ((off = lseek(file, offset, SEEK_SET)) < 0)
 		err(1, "%s: fseek", name);
 	if ((tmp = malloc(len)) == NULL)
-		err(1, "%s: Can't allocate %ld bytes", name, (long) len);
+		err(1, "%s: Can't allocate %td bytes", name, len);
 	count = read(file, tmp, len);
 	if (count != len)
 		err(1, "%s: short read", name);
@@ -535,7 +535,7 @@ safewrite(int outfile, const void *buf, 
  * for text, data, and bss.
  */
 static int
-make_ecoff_section_hdrs(struct ecoff_exechdr *ep, struct ecoff_scnhdr *esecs)
+make_ecoff_section_hdrs(struct ecoff32_exechdr *ep, struct ecoff32_scnhdr *esecs)
 {
 
 	ep->f.f_nscns = 6;	/* XXX */
@@ -551,11 +551,11 @@ make_ecoff_section_hdrs(struct ecoff_exe
 	esecs[1].s_size = ep->a.dsize;
 	esecs[2].s_size = ep->a.bsize;
 
-	esecs[0].s_scnptr = ECOFF_TXTOFF(ep);
-	esecs[1].s_scnptr = ECOFF_DATOFF(ep);
+	esecs[0].s_scnptr = ECOFF32_TXTOFF(ep);
+	esecs[1].s_scnptr = ECOFF32_DATOFF(ep);
 #if 0
 	esecs[2].s_scnptr = esecs[1].s_scnptr +
-	    ECOFF_ROUND(esecs[1].s_size, ECOFF_SEGMENT_ALIGNMENT(ep));
+	    ECOFF_ROUND(esecs[1].s_size, ECOFF32_SEGMENT_ALIGNMENT(ep));
 #endif
 
 	esecs[0].s_relptr = esecs[1].s_relptr = esecs[2].s_relptr = 0;
@@ -583,17 +583,17 @@ make_ecoff_section_hdrs(struct ecoff_exe
  * Mark all symbols as EXTERN (for now).
  */
 static void
-write_ecoff_symhdr(int out, struct ecoff_exechdr *ep,
-    struct ecoff_symhdr *symhdrp, long nesyms,
-    long extsymoff, long extstroff, long strsize)
+write_ecoff_symhdr(int out, struct ecoff32_exechdr *ep,
+    struct ecoff32_symhdr *symhdrp, int32_t nesyms,
+    int32_t extsymoff, int32_t extstroff, int32_t strsize)
 {
 
 	if (debug)
 		fprintf(stderr,
-		    "writing symhdr for %ld entries at offset 0x%lx\n",
-		    nesyms, (u_long) ep->f.f_symptr);
+		    "writing symhdr for %d entries at offset 0x%x\n",
+		    nesyms, ep->f.f_symptr);
 
-	ep->f.f_nsyms = sizeof(struct ecoff_symhdr);
+	ep->f.f_nsyms = sizeof(struct ecoff32_symhdr);
 
 	memset(symhdrp, 0, sizeof(*symhdrp));
 	symhdrp->esymMax = nesyms;
@@ -604,9 +604,9 @@ write_ecoff_symhdr(int out, struct ecoff
 	symhdrp->issExtMax = strsize;
 	if (debug)
 		fprintf(stderr,
-		    "ECOFF symhdr: symhdr %zx, strsize %lx, symsize %lx\n",
+		    "ECOFF symhdr: symhdr %zx, strsize %x, symsize %zx\n",
 		    sizeof(*symhdrp), strsize,
-		    (nesyms * sizeof(struct ecoff_extsym)));
+		    (nesyms * sizeof(struct ecoff32_extsym)));
 
 	if (needswap) {
 		bswap32_region(&symhdrp->ilineMax,
@@ -625,7 +625,7 @@ static void
 elf_read_syms(struct elf_syms *elfsymsp, int in, off_t symoff, off_t symsize,
     off_t stroff, off_t strsize)
 {
-	register int nsyms;
+	int nsyms;
 	int i;
 	nsyms = symsize / sizeof(Elf32_Sym);
 
@@ -652,16 +652,16 @@ elf_read_syms(struct elf_syms *elfsymsp,
 
 
 static void
-elf_symbol_table_to_ecoff(int out, int in, struct ecoff_exechdr *ep,
+elf_symbol_table_to_ecoff(int out, int in, struct ecoff32_exechdr *ep,
     off_t symoff, off_t symsize, off_t stroff, off_t strsize)
 {
 
 	struct elf_syms elfsymtab;
 	struct ecoff_syms ecoffsymtab;
-	register u_long ecoff_symhdr_off, symtaboff, stringtaboff;
-	register u_long nextoff, symtabsize, ecoff_strsize;
+	uint32_t ecoff_symhdr_off, symtaboff, stringtaboff;
+	uint32_t nextoff, symtabsize, ecoff_strsize;
 	int     nsyms, i;
-	struct ecoff_symhdr symhdr;
+	struct ecoff32_symhdr symhdr;
 	int     padding;
 
 	/* Read in the ELF symbols. */
@@ -677,13 +677,13 @@ elf_symbol_table_to_ecoff(int out, int i
 	nextoff = ecoff_symhdr_off + sizeof(struct ecoff_symhdr);
 	stringtaboff = nextoff;
 	ecoff_strsize = ECOFF_ROUND(ecoffsymtab.stringsize,
-	    (ECOFF_SEGMENT_ALIGNMENT(ep)));
+	    (ECOFF32_SEGMENT_ALIGNMENT(ep)));
 
 
 	nextoff = stringtaboff + ecoff_strsize;
 	symtaboff = nextoff;
 	symtabsize = nsyms * sizeof(struct ecoff_extsym);
-	symtabsize = ECOFF_ROUND(symtabsize, ECOFF_SEGMENT_ALIGNMENT(ep));
+	symtabsize = ECOFF_ROUND(symtabsize, ECOFF32_SEGMENT_ALIGNMENT(ep));
 
 	/* Write out the symbol header ... */
 	write_ecoff_symhdr(out, ep, &symhdr, nsyms, symtaboff,

Reply via email to