summaryrefslogtreecommitdiff
path: root/src/cmd/6l
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd/6l')
-rw-r--r--src/cmd/6l/l.h1
-rw-r--r--src/cmd/6l/obj.c8
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