]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/link: align string data to Minalign when merging strings
authorMichael Munday <munday@ca.ibm.com>
Fri, 4 Mar 2016 15:14:03 +0000 (10:14 -0500)
committerDavid Crawshaw <crawshaw@golang.org>
Fri, 4 Mar 2016 20:12:55 +0000 (20:12 +0000)
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 <crawshaw@golang.org>
Run-TryBot: David Crawshaw <crawshaw@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>

src/cmd/link/internal/ld/mergestrings.go

index 0e16b36177448ab3ca064baf19739900232ff660..1facd0aaf641d0996d2dfbd880ab041177b04171 100644 (file)
@@ -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))
 }