diff options
author | Shenghou Ma <minux@golang.org> | 2014-08-06 00:25:41 -0400 |
---|---|---|
committer | Shenghou Ma <minux@golang.org> | 2014-08-06 00:25:41 -0400 |
commit | e558263c73379ff1ecd1cc08fa0841ff09fc283f (patch) | |
tree | 1c4f7768cb2397815c5808e0b854b9b1c83f9a33 /src/liblink/ld.c | |
parent | 3a8b47e3c6f96c701f718c66a1abb2be3a31e0a6 (diff) | |
download | go-e558263c73379ff1ecd1cc08fa0841ff09fc283f.tar.gz |
liblink: support big-endian properly
LGTM=rsc
R=rsc, iant
CC=golang-codereviews
https://codereview.appspot.com/115300044
Diffstat (limited to 'src/liblink/ld.c')
-rw-r--r-- | src/liblink/ld.c | 31 |
1 files changed, 23 insertions, 8 deletions
diff --git a/src/liblink/ld.c b/src/liblink/ld.c index a2fdce56b..6d0fe4a2a 100644 --- a/src/liblink/ld.c +++ b/src/liblink/ld.c @@ -130,16 +130,26 @@ find1(int32 l, int c) } void -nuxiinit(void) +nuxiinit(LinkArch *arch) { int i, c; + if(arch->endian != BigEndian && arch->endian != LittleEndian) + sysfatal("unknown endian (%#x) for arch %s", arch->endian, arch->name); + for(i=0; i<4; i++) { - c = find1(0x04030201L, i+1); - if(i < 2) - inuxi2[i] = c; - if(i < 1) - inuxi1[i] = c; + c = find1(arch->endian, i+1); + if(arch->endian == LittleEndian) { + if(i < 2) + inuxi2[i] = c; + if(i < 1) + inuxi1[i] = c; + } else { + if(i >= 2) + inuxi2[i-2] = c; + if(i >= 3) + inuxi1[i-3] = c; + } inuxi4[i] = c; if(c == i) { inuxi8[i] = c; @@ -149,8 +159,13 @@ nuxiinit(void) inuxi8[i+4] = c; } fnuxi4[i] = c; - fnuxi8[i] = c; - fnuxi8[i+4] = c+4; + if(c == i) { + fnuxi8[i] = c; + fnuxi8[i+4] = c+4; + } else { + fnuxi8[i] = c+4; + fnuxi8[i+4] = c; + } } } |