https://gcc.gnu.org/g:996979360a4027c1e85770cde031e673f8288e9d
commit r15-11466-g996979360a4027c1e85770cde031e673f8288e9d Author: Torbjörn SVENSSON <[email protected]> Date: Sun Jul 26 23:25:50 2026 +0200 c++: ICE on on systems without mmap support [PR124806] 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::began): New data member. (elf_out::begin): Set it after successful initialization. (elf_out::end): Do not finalize output that never began. Signed-off-by: Torbjörn SVENSSON <[email protected]> (cherry picked from commit 94556938452d2bde01f5954207294906bbb53d8f) Diff: --- 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 7f2922261f73..41511f698ead 100644 --- a/gcc/cp/module.cc +++ b/gcc/cp/module.cc @@ -1505,6 +1505,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 began; /* True if begin initialized output state. */ #if MAPPED_WRITING unsigned offset; /* Offset of the mapping. */ unsigned extent; /* Length of mapping. */ @@ -1513,7 +1514,7 @@ private: public: elf_out (int fd, int e) - :parent (fd, e), identtab (500), pos (0) + :parent (fd, e), identtab (500), pos (0), began (false) { #if MAPPED_WRITING offset = extent = 0; @@ -2225,7 +2226,10 @@ elf_out::begin () memset (h, 0, sizeof (header)); hdr.pos = hdr.size; write (hdr); - return !get_error (); + if (get_error ()) + return false; + began = true; + return true; } /* Finish writing the file. Write out the string & section tables. @@ -2234,7 +2238,7 @@ elf_out::begin () bool elf_out::end () { - if (fd >= 0) + if (fd >= 0 && began) { /* Write the string table. */ unsigned strnam = name (".strtab");
