From 6e1e75075594a655c772a06f032a651f74fbbf54 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Mart=C3=AD?= Date: Fri, 12 May 2023 20:20:38 +0100 Subject: [PATCH] internal/linker: add working patches for Go 1.21 (master) From https://github.com/burrowers/go-patches/pull/4. --- .../go1.21/0001-add-custom-magic-value.patch | 36 ++++++++ ...dd-unexported-function-name-removing.patch | 86 +++++++++++++++++++ .../go1.21/0003-add-entryOff-encryption.patch | 43 ++++++++++ 3 files changed, 165 insertions(+) create mode 100644 internal/linker/patches/go1.21/0001-add-custom-magic-value.patch create mode 100644 internal/linker/patches/go1.21/0002-add-unexported-function-name-removing.patch create mode 100644 internal/linker/patches/go1.21/0003-add-entryOff-encryption.patch diff --git a/internal/linker/patches/go1.21/0001-add-custom-magic-value.patch b/internal/linker/patches/go1.21/0001-add-custom-magic-value.patch new file mode 100644 index 0000000..394399a --- /dev/null +++ b/internal/linker/patches/go1.21/0001-add-custom-magic-value.patch @@ -0,0 +1,36 @@ +From 62c7b9ef34098c1feddb18502331068277479875 Mon Sep 17 00:00:00 2001 +From: pagran +Date: Mon, 9 Jan 2023 13:30:00 +0100 +Subject: [PATCH 1/3] add custom magic value + +--- + cmd/link/internal/ld/pcln.go | 13 +++++++++++++ + 1 file changed, 13 insertions(+) + +diff --git a/cmd/link/internal/ld/pcln.go b/cmd/link/internal/ld/pcln.go +index aaf8ddef51..e93532e510 100644 +--- a/cmd/link/internal/ld/pcln.go ++++ b/cmd/link/internal/ld/pcln.go +@@ -249,6 +249,19 @@ func (state *pclntab) generatePCHeader(ctxt *Link) { + if off != size { + panic(fmt.Sprintf("pcHeader size: %d != %d", off, size)) + } ++ ++ // Use garble prefix in variable names to minimize collision risk ++ garbleMagicStr := os.Getenv("GARBLE_LINK_MAGIC") ++ if garbleMagicStr == "" { ++ panic("[garble] magic value must be set") ++ } ++ var garbleMagicVal uint32 ++ // Use fmt package instead of strconv to avoid importing a new package ++ if _, err := fmt.Sscan(garbleMagicStr, &garbleMagicVal); err != nil { ++ panic(fmt.Errorf("[garble] invalid magic value %s: %v", garbleMagicStr, err)) ++ } ++ ++ header.SetUint32(ctxt.Arch, 0, garbleMagicVal) + } + + state.pcheader = state.addGeneratedSym(ctxt, "runtime.pcheader", size, writeHeader) +-- +2.40.1 + diff --git a/internal/linker/patches/go1.21/0002-add-unexported-function-name-removing.patch b/internal/linker/patches/go1.21/0002-add-unexported-function-name-removing.patch new file mode 100644 index 0000000..4a16520 --- /dev/null +++ b/internal/linker/patches/go1.21/0002-add-unexported-function-name-removing.patch @@ -0,0 +1,86 @@ +From 1e3895a863cb122b8262b5bf51a2984998f0fd3e Mon Sep 17 00:00:00 2001 +From: pagran +Date: Mon, 9 Jan 2023 13:30:36 +0100 +Subject: [PATCH 2/3] add unexported function name removing + +--- + cmd/link/internal/ld/pcln.go | 44 +++++++++++++++++++++++++++++++++++- + 1 file changed, 43 insertions(+), 1 deletion(-) + +diff --git a/cmd/link/internal/ld/pcln.go b/cmd/link/internal/ld/pcln.go +index e93532e510..8b670135de 100644 +--- a/cmd/link/internal/ld/pcln.go ++++ b/cmd/link/internal/ld/pcln.go +@@ -4,6 +4,11 @@ + + package ld + ++import ( ++ "strings" ++ "unicode" ++) ++ + import ( + "cmd/internal/goobj" + "cmd/internal/objabi" +@@ -301,19 +306,56 @@ func walkFuncs(ctxt *Link, funcs []loader.Sym, f func(loader.Sym)) { + func (state *pclntab) generateFuncnametab(ctxt *Link, funcs []loader.Sym) map[loader.Sym]uint32 { + nameOffsets := make(map[loader.Sym]uint32, state.nfunc) + ++ garbleTiny := os.Getenv("GARBLE_LINK_TINY") == "true" ++ + // Write the null terminated strings. + writeFuncNameTab := func(ctxt *Link, s loader.Sym) { + symtab := ctxt.loader.MakeSymbolUpdater(s) ++ if garbleTiny { ++ symtab.AddStringAt(0, "") ++ } ++ + for s, off := range nameOffsets { ++ if garbleTiny && off == 0 { ++ continue ++ } + symtab.AddCStringAt(int64(off), ctxt.loader.SymName(s)) + } + } + + // Loop through the CUs, and calculate the size needed. + var size int64 ++ ++ if garbleTiny { ++ size = 1 // first byte is reserved for empty string used for all non-exportable method names ++ } ++ // Kinds of SymNames found in the wild: ++ // ++ // * reflect.Value.CanAddr ++ // * reflect.(*Value).String ++ // * reflect.w6cEoKc ++ // * internal/abi.(*RegArgs).IntRegArgAddr ++ // * type:.eq.runtime.special ++ // * runtime/internal/atomic.(*Pointer[go.shape.string]).Store ++ // ++ // Checking whether the first rune after the last dot is uppercase seems enough. ++ isExported := func(name string) bool { ++ for _, r := range name[strings.LastIndexByte(name, '.')+1:] { ++ return unicode.IsUpper(r) ++ } ++ return false ++ } ++ + walkFuncs(ctxt, funcs, func(s loader.Sym) { ++ name := ctxt.loader.SymName(s) ++ ++ if garbleTiny && !isExported(name) { ++ nameOffsets[s] = 0 // redirect name to empty string ++ return ++ } ++ + nameOffsets[s] = uint32(size) +- size += int64(len(ctxt.loader.SymName(s)) + 1) // NULL terminate ++ size += int64(len(name) + 1) // NULL terminate + }) + + state.funcnametab = state.addGeneratedSym(ctxt, "runtime.funcnametab", size, writeFuncNameTab) +-- +2.40.1 + diff --git a/internal/linker/patches/go1.21/0003-add-entryOff-encryption.patch b/internal/linker/patches/go1.21/0003-add-entryOff-encryption.patch new file mode 100644 index 0000000..85b1013 --- /dev/null +++ b/internal/linker/patches/go1.21/0003-add-entryOff-encryption.patch @@ -0,0 +1,43 @@ +From b5524a7c84a994b43027723b4bb05441db365a1e Mon Sep 17 00:00:00 2001 +From: pagran +Date: Sat, 14 Jan 2023 21:36:16 +0100 +Subject: [PATCH 3/3] add entryOff encryption + +--- + cmd/link/internal/ld/pcln.go | 20 ++++++++++++++++++++ + 1 file changed, 20 insertions(+) + +diff --git a/cmd/link/internal/ld/pcln.go b/cmd/link/internal/ld/pcln.go +index 8b670135de..e4ccfc9330 100644 +--- a/cmd/link/internal/ld/pcln.go ++++ b/cmd/link/internal/ld/pcln.go +@@ -779,6 +779,26 @@ func writeFuncs(ctxt *Link, sb *loader.SymbolBuilder, funcs []loader.Sym, inlSym + sb.SetUint32(ctxt.Arch, dataoff, uint32(ldr.SymValue(fdsym)-gofuncBase)) + } + } ++ ++ // Moving next code higher is not recommended. ++ // Only at the end of the current function no edits between go versions ++ garbleEntryOffKeyStr := os.Getenv("GARBLE_LINK_ENTRYOFF_KEY") ++ if garbleEntryOffKeyStr == "" { ++ panic("[garble] entryOff key must be set") ++ } ++ var garbleEntryOffKey uint32 ++ // Use fmt package instead of strconv to avoid importing a new package ++ if _, err := fmt.Sscan(garbleEntryOffKeyStr, &garbleEntryOffKey); err != nil { ++ panic(fmt.Errorf("[garble] invalid entryOff key %s: %v", garbleEntryOffKeyStr, err)) ++ } ++ ++ garbleData := sb.Data() ++ for _, off := range startLocations { ++ entryOff := ctxt.Arch.ByteOrder.Uint32(garbleData[off:]) ++ nameOff := ctxt.Arch.ByteOrder.Uint32(garbleData[off+4:]) ++ ++ sb.SetUint32(ctxt.Arch, int64(off), entryOff^(nameOff*garbleEntryOffKey)) ++ } + } + + // pclntab initializes the pclntab symbol with +-- +2.40.1 +