libmach/coff32: Avoid file pointer in non mapped sections - scc - simple c99 compiler
 (HTM) git clone git://git.simple-cc.org/scc
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) Submodules
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit b72ae1daa29675c82e45d85776a40257a56241ff
 (DIR) parent d453c845befbaa9a03eb974df569ebd41c9d7a49
 (HTM) 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:
         M src/libmach/coff32/coff32getsec.c   |       4 ++++
         M src/libmach/coff32/coff32setsec.c   |      22 +++++++++++++++++++++-
         M src/libmach/coff32/coff32write.c    |      25 ++++++++++++-------------
       
       3 files changed, 37 insertions(+), 14 deletions(-)
       ---
 (DIR) 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';
 (DIR) 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;
                }
        
 (DIR) 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;