From 37a048d58e01a3befa4db574e5fb48ab8d6013a1 Mon Sep 17 00:00:00 2001 From: Christian Banse Date: Wed, 19 Apr 2023 18:04:55 +0200 Subject: [PATCH] cmd/link/internal/ld: Passing correct offset to codesign.Sign Previously, codesign.Sign was called with Segtext.Fileoff and Segtext.Filelen. However, both variables do not contain the complete __TEXT segment, as it excludes padding and header. Therefore, we now store a reference to the complete segment in mstext when it is created and pass its offset (which should always be 0) and filesize to codesign.Sign. Fixes #59555 --- src/cmd/link/internal/ld/macho.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/cmd/link/internal/ld/macho.go b/src/cmd/link/internal/ld/macho.go index d6c28e4790..e43a1aa002 100644 --- a/src/cmd/link/internal/ld/macho.go +++ b/src/cmd/link/internal/ld/macho.go @@ -710,6 +710,7 @@ func asmbMacho(ctxt *Link) { /* text */ v := Rnd(int64(uint64(HEADR)+Segtext.Length), int64(*FlagRound)) + var mstext *MachoSeg if ctxt.LinkMode != LinkExternal { ms = newMachoSeg("__TEXT", 20) ms.vaddr = uint64(va) @@ -718,6 +719,7 @@ func asmbMacho(ctxt *Link) { ms.filesize = uint64(v) ms.prot1 = 7 ms.prot2 = 5 + mstext = ms } for _, sect := range Segtext.Sections { @@ -868,7 +870,7 @@ func asmbMacho(ctxt *Link) { if int64(len(data)) != codesigOff { panic("wrong size") } - codesign.Sign(ldr.Data(cs), bytes.NewReader(data), "a.out", codesigOff, int64(Segtext.Fileoff), int64(Segtext.Filelen), ctxt.IsExe() || ctxt.IsPIE()) + codesign.Sign(ldr.Data(cs), bytes.NewReader(data), "a.out", codesigOff, int64(mstext.fileoffset), int64(mstext.filesize), ctxt.IsExe() || ctxt.IsPIE()) ctxt.Out.SeekSet(codesigOff) ctxt.Out.Write(ldr.Data(cs)) }