ref: 1ebd02c28ba4d5969e349942e2ec7334ca13d195
parent: 99bb172e34500445d1969971eb77bff53ac9cb6e
author: Roberto E. Vargas Caballero <k0ga@shike2.com>
date: Wed Mar 14 04:08:18 EDT 2018
[ld/coff32] Add support for coff32 probe() This function checks if a file is a coff32 object file.
--- a/ld/Makefile
+++ b/ld/Makefile
@@ -26,6 +26,10 @@
distclean: clean
#deps
+coff32.c: ../inc/coff32/filehdr.h
+coff32.c: ../inc/coff32/scnhdr.h
+coff32.c: ../inc/coff32/syms.h
+coff32.c: ../inc/scc.h
coff32.c: ld.h
formats.c: ld.h
main.c: ../inc/arg.h
--- a/ld/coff32.c
+++ b/ld/coff32.c
@@ -1,22 +1,52 @@
static char sccsid[] = "@(#) ./ld/coff32.c";
+#include <errno.h>
#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "../inc/coff32/filehdr.h"
+#include "../inc/coff32/scnhdr.h"
+#include "../inc/coff32/syms.h"
+#include "../inc/scc.h"
#include "ld.h"
static int
-probe(char *fname, char *member, FILE *fp)
+pass1(char *fname, char *member, FILE *fp)
{
}
static int
-pass1(char *fname, char *member, FILE *fp)
+pass2(char *fname, char *member, FILE *fp)
{
}
static int
-pass2(char *fname, char *member, FILE *fp)
+probe(char *fname, char *member, FILE *fp)
{
+ int c;
+ int c1, c2;
+ fpos_t pos;
+ unsigned short magic;
+
+ fgetpos(fp, &pos);
+ c1 = getc(fp);
+ c2 = getc(fp);
+ fsetpos(fp, &pos);
+
+ if (ferror(fp))
+ die("nm: %s: %s", fname, strerror(errno));
+
+ if (c1 == EOF || c2 == EOF)
+ return 0;
+ magic = c1 | c2 << 8;
+
+ switch (magic) {
+ case COFF_Z80MAGIC:
+ return 1;
+ default:
+ return 0;
+ }
}
struct objfile coff32 = {