Skip to content

Commit 28ccfa0

Browse files
mvdanlu4p
authored andcommitted
internal/linker: add Go patches rebased on go1.24rc3
See burrowers/go-patches#8.
1 parent 561158d commit 28ccfa0

File tree

3 files changed

+175
-0
lines changed

3 files changed

+175
-0
lines changed
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
From 1eb3d02d33155831067ca7db2c6517108c4305ae Mon Sep 17 00:00:00 2001
2+
From: pagran <[email protected]>
3+
Date: Mon, 9 Jan 2023 13:30:00 +0100
4+
Subject: [PATCH 1/3] add custom magic value
5+
6+
---
7+
cmd/link/internal/ld/pcln.go | 17 +++++++++++++++++
8+
1 file changed, 17 insertions(+)
9+
10+
diff --git a/cmd/link/internal/ld/pcln.go b/cmd/link/internal/ld/pcln.go
11+
index ea08fd3d31..7bae9f18c5 100644
12+
--- a/cmd/link/internal/ld/pcln.go
13+
+++ b/cmd/link/internal/ld/pcln.go
14+
@@ -4,6 +4,10 @@
15+
16+
package ld
17+
18+
+import (
19+
+ "os"
20+
+)
21+
+
22+
import (
23+
"cmd/internal/goobj"
24+
"cmd/internal/objabi"
25+
@@ -262,6 +266,19 @@ func (state *pclntab) generatePCHeader(ctxt *Link) {
26+
if off != size {
27+
panic(fmt.Sprintf("pcHeader size: %d != %d", off, size))
28+
}
29+
+
30+
+ // Use garble prefix in variable names to minimize collision risk
31+
+ garbleMagicStr := os.Getenv("GARBLE_LINK_MAGIC")
32+
+ if garbleMagicStr == "" {
33+
+ panic("[garble] magic value must be set")
34+
+ }
35+
+ var garbleMagicVal uint32
36+
+ // Use fmt package instead of strconv to avoid importing a new package
37+
+ if _, err := fmt.Sscan(garbleMagicStr, &garbleMagicVal); err != nil {
38+
+ panic(fmt.Errorf("[garble] invalid magic value %s: %v", garbleMagicStr, err))
39+
+ }
40+
+
41+
+ header.SetUint32(ctxt.Arch, 0, garbleMagicVal)
42+
}
43+
44+
state.pcheader = state.addGeneratedSym(ctxt, "runtime.pcheader", size, writeHeader)
45+
--
46+
2.48.1
47+
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
From 2a691e00bc659059133cd5604c7a099981cf684c Mon Sep 17 00:00:00 2001
2+
From: pagran <[email protected]>
3+
Date: Mon, 9 Jan 2023 13:30:36 +0100
4+
Subject: [PATCH 2/3] add unexported function name removing
5+
6+
---
7+
cmd/link/internal/ld/pcln.go | 43 +++++++++++++++++++++++++++++++++++-
8+
1 file changed, 42 insertions(+), 1 deletion(-)
9+
10+
diff --git a/cmd/link/internal/ld/pcln.go b/cmd/link/internal/ld/pcln.go
11+
index 7bae9f18c5..b497573b15 100644
12+
--- a/cmd/link/internal/ld/pcln.go
13+
+++ b/cmd/link/internal/ld/pcln.go
14+
@@ -8,6 +8,10 @@ import (
15+
"os"
16+
)
17+
18+
+import (
19+
+ "unicode"
20+
+)
21+
+
22+
import (
23+
"cmd/internal/goobj"
24+
"cmd/internal/objabi"
25+
@@ -318,19 +322,56 @@ func walkFuncs(ctxt *Link, funcs []loader.Sym, f func(loader.Sym)) {
26+
func (state *pclntab) generateFuncnametab(ctxt *Link, funcs []loader.Sym) map[loader.Sym]uint32 {
27+
nameOffsets := make(map[loader.Sym]uint32, state.nfunc)
28+
29+
+ garbleTiny := os.Getenv("GARBLE_LINK_TINY") == "true"
30+
+
31+
// Write the null terminated strings.
32+
writeFuncNameTab := func(ctxt *Link, s loader.Sym) {
33+
symtab := ctxt.loader.MakeSymbolUpdater(s)
34+
+ if garbleTiny {
35+
+ symtab.AddStringAt(0, "")
36+
+ }
37+
+
38+
for s, off := range nameOffsets {
39+
+ if garbleTiny && off == 0 {
40+
+ continue
41+
+ }
42+
symtab.AddCStringAt(int64(off), ctxt.loader.SymName(s))
43+
}
44+
}
45+
46+
// Loop through the CUs, and calculate the size needed.
47+
var size int64
48+
+
49+
+ if garbleTiny {
50+
+ size = 1 // first byte is reserved for empty string used for all non-exportable method names
51+
+ }
52+
+ // Kinds of SymNames found in the wild:
53+
+ //
54+
+ // * reflect.Value.CanAddr
55+
+ // * reflect.(*Value).String
56+
+ // * reflect.w6cEoKc
57+
+ // * internal/abi.(*RegArgs).IntRegArgAddr
58+
+ // * type:.eq.runtime.special
59+
+ // * runtime/internal/atomic.(*Pointer[go.shape.string]).Store
60+
+ //
61+
+ // Checking whether the first rune after the last dot is uppercase seems enough.
62+
+ isExported := func(name string) bool {
63+
+ for _, r := range name[strings.LastIndexByte(name, '.')+1:] {
64+
+ return unicode.IsUpper(r)
65+
+ }
66+
+ return false
67+
+ }
68+
+
69+
walkFuncs(ctxt, funcs, func(s loader.Sym) {
70+
+ name := ctxt.loader.SymName(s)
71+
+
72+
+ if garbleTiny && !isExported(name) {
73+
+ nameOffsets[s] = 0 // redirect name to empty string
74+
+ return
75+
+ }
76+
+
77+
nameOffsets[s] = uint32(size)
78+
- size += int64(len(ctxt.loader.SymName(s)) + 1) // NULL terminate
79+
+ size += int64(len(name) + 1) // NULL terminate
80+
})
81+
82+
state.funcnametab = state.addGeneratedSym(ctxt, "runtime.funcnametab", size, writeFuncNameTab)
83+
--
84+
2.48.1
85+
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
From 03342e79193875d08bf3f88154e77a453b28c076 Mon Sep 17 00:00:00 2001
2+
From: pagran <[email protected]>
3+
Date: Sat, 14 Jan 2023 21:36:16 +0100
4+
Subject: [PATCH 3/3] add entryOff encryption
5+
6+
---
7+
cmd/link/internal/ld/pcln.go | 20 ++++++++++++++++++++
8+
1 file changed, 20 insertions(+)
9+
10+
diff --git a/cmd/link/internal/ld/pcln.go b/cmd/link/internal/ld/pcln.go
11+
index b497573b15..f1021fcee3 100644
12+
--- a/cmd/link/internal/ld/pcln.go
13+
+++ b/cmd/link/internal/ld/pcln.go
14+
@@ -806,6 +806,26 @@ func writeFuncs(ctxt *Link, sb *loader.SymbolBuilder, funcs []loader.Sym, inlSym
15+
sb.SetUint32(ctxt.Arch, dataoff, uint32(ldr.SymValue(fdsym)-gofuncBase))
16+
}
17+
}
18+
+
19+
+ // Moving next code higher is not recommended.
20+
+ // Only at the end of the current function no edits between go versions
21+
+ garbleEntryOffKeyStr := os.Getenv("GARBLE_LINK_ENTRYOFF_KEY")
22+
+ if garbleEntryOffKeyStr == "" {
23+
+ panic("[garble] entryOff key must be set")
24+
+ }
25+
+ var garbleEntryOffKey uint32
26+
+ // Use fmt package instead of strconv to avoid importing a new package
27+
+ if _, err := fmt.Sscan(garbleEntryOffKeyStr, &garbleEntryOffKey); err != nil {
28+
+ panic(fmt.Errorf("[garble] invalid entryOff key %s: %v", garbleEntryOffKeyStr, err))
29+
+ }
30+
+
31+
+ garbleData := sb.Data()
32+
+ for _, off := range startLocations {
33+
+ entryOff := ctxt.Arch.ByteOrder.Uint32(garbleData[off:])
34+
+ nameOff := ctxt.Arch.ByteOrder.Uint32(garbleData[off+4:])
35+
+
36+
+ sb.SetUint32(ctxt.Arch, int64(off), entryOff^(nameOff*garbleEntryOffKey))
37+
+ }
38+
}
39+
40+
// pclntab initializes the pclntab symbol with
41+
--
42+
2.48.1
43+

0 commit comments

Comments
 (0)