Index: src/cmd/link/internal/ld/data.go
--- src/cmd/link/internal/ld/data.go.orig
+++ src/cmd/link/internal/ld/data.go
@@ -269,6 +269,7 @@ func (st *relocSymState) relocsym(s loader.Sym, P []by
 		}
 
 		var o int64
+		var archReloc bool
 		switch rt {
 		default:
 			switch siz {
@@ -283,6 +284,7 @@ func (st *relocSymState) relocsym(s loader.Sym, P []by
 			case 8:
 				o = int64(target.Arch.ByteOrder.Uint64(P[off:]))
 			}
+			archReloc = true
 			out, n, ok := thearch.Archreloc(target, ldr, syms, r, s, o)
 			if target.IsExternal() {
 				nExtReloc += n
@@ -562,17 +564,17 @@ func (st *relocSymState) relocsym(s loader.Sym, P []by
 		case 1:
 			P[off] = byte(int8(o))
 		case 2:
-			if o != int64(int16(o)) {
+			if !archReloc && o != int64(int16(o)) {
 				st.err.Errorf(s, "relocation address for %s is too big: %#x", ldr.SymName(rs), o)
 			}
 			target.Arch.ByteOrder.PutUint16(P[off:], uint16(o))
 		case 4:
 			if rt == objabi.R_PCREL || rt == objabi.R_CALL {
-				if o != int64(int32(o)) {
+				if !archReloc && o != int64(int32(o)) {
 					st.err.Errorf(s, "pc-relative relocation address for %s is too big: %#x", ldr.SymName(rs), o)
 				}
 			} else {
-				if o != int64(int32(o)) && o != int64(uint32(o)) {
+				if !archReloc && o != int64(int32(o)) && o != int64(uint32(o)) {
 					st.err.Errorf(s, "non-pc-relative relocation address for %s is too big: %#x", ldr.SymName(rs), uint64(o))
 				}
 			}
