From: Michael Munday Date: Fri, 4 Mar 2016 15:14:03 +0000 (-0500) Subject: cmd/link: align string data to Minalign when merging strings X-Git-Tag: go1.7beta1~1553 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=4c69e92f51645c291dc4c74aed5c56ecb0dcd57f;p=gostls13.git 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 --- 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)) }