diff options
Diffstat (limited to 'src/liblink')
| -rw-r--r-- | src/liblink/objfile.c | 23 | ||||
| -rw-r--r-- | src/liblink/sym.c | 2 |
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; |
