From 0c0589ec42447e09a35bc0891a59402ee2d1c4fd Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Mon, 9 Dec 2013 07:42:55 -0800 Subject: [PATCH] cmd/ld: fix linux/386 build TBR=iant CC=golang-dev https://golang.org/cl/39400044 --- src/cmd/ld/data.c | 2 +- src/cmd/ld/ldelf.c | 3 +++ src/liblink/pass.c | 3 ++- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/cmd/ld/data.c b/src/cmd/ld/data.c index ac28041fbba..9b799fe0b23 100644 --- a/src/cmd/ld/data.c +++ b/src/cmd/ld/data.c @@ -246,7 +246,7 @@ relocsym(LSym *s) o = r->sym->size + r->add; break; } -//print("relocate %s %p %s => %p %p %p %p [%p]\n", s->name, s->value+off, r->sym ? r->sym->name : "", (void*)symaddr(r->sym), (void*)s->value, (void*)r->off, (void*)r->siz, (void*)o); +//print("relocate %s %#llux (%#llux+%#llux, size %d) => %s %#llux +%#llx [%llx]\n", s->name, (uvlong)(s->value+off), (uvlong)s->value, (uvlong)r->off, r->siz, r->sym ? r->sym->name : "", (uvlong)symaddr(r->sym), (vlong)r->add, (vlong)o); switch(siz) { default: ctxt->cursym = s; diff --git a/src/cmd/ld/ldelf.c b/src/cmd/ld/ldelf.c index 4bc830ef321..f1091d57c39 100644 --- a/src/cmd/ld/ldelf.c +++ b/src/cmd/ld/ldelf.c @@ -712,6 +712,9 @@ ldelf(Biobuf *f, char *pkg, int64 len, char *pn) else diag("invalid rela size %d", rp->siz); } + 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); } qsort(r, n, sizeof r[0], rbyoff); // just in case diff --git a/src/liblink/pass.c b/src/liblink/pass.c index 3fe77d61bf1..ed27749915b 100644 --- a/src/liblink/pass.c +++ b/src/liblink/pass.c @@ -79,7 +79,8 @@ linkpatch(Link *ctxt, LSym *sym) ctxt->arch->progedit(ctxt, p); if(p->as == ctxt->arch->ACALL || (p->as == ctxt->arch->AJMP && p->to.type != ctxt->arch->D_BRANCH) || (p->as == ctxt->arch->ARET && p->to.sym != nil)) { s = p->to.sym; - if(s) { + // The STEXT check avoids rewriting indirect call to addr in memory on x86. + if(s && s->type == STEXT) { p->to.type = ctxt->arch->D_BRANCH; continue; }