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");

Reply via email to