From 8806d53c106ba9d797a4383b2a49418c509a42c2 Mon Sep 17 00:00:00 2001 From: Cherry Mui Date: Mon, 17 Nov 2025 17:27:21 -0500 Subject: [PATCH] cmd/link: align sections, not symbols after DWARF compress 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 Reviewed-by: David Chase --- src/cmd/link/internal/ld/dwarf.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/cmd/link/internal/ld/dwarf.go b/src/cmd/link/internal/ld/dwarf.go index 31de34aff4..9bab73e7b7 100644 --- a/src/cmd/link/internal/ld/dwarf.go +++ b/src/cmd/link/internal/ld/dwarf.go @@ -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 -- 2.52.0