]> Cypherpunks repositories - gostls13.git/commit
cmd/link: choose one with larger size for duplicated BSS symbols
authorCherry Mui <cherryyz@google.com>
Tue, 25 Mar 2025 20:55:54 +0000 (16:55 -0400)
committerCherry Mui <cherryyz@google.com>
Fri, 28 Mar 2025 19:00:23 +0000 (12:00 -0700)
commit8f6c083d7bf68a766073c50ceb8ea405a3fe7bed
treea76cda4c4a9224819c784231eace3d2008646f5f
parent26fdb07d4ce58885305283ba18960f582f4eaa73
cmd/link: choose one with larger size for duplicated BSS symbols

When two packages declare a variable with the same name (with
linkname at least on one side), the linker will choose one as the
actual definition of the symbol if one has content (i.e. a DATA
symbol) and the other does not (i.e. a BSS symbol). When both have
content, it is redefinition error. When neither has content,
currently the choice is sort of arbitrary (depending on symbol
loading order, etc. which are subject to change).

One use case for that is that one wants to reference a symbol
defined in another package, and the reference side just wants to
see some of the fields, so it may be declared with a smaller type.
In this case, we want to choose the one with the larger size as
the true definition. Otherwise the code accessing the larger
sized one may read/write out of bounds, corrupting the next
variable. This CL makes the linker do so.

Fixes #72032.

Change-Id: I160aa9e0234702066cb8f141c186eaa89d0fcfed
Reviewed-on: https://go-review.googlesource.com/c/go/+/660696
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: David Chase <drchase@google.com>
Reviewed-by: Than McIntosh <thanm@golang.org>
src/cmd/link/internal/loader/loader.go
src/cmd/link/link_test.go
src/cmd/link/testdata/linkname/sched.go [new file with mode: 0644]