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:
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;