summaryrefslogtreecommitdiff
path: root/src/liblink
diff options
context:
space:
mode:
authorShenghou Ma <minux@golang.org>2014-08-06 00:25:41 -0400
committerShenghou Ma <minux@golang.org>2014-08-06 00:25:41 -0400
commite558263c73379ff1ecd1cc08fa0841ff09fc283f (patch)
tree1c4f7768cb2397815c5808e0b854b9b1c83f9a33 /src/liblink
parent3a8b47e3c6f96c701f718c66a1abb2be3a31e0a6 (diff)
downloadgo-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.c31
-rw-r--r--src/liblink/obj5.c1
-rw-r--r--src/liblink/obj6.c2
-rw-r--r--src/liblink/obj8.c1
-rw-r--r--src/liblink/sym.c2
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;