The go command supports "binary-only packages", in which
the compiled .a file is installed in GOROOT/pkg or GOPATH/pkg
but the corresponding source code is only a stub with relevant
imports (for linking), a special comment marking it as a binary-only
package, and perhaps documentation for exported API.

While the go command will use these packages if they exist in
GOROOT or GOPATH, 'go get' will not download them: 'go get'
is intentionally only about source code distribution.

Furthermore, binary-only packages only work when the build is
using the exact versions of whatever imported packages are
needed by the binary-only package. If there were any important
differences in a dependency between compilation and linking,
the binary-only portion might have stale information about details
of the imported package, such as type sizes, struct field offsets,
inlined function bodies, escape analysis decisions, and so on,
leading to silent memory corruption at runtime.

Binary-only packages also only work when the build is using the
exact version of the Go toolchain that was used for compilation.
This is at least enforced at link time, with the effect that if your
binary-only package only imports the standard library and you don't
use any special compilation flags, then the toolchain version check
suffices to avoid the silent memory corruption problem described in
the previous package. But if your package imports any non-standard
package for which that the eventual user might try to combine with
a different version, you're in trouble again.

Compiled Go programs also contain much richer amounts of runtime
information than compiled C programs, so that for example all the
details of type declarations, including struct definitions, are in the
compiled code, along with file names and line numbers for the compiled
code, and increasingly good debug information that was impossible to
turn off until very recently. Overall, a binary-only package obscures very
little.

In short, binary-only packages:

- have never been supported by 'go get',
so you've had to go out of your way to use them,
- aren't even guaranteed to work when you do use them,
possibly leading to silent memory corruption, and
- still expose quite a lot more than most people would expect
about the original source code.

For these reasons, we're looking at removing binary-only package
support entirely.

If you use binary-only packages and think it's important to keep that
support around, please let us know either on this thread or at
golang.org/issue/28152.

Thanks.
Russ

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to