Re: [PATCH v2 1/1] c++: ICE on on systems without mmap support [PR124806]
Jason Merrill <[email protected]>
| Newsgroups | gmane.comp.gcc.patches |
|---|---|
| Message-ID | <[email protected]> |
On 7/29/26 8:03 AM, Torbjörn Svensson via Sourceware Forge wrote: > From: Torbjörn SVENSSON <[email protected]> > > On systems without mmap support, cc1plus can crash when finishing module > output after earlier errors prevented elf_out::begin from running. In > that case elf_out::end attempts to fill in the ELF header even though > hdr.buffer was never initialized. > > gcc/cp/ChangeLog: > > PR c++/124806 > * module.cc (elf_out::begun): New data member. Let's call it "began" to match the one in module_processing_cookie. I thought about trying to share that one flag, but I suppose it's probably necessary to distinguish between elf_out::begin and module_state::begin. OK with that tweak. > (elf_out::begin): Set it after successful initialization. > (elf_out::end): Do not finalize output that was never begun. > > Signed-off-by: Torbjörn SVENSSON <[email protected]> > --- > gcc/cp/module.cc | 10 +++++++--- > 1 file changed, 7 insertions(+), 3 deletions(-) > > diff --git a/gcc/cp/module.cc b/gcc/cp/module.cc > index f7569e688a26..156df4457463 100644 > --- a/gcc/cp/module.cc > +++ b/gcc/cp/module.cc > @@ -1511,6 +1511,7 @@ class elf_out : public elf, public data::allocator { > private: > ptr_int_hash_map identtab; /* Map of IDENTIFIERS to strtab offsets. */ > unsigned pos; /* Write position in file. */ > + bool begun; /* True if begin initialized output state. */ > #if MAPPED_WRITING > unsigned offset; /* Offset of the mapping. */ > unsigned extent; /* Length of mapping. */ > @@ -1519,7 +1520,7 @@ private: > > public: > elf_out (int fd, int e) > - :parent (fd, e), identtab (500), pos (0) > + :parent (fd, e), identtab (500), pos (0), begun (false) > { > #if MAPPED_WRITING > offset = extent = 0; > @@ -2231,7 +2232,10 @@ elf_out::begin () > memset (h, 0, sizeof (header)); > hdr.pos = hdr.size; > write (hdr); > - return !get_error (); > + if (get_error ()) > + return false; > + begun = true; > + return true; > } > > /* Finish writing the file. Write out the string & section tables. > @@ -2240,7 +2244,7 @@ elf_out::begin () > bool > elf_out::end () > { > - if (fd >= 0) > + if (fd >= 0 && begun) > { > /* Write the string table. */ > unsigned strnam = name (".strtab");