mirror of
https://github.com/golang/go
synced 2024-11-26 05:37:57 -07:00
cmd/ld: change GC_CALL to 32-bit relative address
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
This commit is contained in:
parent
c8dcaeb25d
commit
56a06db360
@ -748,27 +748,6 @@ setuint64(Sym *s, vlong r, uint64 v)
|
|||||||
setuintxx(s, r, v, 8);
|
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
|
vlong
|
||||||
addaddrplus(Sym *s, Sym *t, int32 add)
|
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);
|
//print("gcaddsym: %s %d %s\n", s->name, s->size, gotype->name);
|
||||||
adduintxx(gc, GC_CALL, PtrSize);
|
adduintxx(gc, GC_CALL, PtrSize);
|
||||||
adduintxx(gc, off, 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 {
|
} else {
|
||||||
//print("gcaddsym: %s %d <unknown type>\n", s->name, s->size);
|
//print("gcaddsym: %s %d <unknown type>\n", s->name, s->size);
|
||||||
for(a = -off&(PtrSize-1); a+PtrSize<=s->size; a+=PtrSize) {
|
for(a = -off&(PtrSize-1); a+PtrSize<=s->size; a+=PtrSize) {
|
||||||
|
@ -837,7 +837,7 @@ scanblock(Workbuf *wbuf, Obj *wp, uintptr nobj, bool keepworking)
|
|||||||
// Stack push.
|
// Stack push.
|
||||||
*stack_ptr-- = stack_top;
|
*stack_ptr-- = stack_top;
|
||||||
stack_top = (Frame){1, 0, stack_top.b + pc[1], pc+3 /*return address*/};
|
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;
|
continue;
|
||||||
|
|
||||||
case GC_MAP_PTR:
|
case GC_MAP_PTR:
|
||||||
|
Loading…
Reference in New Issue
Block a user