
We can't really use `dlopen()` from a statically built binary, so let's disable this functionality if `static_build` tag is used (which is sort of a de-facto standard way of doing it). This eliminates the following warning: 🇩 bin/containerd # github.com/containerd/containerd/cmd/containerd /tmp/go-link-509179974/000004.o: In function `pluginOpen': /usr/local/go/src/plugin/plugin_dlopen.go:19: warning: Using 'dlopen' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking [v2: add static build instructions to BUILDING.md] Signed-off-by: Kir Kolyshkin <kolyshkin@gmail.com>
47 lines
840 B
Go
47 lines
840 B
Go
// +build go1.8,!windows,amd64,!static_build
|
|
|
|
package plugin
|
|
|
|
import (
|
|
"fmt"
|
|
"path/filepath"
|
|
"plugin"
|
|
"runtime"
|
|
)
|
|
|
|
// loadPlugins loads all plugins for the OS and Arch
|
|
// that containerd is built for inside the provided path
|
|
func loadPlugins(path string) error {
|
|
abs, err := filepath.Abs(path)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
pattern := filepath.Join(abs, fmt.Sprintf(
|
|
"*-%s-%s.%s",
|
|
runtime.GOOS,
|
|
runtime.GOARCH,
|
|
getLibExt(),
|
|
))
|
|
libs, err := filepath.Glob(pattern)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
for _, lib := range libs {
|
|
if _, err := plugin.Open(lib); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// getLibExt returns a platform specific lib extension for
|
|
// the platform that containerd is running on
|
|
func getLibExt() string {
|
|
switch runtime.GOOS {
|
|
case "windows":
|
|
return "dll"
|
|
default:
|
|
return "so"
|
|
}
|
|
}
|