Re: [PATCH v2 1/1] c++: ICE on on systems without mmap support [PR124806]
Christophe Lyon <[email protected]>
| Newsgroups | gmane.comp.gcc.patches |
|---|---|
| Message-ID | <[email protected]> |
On 7/31/26 11:04, Torbjorn SVENSSON wrote: > > > On 2026-07-31 05:31, Jason Merrill wrote: >> 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. > > Renamed the member. > > Pushed as r17-2849-g94556938452d2b. > I'll push to releases/gcc-16 and releases/gcc-15 in a few days unless > someone objects. > Note that gcc-16 is currently frozen. Thanks, Christophe > Kind regards, > Torbjörn > >> >>> (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"); >> >