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 | |
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')
-rw-r--r-- | src/liblink/ld.c | 31 | ||||
-rw-r--r-- | src/liblink/obj5.c | 1 | ||||
-rw-r--r-- | src/liblink/obj6.c | 2 | ||||
-rw-r--r-- | src/liblink/obj8.c | 1 | ||||
-rw-r--r-- | src/liblink/sym.c | 2 |
5 files changed, 28 insertions, 9 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; + } } } diff --git a/src/liblink/obj5.c b/src/liblink/obj5.c index 348401930..de920b029 100644 --- a/src/liblink/obj5.c +++ b/src/liblink/obj5.c @@ -1033,6 +1033,7 @@ loop: LinkArch linkarm = { .name = "arm", .thechar = '5', + .endian = LittleEndian, .addstacksplit = addstacksplit, .assemble = span5, diff --git a/src/liblink/obj6.c b/src/liblink/obj6.c index 6879e97be..eef3b4294 100644 --- a/src/liblink/obj6.c +++ b/src/liblink/obj6.c @@ -1087,6 +1087,7 @@ prg(void) LinkArch linkamd64 = { .name = "amd64", .thechar = '6', + .endian = LittleEndian, .addstacksplit = addstacksplit, .assemble = span6, @@ -1132,6 +1133,7 @@ LinkArch linkamd64 = { LinkArch linkamd64p32 = { .name = "amd64p32", .thechar = '6', + .endian = LittleEndian, .addstacksplit = addstacksplit, .assemble = span6, diff --git a/src/liblink/obj8.c b/src/liblink/obj8.c index 2fc48d364..50e6d8236 100644 --- a/src/liblink/obj8.c +++ b/src/liblink/obj8.c @@ -816,6 +816,7 @@ loop: LinkArch link386 = { .name = "386", .thechar = '8', + .endian = LittleEndian, .addstacksplit = addstacksplit, .assemble = span8, diff --git a/src/liblink/sym.c b/src/liblink/sym.c index 6ae9e45c7..ec07957f4 100644 --- a/src/liblink/sym.c +++ b/src/liblink/sym.c @@ -91,7 +91,7 @@ linknew(LinkArch *arch) char *p; char buf[1024]; - nuxiinit(); + nuxiinit(arch); ctxt = emallocz(sizeof *ctxt); ctxt->arch = arch; |