[gcc r17-2849] c++: ICE on on systems without mmap support [PR124806]
Torbjorn Svensson via Gcc-cvs <[email protected]> Fri, 31 Jul 2026 09:02:57 +0000 (GMT)
| Newsgroups | gmane.comp.gcc.cvs |
|---|---|
| Message-ID | <[email protected]> |
https://gcc.gnu.org/g:94556938452d2bde01f5954207294906bbb53d8f commit r17-2849-g94556938452d2bde01f5954207294906bbb53d8f 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]> 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 49a47494467c..d6bd4c78d804 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");