scc

simple c99 compiler
git clone git://git.simple-cc.org/scc
Log | Files | Refs | Submodules | README | LICENSE

commit 52a499865aafc40d7094045027e303f1a8ade1d9
parent 37a052bfd4daf111134300f8d684dd0a520280f1
Author: Roberto E. Vargas Caballero <k0ga@shike2.com>
Date:   Fri, 11 May 2018 19:56:02 +0100

[ld/coff32] Create readobj()

This function loads all the metadata of the object file in memory.

Diffstat:
Mld/coff32.c | 32++++++++++++++++++++++----------
Mld/ld.h | 3++-
Mld/main.c | 2+-
Mld/obj.c | 21++++++++++++++-------
4 files changed, 39 insertions(+), 19 deletions(-)

diff --git a/ld/coff32.c b/ld/coff32.c @@ -103,6 +103,9 @@ readsects(Obj *obj, long off) return -1; getscn(buff, &scn[i]); } + obj->scnhdr = scn; + + return 0; } static void @@ -151,23 +154,21 @@ readsyms(Obj *obj, long off) return -1; getsym(buff, &ent[i]); } + obj->enthdr = ent; + return 0; } static void -pass1(char *fname, char *member, FILE *fp) +readobj(Obj *obj) { unsigned char buff[FILHSZ]; FILHDR *hdr; - Obj *obj; char *strtbl; long symoff, secoff, stroff, pos; - obj = newobj(fname, member); - obj->fp = fp; - - pos = ftell(fp); - if (fread(buff, FILHSZ, 1, fp) != 1) + pos = ftell(obj->fp); + if (fread(buff, FILHSZ, 1, obj->fp) != 1) goto bad_file; if ((hdr = malloc(sizeof(*hdr))) == NULL) @@ -186,11 +187,22 @@ pass1(char *fname, char *member, FILE *fp) goto bad_file; if (readsects(obj, secoff) < 0) goto bad_file; + return; bad_file: - if (ferror(fp)) - die("ld: %s: %s", fname, strerror(errno)); - die("ld: %s: corrupted file", fname); + if (ferror(obj->fp)) + die("ld: %s: %s", obj->fname, strerror(errno)); + die("ld: %s: corrupted file", obj->fname); +} + +static void +pass1(char *fname, char *member, FILE *fp) +{ + Obj *obj; + + obj = newobj(fname, member); + obj->fp = fp; + readobj(obj); } static void diff --git a/ld/ld.h b/ld/ld.h @@ -7,7 +7,8 @@ struct obj { char *member; FILE *fp; void *filhdr; - void *sechdr; + void *scnhdr; + void *enthdr; char *strtbl; struct obj *next; }; diff --git a/ld/main.c b/ld/main.c @@ -130,7 +130,7 @@ process(char *fname) if ((fp = fopen(fname, "rb")) == NULL) die("ld: %s: %s", fname, strerror(errno)); - if (!object(fname, fname, fp) && !archive(fname, fp)) + if (!object(fname, NULL, fp) && !archive(fname, fp)) die("ld: %s: File format not recognized", fname); if (ferror(fp)) diff --git a/ld/obj.c b/ld/obj.c @@ -15,16 +15,23 @@ newobj(char *fname, char *member) { Obj *obj; char *s, *t; - size_t l1 = strlen(member), l2 = strlen(fname); + size_t len; + len = strlen(fname); obj = malloc(sizeof(*obj)); - s = malloc(l1+1); - t = malloc(l2+1); - if (!obj || !s || !t) + s = malloc(len+1); + if (!obj || !s) outmem(); - - obj->fname = memcpy(s, fname, l1); - obj->member = memcpy(t, member, l2); + obj->fname = memcpy(s, fname, len+1); + + if (!member) { + obj->member = NULL; + } else { + len = strlen(member); + if ((s = malloc(len+1)) == NULL) + outmem(); + obj->member = memcpy(s, member, len+1); + } obj->next = NULL; if (!objlst)