]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/ld: change GC_CALL to 32-bit relative address
authorRuss Cox <rsc@golang.org>
Wed, 27 Feb 2013 03:42:56 +0000 (19:42 -0800)
committerRuss Cox <rsc@golang.org>
Wed, 27 Feb 2013 03:42:56 +0000 (19:42 -0800)
The current code uses 64-bit pc-relative on 64-bit systems,
but in ELF linkers there is no such thing, so we cannot
express this in a .o file. Change to 32-bit.

R=golang-dev, iant
CC=golang-dev
https://golang.org/cl/7383055

src/cmd/ld/data.c
src/pkg/runtime/mgc0.c

index e4d16fdc1f1d932c23f56cf8d4e1fc19f1308460..1e0bd2cd0fec7119a01f72fea7b8f1dd4d8058eb 100644 (file)
@@ -748,27 +748,6 @@ setuint64(Sym *s, vlong r, uint64 v)
        setuintxx(s, r, v, 8);
 }
 
-static vlong
-addaddrpcrelplus(Sym *s, Sym *t, int32 add)
-{
-       vlong i;
-       Reloc *r;
-
-       if(s->type == 0)
-               s->type = SDATA;
-       s->reachable = 1;
-       i = s->size;
-       s->size += PtrSize;
-       symgrow(s, s->size);
-       r = addrel(s);
-       r->sym = t;
-       r->off = i;
-       r->siz = PtrSize;
-       r->type = D_PCREL;
-       r->add = add;
-       return i;
-}
-
 vlong
 addaddrplus(Sym *s, Sym *t, int32 add)
 {
@@ -949,7 +928,9 @@ gcaddsym(Sym *gc, Sym *s, int32 off)
                //print("gcaddsym:    %s    %d    %s\n", s->name, s->size, gotype->name);
                adduintxx(gc, GC_CALL, PtrSize);
                adduintxx(gc, off, PtrSize);
-               addaddrpcrelplus(gc, decodetype_gc(gotype), 4*PtrSize);
+               addpcrelplus(gc, decodetype_gc(gotype), 3*PtrSize+4);
+               if(PtrSize == 8)
+                       adduintxx(gc, 0, 4);
        } else {
                //print("gcaddsym:    %s    %d    <unknown type>\n", s->name, s->size);
                for(a = -off&(PtrSize-1); a+PtrSize<=s->size; a+=PtrSize) {
index b2ed693c6599e7e3d4133a5d1a0b0514d992c7dd..e9d5d301b81347aac568ca9fa44722dce2937c27 100644 (file)
@@ -837,7 +837,7 @@ scanblock(Workbuf *wbuf, Obj *wp, uintptr nobj, bool keepworking)
                        // Stack push.
                        *stack_ptr-- = stack_top;
                        stack_top = (Frame){1, 0, stack_top.b + pc[1], pc+3 /*return address*/};
-                       pc = (uintptr*)((byte*)pc + (uintptr)pc[2]);  // target of the CALL instruction
+                       pc = (uintptr*)((byte*)pc + *(int32*)(pc+2));  // target of the CALL instruction
                        continue;
 
                case GC_MAP_PTR: