aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/cmd/ld/data.c3
-rw-r--r--src/cmd/ld/go.c1
-rw-r--r--src/cmd/ld/ldelf.c6
-rw-r--r--src/cmd/ld/ldmacho.c6
-rw-r--r--src/cmd/ld/ldpe.c6
-rw-r--r--src/liblink/objfile.c23
-rw-r--r--src/liblink/sym.c2
7 files changed, 40 insertions, 7 deletions
diff --git a/src/cmd/ld/data.c b/src/cmd/ld/data.c
index 27779acc63..e5739686ef 100644
--- a/src/cmd/ld/data.c
+++ b/src/cmd/ld/data.c
@@ -757,6 +757,9 @@ dodata(void)
if(!s->reachable || s->special)
continue;
if(STEXT < s->type && s->type < SXREF) {
+ if(s->onlist)
+ sysfatal("symbol %s listed multiple times", s->name);
+ s->onlist = 1;
if(last == nil)
datap = s;
else
diff --git a/src/cmd/ld/go.c b/src/cmd/ld/go.c
index a5a0fa5433..9c296b740f 100644
--- a/src/cmd/ld/go.c
+++ b/src/cmd/ld/go.c
@@ -618,6 +618,7 @@ deadcode(void)
for(s = ctxt->textp; s != nil; s = s->next) {
if(!s->reachable)
continue;
+ // NOTE: Removing s from old textp and adding to new, shorter textp.
if(last == nil)
ctxt->textp = s;
else
diff --git a/src/cmd/ld/ldelf.c b/src/cmd/ld/ldelf.c
index f1091d57c3..75899c769f 100644
--- a/src/cmd/ld/ldelf.c
+++ b/src/cmd/ld/ldelf.c
@@ -631,12 +631,18 @@ ldelf(Biobuf *f, char *pkg, int64 len, char *pn)
if(s->sub)
s->sub = listsort(s->sub, valuecmp, offsetof(LSym, sub));
if(s->type == STEXT) {
+ 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;
for(s = s->sub; s != S; s = s->sub) {
+ if(s->onlist)
+ sysfatal("symbol %s listed multiple times", s->name);
+ s->onlist = 1;
ctxt->etextp->next = s;
ctxt->etextp = s;
}
diff --git a/src/cmd/ld/ldmacho.c b/src/cmd/ld/ldmacho.c
index 7fd366a258..00d0acd221 100644
--- a/src/cmd/ld/ldmacho.c
+++ b/src/cmd/ld/ldmacho.c
@@ -679,12 +679,18 @@ ldmacho(Biobuf *f, char *pkg, int64 len, char *pn)
}
}
if(s->type == STEXT) {
+ 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;
for(s1 = s->sub; s1 != S; s1 = s1->sub) {
+ if(s1->onlist)
+ sysfatal("symbol %s listed multiple times", s1->name);
+ s1->onlist = 1;
ctxt->etextp->next = s1;
ctxt->etextp = s1;
}
diff --git a/src/cmd/ld/ldpe.c b/src/cmd/ld/ldpe.c
index 1f1a51fad1..e4e3580b09 100644
--- a/src/cmd/ld/ldpe.c
+++ b/src/cmd/ld/ldpe.c
@@ -393,12 +393,18 @@ ldpe(Biobuf *f, char *pkg, int64 len, char *pn)
if(s->sub)
s->sub = listsort(s->sub, valuecmp, offsetof(LSym, sub));
if(s->type == STEXT) {
+ 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;
for(s = s->sub; s != S; s = s->sub) {
+ if(s->onlist)
+ sysfatal("symbol %s listed multiple times", s->name);
+ s->onlist = 1;
ctxt->etextp->next = s;
ctxt->etextp = s;
}
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;