diff options
Diffstat (limited to 'src/cmd/6l')
-rw-r--r-- | src/cmd/6l/l.h | 1 | ||||
-rw-r--r-- | src/cmd/6l/obj.c | 8 |
2 files changed, 9 insertions, 0 deletions
diff --git a/src/cmd/6l/l.h b/src/cmd/6l/l.h index faf5025a8..b9e8dd37a 100644 --- a/src/cmd/6l/l.h +++ b/src/cmd/6l/l.h @@ -113,6 +113,7 @@ struct Sym short become; short frame; uchar subtype; + uchar dupok; ushort file; vlong value; int32 sig; diff --git a/src/cmd/6l/obj.c b/src/cmd/6l/obj.c index 8c001e748..bc7413fe1 100644 --- a/src/cmd/6l/obj.c +++ b/src/cmd/6l/obj.c @@ -972,6 +972,8 @@ loop: } if(p->to.offset > s->value) s->value = p->to.offset; + if(p->from.scale & DUPOK) + s->dupok = 1; goto loop; case ADYNT: @@ -1017,6 +1019,12 @@ loop: case ADATA: data: + // Assume that AGLOBL comes after ADATA. + // If we've seen an AGLOBL that said this sym was DUPOK, + // ignore any more ADATA we see, which must be + // redefinitions. + if(p->from.sym != S && p->from.sym->dupok) + goto loop; if(edatap == P) datap = p; else |