]> Cypherpunks repositories - gostls13.git/commit
[release-branch.go1.24] cmd/link: choose one with larger size for duplicated BSS...
authorCherry Mui <cherryyz@google.com>
Tue, 25 Mar 2025 20:55:54 +0000 (16:55 -0400)
committerGopher Robot <gobot@golang.org>
Thu, 10 Apr 2025 15:34:54 +0000 (08:34 -0700)
commita9d9b5570964c2c2ef07992150174bd3d1b2d891
tree64b5722e60d3a2e192f52465fba68d6f369f2c5c
parentfa7217f74de31f949e386efea1713df195a91900
[release-branch.go1.24] 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.

Also include the followup fix CL 661915.

Fixes #73092.
Updates #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>
(cherry picked from commit 8f6c083d7bf68a766073c50ceb8ea405a3fe7bed)
Reviewed-on: https://go-review.googlesource.com/c/go/+/662335
Auto-Submit: Dmitri Shuralyov <dmitshur@google.com>
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]