Commit d9c9665f authored by Russ Cox's avatar Russ Cox

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
parent 6aee2964
...@@ -243,6 +243,7 @@ enum ...@@ -243,6 +243,7 @@ enum
R_PLT0, R_PLT0,
R_PLT1, R_PLT1,
R_PLT2, R_PLT2,
R_USEFIELD,
}; };
// Auto.type // Auto.type
......
...@@ -3443,6 +3443,15 @@ asmins(Link *ctxt, Prog *p) ...@@ -3443,6 +3443,15 @@ asmins(Link *ctxt, Prog *p)
ctxt->andptr = ctxt->and; ctxt->andptr = ctxt->and;
ctxt->asmode = p->mode; 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(ctxt->headtype == Hnacl) {
if(p->as == AREP) { if(p->as == AREP) {
ctxt->rep++; ctxt->rep++;
......
...@@ -2744,7 +2744,18 @@ static uchar naclret[] = { ...@@ -2744,7 +2744,18 @@ static uchar naclret[] = {
static void static void
asmins(Link *ctxt, Prog *p) asmins(Link *ctxt, Prog *p)
{ {
Reloc *r;
ctxt->andptr = ctxt->and; 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) { if(ctxt->headtype == Hnacl) {
switch(p->as) { switch(p->as) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment