From: Torbjörn SVENSSON Date: Sun, 26 Jul 2026 21:25:50 +0000 (+0200) Subject: c++: ICE on on systems without mmap support [PR124806] X-Git-Url: http://git.ipfire.org/gitweb/index.cgi?a=commitdiff_plain;ds=inline;p=thirdparty%2Fgcc.git 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 --- diff --git a/gcc/cp/module.cc b/gcc/cp/module.cc index 49a47494467..d6bd4c78d80 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 began; /* 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), began (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; + began = 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 && began) { /* Write the string table. */ unsigned strnam = name (".strtab");