diff options
author | Eoghan Sherry <ejsherry@gmail.com> | 2010-12-07 17:20:52 -0500 |
---|---|---|
committer | Russ Cox <rsc@golang.org> | 2010-12-07 17:20:52 -0500 |
commit | 63544c47547fd3246e7509e5e13fe90a9d5e3f20 (patch) | |
tree | 8a0f8ce28fccb6ded911f73f1155e0810a734e58 | |
parent | 7e14bd81f42ddab2dda331a3395ec36b3a299837 (diff) | |
download | go-63544c47547fd3246e7509e5e13fe90a9d5e3f20.tar.gz go-63544c47547fd3246e7509e5e13fe90a9d5e3f20.zip |
ld: fix dwarf decoding of 64-bit reflect values
R=rsc
CC=golang-dev
https://golang.org/cl/3002041
-rw-r--r-- | src/cmd/ld/dwarf.c | 18 | ||||
-rw-r--r-- | src/cmd/ld/lib.c | 9 |
2 files changed, 19 insertions, 8 deletions
diff --git a/src/cmd/ld/dwarf.c b/src/cmd/ld/dwarf.c index 9342e1e284..4c9be955ba 100644 --- a/src/cmd/ld/dwarf.c +++ b/src/cmd/ld/dwarf.c @@ -800,20 +800,25 @@ decode_reloc(Sym *s, int32 off) static uvlong decode_inuxi(uchar* p, int sz) { - uvlong r; - uchar *inuxi; + uint64 v; + uint32 l; + uchar *cast, *inuxi; int i; - r = 0; + v = l = 0; + cast = nil; inuxi = nil; switch (sz) { case 2: + cast = (uchar*)&l; inuxi = inuxi2; break; case 4: + cast = (uchar*)&l; inuxi = inuxi4; break; case 8: + cast = (uchar*)&v; inuxi = inuxi8; break; default: @@ -821,9 +826,10 @@ decode_inuxi(uchar* p, int sz) errorexit(); } for (i = 0; i < sz; i++) - r += p[i] << (8*inuxi[i]); - - return r; + cast[inuxi[i]] = p[i]; + if (sz == 8) + return v; + return l; } // Type.commonType.kind diff --git a/src/cmd/ld/lib.c b/src/cmd/ld/lib.c index 43cff969c8..e666515c04 100644 --- a/src/cmd/ld/lib.c +++ b/src/cmd/ld/lib.c @@ -592,8 +592,13 @@ nuxiinit(void) if(i < 1) inuxi1[i] = c; inuxi4[i] = c; - inuxi8[i] = c; - inuxi8[i+4] = c+4; + if(c == i) { + inuxi8[i] = c; + inuxi8[i+4] = c+4; + } else { + inuxi8[i] = c+4; + inuxi8[i+4] = c; + } fnuxi4[i] = c; fnuxi8[i] = c; fnuxi8[i+4] = c+4; |