]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/ld: fix linux/386 build
authorRuss Cox <rsc@golang.org>
Mon, 9 Dec 2013 15:42:55 +0000 (07:42 -0800)
committerRuss Cox <rsc@golang.org>
Mon, 9 Dec 2013 15:42:55 +0000 (07:42 -0800)
TBR=iant
CC=golang-dev
https://golang.org/cl/39400044

src/cmd/ld/data.c
src/cmd/ld/ldelf.c
src/liblink/pass.c

index ac28041fbba7941dfe082879fdd5128179f44376..9b799fe0b232a2f5a222c38e889c5354f657b1bb 100644 (file)
@@ -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 : "<nil>", (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 : "<nil>", (uvlong)symaddr(r->sym), (vlong)r->add, (vlong)o);
                switch(siz) {
                default:
                        ctxt->cursym = s;
index 4bc830ef32120a4327b2bee6e18d4d01eac27a14..f1091d57c3910797c821b3b6bf34050843a87ac5 100644 (file)
@@ -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
                
index 3fe77d61bf111d8e41394471d4520b5dcc8645b9..ed27749915b9dc72b68494889b297f3879199261 100644 (file)
@@ -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;
                        }