]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/link: reject too-large relocation addend on darwin/arm64
authorCherry Zhang <cherryyz@google.com>
Wed, 9 Dec 2020 17:14:00 +0000 (12:14 -0500)
committerCherry Zhang <cherryyz@google.com>
Thu, 10 Dec 2020 15:37:33 +0000 (15:37 +0000)
Mach-O relocation addend is signed 24-bit. If the addend
overflows, it is better to fail the build than emitting an
incorrect binary. (I'm still working on a fix.)

Updates #42738.

Change-Id: I647f0cd4f6b84d9ac75ef3bf36673bea01dfc211
Reviewed-on: https://go-review.googlesource.com/c/go/+/276694
Trust: Cherry Zhang <cherryyz@google.com>
Run-TryBot: Cherry Zhang <cherryyz@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Than McIntosh <thanm@google.com>
src/cmd/link/internal/arm64/asm.go

index a7af85564608123cc3a132564cf6cc67390ac671..30819db4c67e5880f055e96ccbb179eb883be176 100644 (file)
@@ -463,6 +463,9 @@ func elfreloc1(ctxt *ld.Link, out *ld.OutBuf, ldr *loader.Loader, s loader.Sym,
        return true
 }
 
+// sign-extends from 24-bit.
+func signext24(x int64) int64 { return x << 40 >> 40 }
+
 func machoreloc1(arch *sys.Arch, out *ld.OutBuf, ldr *loader.Loader, s loader.Sym, r loader.ExtReloc, sectoff int64) bool {
        var v uint32
 
@@ -486,6 +489,10 @@ func machoreloc1(arch *sys.Arch, out *ld.OutBuf, ldr *loader.Loader, s loader.Sy
                }
        }
 
+       if r.Xadd != signext24(r.Xadd) {
+               ldr.Errorf(s, "relocation addend overflow: %s+0x%x", ldr.SymName(rs), r.Xadd)
+       }
+
        switch rt {
        default:
                return false