Re: [PATCH] gas: support for .pushsection and .popsection pseudo ops for coff
Johannes Khoshnazar-Thoma <[email protected]> Thu, 23 Jul 2026 12:12:49 +0200
| Newsgroups | gmane.comp.gnu.binutils |
|---|---|
| Message-ID | <[email protected]> |
Dear list, Friendly ping regarding my .pushsection patch. Is this something that could be merged? What else do you need? Thank you for your attention, Best regards, - Johannes Am 18.07.26 um 18:22 schrieb Johannes Khoshnazar-Thoma: > Current Linux kernels make heavy use of the .pushsection and > .popsection pseudo ops. Normally, the Linux kernel is built > as an ELF object, where the assembler supports those pseudo > ops. When compiling the Linux kernel as a Windows/ReactOS > driver however, it must be compiled as a COFF object, since > the Windows/ReactOS kernel does not know how to load ELF > binaries. > > In order to be able to compile the Linux kernel as a COFF > object (and further on as a PE32 native executable) the > implementation of those pseudo ops has been copiied from > the obj-elf.c support code to the obj-coff.c support code. > It has been verified that the Linux kernel works without > assembler errors when using an assembler with this patch. > > Signed-off-by: Johannes Khoshnazar-Thoma <[email protected]> > --- > gas/config/obj-coff.c | 41 ++++++++++++++++++++++++++++++++++++++++- > 1 file changed, 40 insertions(+), 1 deletion(-) > > diff --git a/gas/config/obj-coff.c b/gas/config/obj-coff.c > index 7732c0af911..73c571b71de 100644 > --- a/gas/config/obj-coff.c > +++ b/gas/config/obj-coff.c > @@ -1536,6 +1536,32 @@ obj_coff_finalize_section_relocs (asection *sec, arelent **relocs, > return true; > } > > +struct section_stack > +{ > + struct section_stack *next; > + segT seg; > + int subseg; > +}; > + > +static struct section_stack *section_stack; > + > +static void > +obj_coff_popsection (int xxx ATTRIBUTE_UNUSED) > +{ > + struct section_stack *top = section_stack; > + > + if (top == NULL) > + { > + as_warn (_(".popsection without corresponding .pushsection; ignored")); > + return; > + } > + > + section_stack = top->next; > + subseg_set (top->seg, top->subseg); > + free (top); > +} > + > + > /* Implement the .section pseudo op: > .section name {, "flags"} > ^ ^ > @@ -1559,7 +1585,7 @@ obj_coff_finalize_section_relocs (asection *sec, arelent **relocs, > .section directive to be parsed in both ELF and COFF formats. */ > > void > -obj_coff_section (int ignore ATTRIBUTE_UNUSED) > +obj_coff_section (int push) > { > /* Strip out the section name. */ > char *section_name; > @@ -1691,6 +1717,17 @@ obj_coff_section (int ignore ATTRIBUTE_UNUSED) > } > } > > + /* .pushsection implementation */ > + if (push) > + { > + struct section_stack *elt; > + elt = XNEW (struct section_stack); > + elt->next = section_stack; > + elt->seg = now_seg; > + elt->subseg = now_subseg; > + section_stack = elt; > + } > + > sec = subseg_new (name, exp); > > if (is_bss) > @@ -1903,6 +1940,8 @@ static const pseudo_typeS coff_pseudo_table[] = > {"sect.s", obj_coff_section, 0}, > {"section", obj_coff_section, 0}, > {"section.s", obj_coff_section, 0}, > + {"pushsection", obj_coff_section, 1}, > + {"popsection", obj_coff_popsection, 0}, > /* FIXME: We ignore the MRI short attribute. */ > {"size", obj_coff_size, 0}, > {"tag", obj_coff_tag, 0},