scc

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

commit b72ae1daa29675c82e45d85776a40257a56241ff
parent d453c845befbaa9a03eb974df569ebd41c9d7a49
Author: Roberto E. Vargas Caballero <k0ga@shike2.com>
Date:   Fri, 22 Mar 2024 08:04:43 +0100

libmach/coff32: Avoid file pointer in non mapped sections

We have to avoid non mapped sections in the output file because there is
nothing to write to the output file.

Diffstat:
Msrc/libmach/coff32/coff32getsec.c | 4++++
Msrc/libmach/coff32/coff32setsec.c | 22+++++++++++++++++++++-
Msrc/libmach/coff32/coff32write.c | 25++++++++++++-------------
3 files changed, 37 insertions(+), 14 deletions(-)

diff --git a/src/libmach/coff32/coff32getsec.c b/src/libmach/coff32/coff32getsec.c @@ -53,6 +53,10 @@ coff32getsec(Obj *obj, int *idx, Section *sec) type = 'B'; sflags = SALLOC | SREAD | SWRITE; break; + case STYP_TEXT | STYP_DATA: + type = 'D'; + sflags = SEXEC | SALLOC | SRELOC | SLOAD | SREAD; + break; case STYP_LIT: case STYP_RDATA: type = 'D'; diff --git a/src/libmach/coff32/coff32setsec.c b/src/libmach/coff32/coff32setsec.c @@ -18,7 +18,25 @@ coff32setsec(Obj *obj, int *idx, Section *sec) switch (sec->type) { case 'D': - flags = (sec->flags & SWRITE) ? STYP_DATA : STYP_RDATA; + switch (sec->flags) { + case SALLOC | SRELOC | SLOAD | SWRITE | SREAD: + if (strcmp(sec->name ,".data") == 0) + flags = STYP_DATA; + else + flags = STYP_REG; + break; + case SALLOC | SREAD | SWRITE: + flags = STYP_NOLOAD; + break; + case SALLOC | SRELOC | SLOAD | SREAD: + flags = STYP_RDATA; + break; + case SEXEC | SALLOC | SRELOC | SLOAD | SREAD: + flags = STYP_TEXT | STYP_DATA; + break; + default: + goto invalid; + } break; case 'T': flags = STYP_TEXT; @@ -29,6 +47,8 @@ coff32setsec(Obj *obj, int *idx, Section *sec) case 'N': case '?': default: + invalid: + /* TODO */ return NULL; } diff --git a/src/libmach/coff32/coff32write.c b/src/libmach/coff32/coff32write.c @@ -313,15 +313,11 @@ writedata(Obj *obj, Map *map, FILE *fp) nsec = hdr->f_nscns; for (scn = coff->scns; nsec--; scn++) { - /* TODO: check if the section is allocated */ - if (scn->s_flags & STYP_BSS) - continue; - if ((id = findsec(map, scn->s_name)) < 0) - return 0; + continue; sec = &map->sec[id]; if (!sec->fp) - return 0; + continue; fseek(sec->fp, sec->offset, SEEK_SET); @@ -338,8 +334,10 @@ writedata(Obj *obj, Map *map, FILE *fp) int coff32write(Obj *obj, Map *map, FILE *fp) { + int id; long ptr, n; SCNHDR *scn; + Mapsec *sec; struct coff32 *coff = obj->data; FILHDR *hdr = &coff->hdr; @@ -349,14 +347,15 @@ coff32write(Obj *obj, Map *map, FILE *fp) n = hdr->f_nscns; ptr += FILHSZ + hdr->f_opthdr + n*SCNHSZ; for (scn = coff->scns; n--; scn++) { - /* TODO: Check if the section is allocated */ - if (scn->s_flags & STYP_BSS) { - scn->s_scnptr = 0; + scn->s_scnptr = 0; + if ((id = findsec(map, scn->s_name)) < 0) continue; - } else { - scn->s_scnptr = ptr; - ptr += scn->s_size; - } + sec = &map->sec[id]; + if (!sec->fp) + continue; + + scn->s_scnptr = ptr; + ptr += scn->s_size; } hdr->f_symptr = (hdr->f_nsyms > 0) ? ptr : 0;