aboutsummaryrefslogtreecommitdiff
path: root/src/liblink
diff options
context:
space:
mode:
Diffstat (limited to 'src/liblink')
-rw-r--r--src/liblink/objfile.c23
-rw-r--r--src/liblink/sym.c2
2 files changed, 18 insertions, 7 deletions
diff --git a/src/liblink/objfile.c b/src/liblink/objfile.c
index c7700cc25c..b52b29ca59 100644
--- a/src/liblink/objfile.c
+++ b/src/liblink/objfile.c
@@ -167,6 +167,9 @@ linkwriteobj(Link *ctxt, Biobuf *b)
s = p->from.sym;
if(s->seenglobl++)
print("duplicate %P\n", p);
+ if(s->onlist)
+ sysfatal("symbol %s listed multiple times", s->name);
+ s->onlist = 1;
if(data == nil)
data = s;
else
@@ -205,6 +208,9 @@ linkwriteobj(Link *ctxt, Biobuf *b)
}
if(s->text != nil)
sysfatal("duplicate TEXT for %s", s->name);
+ if(s->onlist)
+ sysfatal("symbol %s listed multiple times", s->name);
+ s->onlist = 1;
if(text == nil)
text = s;
else
@@ -518,7 +524,7 @@ readsym(Link *ctxt, Biobuf *f, char *pkg, char *pn)
sysfatal("duplicate symbol %s (types %d and %d) in %s and %s", s->name, s->type, t, s->file, pn);
if(s->np > 0) {
dup = s;
- s = linklookup(ctxt, ".dup", ndup++); // scratch
+ s = linknewsym(ctxt, ".dup", ndup++); // scratch
}
}
s->file = pkg;
@@ -595,11 +601,16 @@ readsym(Link *ctxt, Biobuf *f, char *pkg, char *pn)
for(i=0; i<n; i++)
pc->file[i] = rdsym(ctxt, f, pkg);
- if(ctxt->etextp)
- ctxt->etextp->next = s;
- else
- ctxt->textp = s;
- ctxt->etextp = s;
+ if(dup == nil) {
+ if(s->onlist)
+ sysfatal("symbol %s listed multiple times", s->name);
+ s->onlist = 1;
+ if(ctxt->etextp)
+ ctxt->etextp->next = s;
+ else
+ ctxt->textp = s;
+ ctxt->etextp = s;
+ }
}
if(ctxt->debugasm) {
diff --git a/src/liblink/sym.c b/src/liblink/sym.c
index ff51b3df89..cba50e9c7e 100644
--- a/src/liblink/sym.c
+++ b/src/liblink/sym.c
@@ -232,7 +232,7 @@ _lookup(Link *ctxt, char *symb, int v, int creat)
h &= 0xffffff;
h %= LINKHASH;
for(s = ctxt->hash[h]; s != nil; s = s->hash)
- if(strcmp(s->name, symb) == 0)
+ if(s->version == v && strcmp(s->name, symb) == 0)
return s;
if(!creat)
return nil;