Commit 66129835 authored by Shenghou Ma's avatar Shenghou Ma Committed by Russ Cox

cmd/ld: abort if (32-bit) address relocation is negative on amd64.

Update #7980
This CL make the linker abort for the example program. For Go 1.4,
we need to find a general way to handle large memory model programs.

LGTM=dave, josharian, iant
R=iant, dave, josharian
CC=golang-codereviews
https://golang.org/cl/91500046
parent 431b96bd
...@@ -243,6 +243,16 @@ relocsym(LSym *s) ...@@ -243,6 +243,16 @@ relocsym(LSym *s)
break; break;
} }
o = symaddr(r->sym) + r->add; o = symaddr(r->sym) + r->add;
// On amd64, 4-byte offsets will be sign-extended, so it is impossible to
// access more than 2GB of static data; fail at link time is better than
// fail at runtime. See http://golang.org/issue/7980.
// Instead of special casing only amd64, we treat this as an error on all
// 64-bit architectures so as to be future-proof.
if((int32)o < 0 && PtrSize > 4 && siz == 4) {
diag("non-pc-relative relocation address is too big: %#llux", o);
errorexit();
}
break; break;
case R_CALL: case R_CALL:
case R_PCREL: case R_PCREL:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment