]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/link: align sections, not symbols after DWARF compress
authorCherry Mui <cherryyz@google.com>
Mon, 17 Nov 2025 22:27:21 +0000 (17:27 -0500)
committerCherry Mui <cherryyz@google.com>
Tue, 18 Nov 2025 17:02:16 +0000 (09:02 -0800)
After DWARF compression, we recompute the symbol and section
addresses. On Windows, we need to align the sections to
PEFILEALIGN. But the code actually apply the alignment to every
symbol. This works mostly fine as after compression a section
usually contains a single symbol (the compressed data). But if the
compression is not beneficial, it leaves with the original set of
symbols, which could be more than one. Applying alignment to every
symbol causing the section size too big, no longer matching the
size we computed before compression.

Fixes #76022.

Change-Id: I2246045955405997c77e54001bbb83f9ccd1ee7c
Reviewed-on: https://go-review.googlesource.com/c/go/+/721340
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: David Chase <drchase@google.com>
src/cmd/link/internal/ld/dwarf.go

index 31de34aff451bfe1267540611c1812ce1fc5d6e1..9bab73e7b7138556aaddb8f27bf855c4a751f4cf 100644 (file)
@@ -2507,19 +2507,19 @@ func dwarfcompress(ctxt *Link) {
        var prevSect *sym.Section
        for _, si := range dwarfp {
                for _, s := range si.syms {
-                       ldr.SetSymValue(s, int64(pos))
                        sect := ldr.SymSect(s)
                        if sect != prevSect {
+                               if ctxt.IsWindows() {
+                                       pos = uint64(Rnd(int64(pos), PEFILEALIGN))
+                               }
                                sect.Vaddr = pos
                                prevSect = sect
                        }
+                       ldr.SetSymValue(s, int64(pos))
                        if ldr.SubSym(s) != 0 {
                                log.Fatalf("%s: unexpected sub-symbols", ldr.SymName(s))
                        }
                        pos += uint64(ldr.SymSize(s))
-                       if ctxt.IsWindows() {
-                               pos = uint64(Rnd(int64(pos), PEFILEALIGN))
-                       }
                }
        }
        Segdwarf.Length = pos - Segdwarf.Vaddr