From: Russ Cox Date: Tue, 20 May 2014 04:30:58 +0000 (-0400) Subject: liblink: fix field tracking X-Git-Tag: go1.3beta2~19 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=d9c9665f1dcd09b0e315c9437d192fed795587a5;p=gostls13.git liblink: fix field tracking The USEFIELD instructions no longer make it to the linker, so we have to do something else to pin the references they were pinning. Emit a 0-length relocation of type R_USEFIELD. Fixes #7486. LGTM=iant R=golang-codereviews, iant CC=golang-codereviews, r https://golang.org/cl/95530043 --- diff --git a/include/link.h b/include/link.h index 044849254f..248497888e 100644 --- a/include/link.h +++ b/include/link.h @@ -243,6 +243,7 @@ enum R_PLT0, R_PLT1, R_PLT2, + R_USEFIELD, }; // Auto.type diff --git a/src/liblink/asm6.c b/src/liblink/asm6.c index 2c719a7758..66afc7a12a 100644 --- a/src/liblink/asm6.c +++ b/src/liblink/asm6.c @@ -3443,6 +3443,15 @@ asmins(Link *ctxt, Prog *p) ctxt->andptr = ctxt->and; ctxt->asmode = p->mode; + if(p->as == AUSEFIELD) { + r = addrel(ctxt->cursym); + r->off = 0; + r->siz = 0; + r->sym = p->from.sym; + r->type = R_USEFIELD; + return; + } + if(ctxt->headtype == Hnacl) { if(p->as == AREP) { ctxt->rep++; diff --git a/src/liblink/asm8.c b/src/liblink/asm8.c index 39bd5bae10..3ab527ce89 100644 --- a/src/liblink/asm8.c +++ b/src/liblink/asm8.c @@ -2744,7 +2744,18 @@ static uchar naclret[] = { static void asmins(Link *ctxt, Prog *p) { + Reloc *r; + ctxt->andptr = ctxt->and; + + if(p->as == AUSEFIELD) { + r = addrel(ctxt->cursym); + r->off = 0; + r->sym = p->from.sym; + r->type = R_USEFIELD; + r->siz = 0; + return; + } if(ctxt->headtype == Hnacl) { switch(p->as) {