Уменьшение размера плагина (.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,

Я делаю что-то не так или эта функция немного сломана?

0 ответов

Другие вопросы по тегам