[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Bug gold/31415] New: Section coalescing should ignore (and merge) SHF_G
From: |
address@hidden |
Subject: |
[Bug gold/31415] New: Section coalescing should ignore (and merge) SHF_GNU_RETAIN |
Date: |
Mon, 26 Feb 2024 12:29:03 +0000 |
https://sourceware.org/bugzilla/show_bug.cgi?id=31415
Bug ID: 31415
Summary: Section coalescing should ignore (and merge)
SHF_GNU_RETAIN
Product: binutils
Version: 2.43 (HEAD)
Status: UNCONFIRMED
Severity: normal
Priority: P2
Component: gold
Assignee: ccoutant at gmail dot com
Reporter: alastair@alastairs-place.net
CC: ian at airs dot com
Target Milestone: ---
In layout.cc, the code avoids combining sections whose flags differ, while
ignoring `SHF_WRITE` and `SHF_EXECINSTR`. (This seems an odd choice, frankly;
those are the flags I probably *wouldn't* want to ignore.)
Unfortunately, it doesn't ignore `SHF_GNU_RETAIN`; this is a particularly
awkward problem because programs tend to use `SHF_GNU_RETAIN` when they're
storing data in a section and using the linker-generated `__start` and `__stop`
symbols to access it. Since the latter are not regarded as GC roots, the
retain flag is needed to stop the linker discarding the section, *but* if any
object file in the link doesn't have `SHF_GNU_RETAIN` set for that section,
then `gold` will generate another output section, with the same name, but of
course there's only one `__start` and `__stop` symbol pair and it only points
at a single section.
It seems to me that:
1. `gold` should ignore `SHF_GNU_RETAIN` when looking up sections to coalesce,
but
2. If it finds a section with `SHF_GNU_RETAIN` and coalesces it with a section
that did not have that flag, the resulting section *should* have the flag set.
i.e. setting it on *any* input section that gets coalesced into an output
section should cause it to be set for the output section.
--
You are receiving this mail because:
You are on the CC list for the bug.
- [Bug gold/31415] New: Section coalescing should ignore (and merge) SHF_GNU_RETAIN,
address@hidden <=