aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRob Pike <r@golang.org>2013-05-01 17:00:21 -0700
committerRob Pike <r@golang.org>2013-05-01 17:00:21 -0700
commitd727d147c0c724e9d6489db86925dc61a5ddfd91 (patch)
treeb985c9c8614b6fa5f8063660d5266b7fa6f2aebc
parentc8942f021e99d1d0388bb6571fc3410de94a88d9 (diff)
downloadgo-d727d147c0c724e9d6489db86925dc61a5ddfd91.tar.gz
go-d727d147c0c724e9d6489db86925dc61a5ddfd91.zip
cmd/ld: fix another unsigned value causing bugs on Plan 9
"The usual conversions" bite again. R=golang-dev, rsc CC=golang-dev https://golang.org/cl/9103044
-rw-r--r--src/cmd/ld/data.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/src/cmd/ld/data.c b/src/cmd/ld/data.c
index 37ad2f8c87..23fc23e5fc 100644
--- a/src/cmd/ld/data.c
+++ b/src/cmd/ld/data.c
@@ -247,7 +247,13 @@ relocsym(Sym *s)
o = 0;
if(r->sym)
o += symaddr(r->sym);
- o += r->add - (s->value + r->off + r->siz);
+ // NOTE: The (int32) cast on the next line works around a bug in Plan 9's 8c
+ // compiler. The expression s->value + r->off + r->siz is int32 + int32 +
+ // uchar, and Plan 9 8c incorrectly treats the expression as type uint32
+ // instead of int32, causing incorrect values when sign extended for adding
+ // to o. The bug only occurs on Plan 9, because this C program is compiled by
+ // the standard host compiler (gcc on most other systems).
+ o += r->add - (s->value + r->off + (int32)r->siz);
break;
case D_SIZE:
o = r->sym->size + r->add;