diag("multiple initialization for %s: in both %s and %s", s->name, s->file, pn);
errorexit();
}
- savedata(s, p);
+ savedata(s, p, pn);
unmal(p, sizeof *p);
break;
return;
}
}
+
+ switch(t) {
+ case D_FILE:
+ case D_FILE1:
+ case D_AUTO:
+ case D_PARAM:
+ if(s == S)
+ mangle(pn);
+ }
u = mal(sizeof(*u));
u->link = curauto;
diag("multiple initialization for %s: in both %s and %s", s->name, s->file, pn);
errorexit();
}
- savedata(s, p);
+ savedata(s, p, pn);
unmal(p, sizeof *p);
goto loop;
diag("multiple initialization for %s: in both %s and %s", s->name, s->file, pn);
errorexit();
}
- savedata(s, p);
+ savedata(s, p, pn);
unmal(p, sizeof *p);
goto loop;
}
void
-savedata(Sym *s, Prog *p)
+savedata(Sym *s, Prog *p, char *pn)
{
int32 off, siz, i, fl;
uchar *cast;
off = p->from.offset;
siz = p->datasize;
+ if(off < 0 || siz < 0 || off >= 1<<30 || siz >= 100)
+ mangle(pn);
symgrow(s, off+siz);
-
+
switch(p->to.type) {
default:
diag("bad data: %P", p);
return;
}
t = smprint("%s %s %s", getgoos(), thestring, getgoversion());
- if(strcmp(line+10, t) != 0) {
+ if(strcmp(line+10, t) != 0 && !debug['f']) {
diag("%s: object is [%s] expected [%s]", pn, line+10, t);
free(t);
return;
Sym* datsort(Sym*);
void reloc(void);
void relocsym(Sym*);
-void savedata(Sym*, Prog*);
+void savedata(Sym*, Prog*, char*);
void symgrow(Sym*, int32);
vlong addstring(Sym*, char*);
vlong adduint32(Sym*, uint32);