From 4c69e92f51645c291dc4c74aed5c56ecb0dcd57f Mon Sep 17 00:00:00 2001 From: Michael Munday Date: Fri, 4 Mar 2016 10:14:03 -0500 Subject: [PATCH] cmd/link: align string data to Minalign when merging strings Minalign > 1 implies that relocations inserted by the linker cannot target arbitrary bytes. Related to #14604 Change-Id: Ie68d14887bc4047d9b29b0cb1149a8d14b6c62e2 Reviewed-on: https://go-review.googlesource.com/20214 Reviewed-by: David Crawshaw Run-TryBot: David Crawshaw TryBot-Result: Gobot Gobot --- src/cmd/link/internal/ld/mergestrings.go | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/cmd/link/internal/ld/mergestrings.go b/src/cmd/link/internal/ld/mergestrings.go index 0e16b36177..1facd0aaf6 100644 --- a/src/cmd/link/internal/ld/mergestrings.go +++ b/src/cmd/link/internal/ld/mergestrings.go @@ -52,15 +52,21 @@ func mergestrings() { alldata := Linklookup(Ctxt, "go.string.alldata", 0) alldata.Type = obj.SGOSTRING alldata.Attr |= AttrReachable - alldata.Size = int64(size) alldata.P = make([]byte, 0, size) for _, str := range strs { off := len(alldata.P) alldata.P = append(alldata.P, str.P...) + // Architectures with Minalign > 1 cannot have relocations pointing + // to arbitrary locations, so make sure each string is appropriately + // aligned. + for r := len(alldata.P) % Thearch.Minalign; r > 0; r-- { + alldata.P = append(alldata.P, 0) + } str.Attr.Set(AttrReachable, false) for _, r := range relocsToStrs[str] { r.Add += int64(off) r.Sym = alldata } } + alldata.Size = int64(len(alldata.P)) } -- 2.48.1