aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRob Pike <r@golang.org>2013-04-30 09:10:10 -0700
committerRob Pike <r@golang.org>2013-04-30 09:10:10 -0700
commit700a126c64948f91822dcc0380f32438dad6fc71 (patch)
treea94b6703930c49c5cfb218f91be74c3f12e8431d
parente2b2e0d8d19e747ffe2059ed8426f5b12b77ff0f (diff)
downloadgo-700a126c64948f91822dcc0380f32438dad6fc71.tar.gz
go-700a126c64948f91822dcc0380f32438dad6fc71.zip
cmd/ld: fix check for address wrap in relocation
PC-relative needs a signed offset; others need unsigned. Also fix signedness of 32-bit relocation on Windows. R=golang-dev, iant CC=golang-dev https://golang.org/cl/9039045
-rw-r--r--src/cmd/ld/data.c3
-rw-r--r--src/cmd/ld/ldpe.c2
2 files changed, 2 insertions, 3 deletions
diff --git a/src/cmd/ld/data.c b/src/cmd/ld/data.c
index c57c0c69b6..263dd25828 100644
--- a/src/cmd/ld/data.c
+++ b/src/cmd/ld/data.c
@@ -259,8 +259,7 @@ relocsym(Sym *s)
cursym = s;
diag("bad reloc size %#ux for %s", siz, r->sym->name);
case 4:
- // TODO: Test is causing breakages on ARM and Windows. Disable for now.
- if(0 && o != (int32)o) {
+ if((r->type == D_PCREL && o != (int32)o) || (r->type != D_PCREL && o != (uint32)o)) {
cursym = S;
diag("relocation address is too big: %#llx", o);
}
diff --git a/src/cmd/ld/ldpe.c b/src/cmd/ld/ldpe.c
index 7a5bc0c608..033e522f27 100644
--- a/src/cmd/ld/ldpe.c
+++ b/src/cmd/ld/ldpe.c
@@ -291,7 +291,7 @@ ldpe(Biobuf *f, char *pkg, int64 len, char *pn)
case IMAGE_REL_AMD64_ADDR32: // R_X86_64_PC32
case IMAGE_REL_AMD64_ADDR32NB:
rp->type = D_PCREL;
- rp->add = le32(rsect->base+rp->off);
+ rp->add = (int32)le32(rsect->base+rp->off);
break;
case IMAGE_REL_I386_DIR32NB:
case IMAGE_REL_I386_DIR32: