mirror of
https://github.com/burrowers/garble.git
synced 2025-12-24 12:58:05 +08:00
This lets us start taking advantage of featurs from Go 1.23, particularly tracking aliases in go/types and iterators. Note that we need to add code to properly handle or skip over the new *types.Alias type which go/types produces for Go type aliases. Also note that we actually turn this mode off entirely for now, due to the bug reported at https://go.dev/issue/70394. We don't yet remove our own alias tracking code yet due to the above. We hope to be able to remove it very soon.
67 lines
1.4 KiB
Plaintext
67 lines
1.4 KiB
Plaintext
skip # TODO: get plugins working properly. See issue #87
|
|
|
|
[windows] skip 'Go plugins are not supported on Windows'
|
|
|
|
exec garble build -buildmode=plugin ./plugin
|
|
binsubstr plugin.so 'PublicVar' 'PublicFunc'
|
|
! binsubstr plugin.so 'privateFunc'
|
|
|
|
# Note that we need -trimpath; see the caveat section in the README.
|
|
go build -trimpath
|
|
exec ./main
|
|
cmp stderr main.stderr
|
|
binsubstr main$exe 'PublicVar' 'PublicFunc'
|
|
|
|
[short] stop # no need to verify this with -short
|
|
|
|
# This used to fail, since in this case the package path for the ad-hoc plugin
|
|
# package isn't "main", but "plugin/unnamed-*".
|
|
exec garble build -buildmode=plugin plugin/main.go
|
|
|
|
go build -buildmode=plugin ./plugin
|
|
binsubstr plugin.so 'PublicVar' 'PublicFunc' 'privateFunc'
|
|
go build
|
|
exec ./main
|
|
cmp stderr main.stderr
|
|
-- go.mod --
|
|
module test/main
|
|
|
|
go 1.23
|
|
-- plugin/main.go --
|
|
package main
|
|
|
|
import "test/main/plugin/lib"
|
|
|
|
var PublicVar int = lib.ImportedFunc()
|
|
|
|
func privateFunc(n int) { println("Hello, number", n) }
|
|
|
|
func PublicFunc() { privateFunc(PublicVar) }
|
|
-- plugin/lib/lib.go --
|
|
package lib
|
|
|
|
func ImportedFunc() int { return 4 }
|
|
-- main.go --
|
|
package main
|
|
|
|
import "plugin"
|
|
|
|
func main() {
|
|
p, err := plugin.Open("plugin.so")
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
v, err := p.Lookup("PublicVar")
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
f, err := p.Lookup("PublicFunc")
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
*v.(*int) = 7
|
|
f.(func())()
|
|
}
|
|
-- main.stderr --
|
|
Hello, number 7
|