aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAustin Clements <austin@google.com>2014-12-16 14:12:01 -0500
committerAustin Clements <austin@google.com>2015-01-07 20:35:13 +0000
commitfcdffb3f334ae4bfa5fda2c01b3cc51c3c4e5715 (patch)
tree9ef6e328e41335942e9e8dba89a5f64bf06f0fab /src
parente32fe2049d41cefabe0380212beb2aea86a1789b (diff)
downloadgo-fcdffb3f334ae4bfa5fda2c01b3cc51c3c4e5715.tar.xz
cmd/ld: support 2 byte relocations
ppc64 has a bunch of these. Change-Id: I3b93ed2bae378322a8dec036b1681e520b56ff53 Reviewed-on: https://go-review.googlesource.com/2003 Reviewed-by: Russ Cox <rsc@golang.org> Reviewed-by: Minux Ma <minux@golang.org>
Diffstat (limited to 'src')
-rw-r--r--src/cmd/ld/data.c9
-rw-r--r--src/cmd/ld/ldelf.c2
2 files changed, 11 insertions, 0 deletions
diff --git a/src/cmd/ld/data.c b/src/cmd/ld/data.c
index 92c6fb57ce..3cf0bbdfe1 100644
--- a/src/cmd/ld/data.c
+++ b/src/cmd/ld/data.c
@@ -132,6 +132,7 @@ relocsym(LSym *s)
{
Reloc *r;
LSym *rs;
+ int16 i16;
int32 i, off, siz, fl;
vlong o;
uchar *cast;
@@ -317,6 +318,14 @@ relocsym(LSym *s)
// TODO(rsc): Remove.
s->p[off] = (int8)o;
break;
+ case 2:
+ if(o != (int16)o)
+ diag("relocation address is too big: %#llx", o);
+ i16 = o;
+ cast = (uchar*)&i16;
+ for(i=0; i<2; i++)
+ s->p[off+i] = cast[inuxi2[i]];
+ break;
case 4:
if(r->type == R_PCREL || r->type == R_CALL) {
if(o != (int32)o)
diff --git a/src/cmd/ld/ldelf.c b/src/cmd/ld/ldelf.c
index 90da4aeb8f..f289fb38c7 100644
--- a/src/cmd/ld/ldelf.c
+++ b/src/cmd/ld/ldelf.c
@@ -721,6 +721,8 @@ ldelf(Biobuf *f, char *pkg, int64 len, char *pn)
else
diag("invalid rela size %d", rp->siz);
}
+ if(rp->siz == 2)
+ rp->add = (int16)rp->add;
if(rp->siz == 4)
rp->add = (int32)rp->add;
//print("rel %s %d %d %s %#llx\n", sect->sym->name, rp->type, rp->siz, rp->sym->name, rp->add);