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