diff options
author | Rob Pike <r@golang.org> | 2013-05-01 17:00:21 -0700 |
---|---|---|
committer | Rob Pike <r@golang.org> | 2013-05-01 17:00:21 -0700 |
commit | d727d147c0c724e9d6489db86925dc61a5ddfd91 (patch) | |
tree | b985c9c8614b6fa5f8063660d5266b7fa6f2aebc | |
parent | c8942f021e99d1d0388bb6571fc3410de94a88d9 (diff) | |
download | go-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.c | 8 |
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; |