But in that case why would that only happen for dynamic builds ? Shouldn't all unexported methods also be kept for the "normal" build ?
Pierre. Le sam. 8 févr. 2025 à 01:16, Ian Lance Taylor <i...@golang.org> a écrit : > On Fri, Feb 7, 2025 at 2:59 PM 'Pierre Gimalac' via golang-nuts > <golang-nuts@googlegroups.com> wrote: > > > > I noticed that when importing the std "plugin" package then (some ?) > unexported methods are kept in the binary. > > > > Disclaimer it's something I only observed on a complex binary, I could > not make a minimal reproducible example, so I'm probably misunderstanding > something. > > > > When using `-ldflags=-dumpdep` on my complex binary I was seeing > something like `type:*text/template.Template -> > text/template.(*Template).execute`, so just having the type `Template` > makes the unexported method reachable. It disappeared when removing the > "plugin" import. > > > > I believe the associated code in the linker is > https://github.com/golang/go/blob/go1.23.6/src/cmd/link/internal/ld/deadcode.go#L455 > . > > We can see that if we have reflect and the binary is dynamically linked > (with plugin or shared build modes), then unexported methods are also kept. > Note that when `dynlink` is true then `reflectSeen` is also set to true, so > I think you actually don't even need to use reflect for that to happen. > > > > I'm curious why ? The documentation of `Plugin.Lookup` says the symbol > must be exported https://pkg.go.dev/plugin#Plugin.Lookup . > > I would have expected the first part of the condition to be > `m.isExported() && (d.reflectSeen || d.dynlink)` instead. > > > > This makes binaries importing "plugin" (and probably plugins and shared > builds too) significantly bigger, in my case removing the "plugin" import > reduced the size of various binaries by around 30%. > > See https://github.com/containerd/containerd/issues/11202 and > https://github.com/DataDog/datadog-agent/pull/32538 for details. > > As the comment in the linker code says, the linker is ensuring that > all methods of any reachable interface are kept. An interface can have > unexported methods, and in the general case we must keep any method > that may satisfy that interface. > > Ian > -- 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. To view this discussion visit https://groups.google.com/d/msgid/golang-nuts/CAGAkyj_0zABXHSirLPiDSuPBiDkAahKQ%2BQGOpjcoAYKXEq7ykg%40mail.gmail.com.