Уменьшение размера плагина (.so) в Go с помощью флагов -buildmode=shared и -linkshared
Я хотел бы уменьшить размер плагина (.so файл), удалив общие символы, используемые как в плагине, так и в основной программе, например, go runtime и стандартная библиотека.
Вот мой тестовый проект.
main.go:
package main
import (
"fmt"
"os"
"plugin"
)
type Plugin interface {
SayHello()
SayGoodbye()
}
func main() {
if len(os.Args) < 2 {
fmt.Fprintf(os.Stderr, "Usage: %s <plugin.so>\n", os.Args[0])
os.Exit(1)
}
p, err := plugin.Open(os.Args[1])
if err != nil {
fmt.Fprintf(os.Stderr, "plugin.Open: %v\n", err)
os.Exit(1)
}
piTemp, err := p.Lookup("Plugin")
if err != nil {
fmt.Fprintf(os.Stderr, "plugin.Open: %v\n", err)
os.Exit(1)
}
pi, ok := piTemp.(Plugin)
if !ok {
fmt.Fprintf(os.Stderr, "Unable to cast helloTemp to Plugin interface\n")
os.Exit(1)
}
pi.SayHello()
pi.SayGoodbye()
}
плагин / plugin.go:
package main
import "fmt"
type PluginImpl struct {}
var Plugin PluginImpl
func (pi *PluginImpl) SayHello() {
fmt.Printf("Hello from the plugin!\n")
}
func (pi *PluginImpl) SayGoodbye() {
fmt.Printf("Goodbye from the plugin!\n")
}
build.sh:
#!/bin/sh
set -e
go clean ./...
go build
cd plugin
go build -buildmode=plugin
Пример использования:
$ ./plugins-test ./plugin/plugin.so
Hello from the plugin!
Goodbye from the plugin!
Я попытался выполнить шаги из этой статьи и вот что я получил:
$ go install -buildmode=shared std
$ go install -buildmode=shared -linkshared go-sandbox/plugins-test
panic: runtime error: index out of range
goroutine 1 [running]:
cmd/go/internal/work.(*Builder).linkSharedAction.func2(0x84607e0)
/usr/local/go/src/cmd/go/internal/work/action.go:745 +0x7dd
cmd/go/internal/work.(*Builder).cacheAction(0x8d7cfc0, 0x90fdd00, 0x14, 0x0, 0x8efc740, 0x90fdd00)
/usr/local/go/src/cmd/go/internal/work/action.go:314 +0x84
cmd/go/internal/work.(*Builder).linkSharedAction(0x8d7cfc0, 0x1, 0x1, 0x8e2373a, 0x6, 0x8eec840, 0x8e2373a)
/usr/local/go/src/cmd/go/internal/work/action.go:738 +0x201
cmd/go/internal/work.(*Builder).buildmodeShared(0x8d7cfc0, 0x1, 0x1, 0x8c18050, 0x1, 0x2, 0x0, 0x0, 0x0, 0x8eec840, ...)
/usr/local/go/src/cmd/go/internal/work/action.go:649 +0xe8
cmd/go/internal/work.InstallPackages(0x8c18050, 0x1, 0x2, 0x0, 0x0, 0x0)
/usr/local/go/src/cmd/go/internal/work/build.go:503 +0xb9c
cmd/go/internal/work.runInstall(0x884ae20, 0x8c18050, 0x1, 0x2)
/usr/local/go/src/cmd/go/internal/work/build.go:417 +0x52
main.main()
/usr/local/go/src/cmd/go/main.go:219 +0x8a4
Поведение одинаково на go1.11.2 linux/386
а также go1.11.2 linux/arm
, В MacOS эта функция, кажется, отсутствует --- -buildmode=shared not supported on darwin/amd64
,
Я делаю что-то не так или эта функция немного сломана?