ref: b709b8fa6bd37944b2e0a53bef8df2fca5e9519e
parent: 65120a98fb3d4d914f79cc66dc425d7d4d81c666
author: Roberto E. Vargas Caballero <k0ga@shike2.com>
date: Sun Feb 10 17:02:00 EST 2019
[ld] Several fixes
--- a/src/cmd/ld/main.c
+++ b/src/cmd/ld/main.c
@@ -199,6 +199,14 @@
return;
}
+ if (bintype == -1) {
+ bintype = type;
+ } else if (bintype != type) {
+ error("not compatible object file");
+ return;
+ }
+ bintype = type;
+
if (objread(obj, fp) < 0) {
error("object file corrupted");
goto delete;
@@ -225,7 +233,7 @@
static void
loadlib(FILE *fp)
{
- int t;
+ int t, loaded;
long n;
Objsymdef *def, *dp;
Symbol *sym, *p;
@@ -235,39 +243,34 @@
return;
}
-repeat:
p = &refhead;
- if (p->next == p)
- goto clean;
+ for (loaded = 0; p->next != p; loaded = 0) {
+ for (dp = def; dp; dp = dp->next) {
+ sym = lookup(dp->name, NOINSTALL);
+ if (!sym || !sym->def)
+ continue;
- for (dp = def; dp; dp = dp->next) {
- if ((sym = lookup(dp->name, NOINSTALL)) == NULL)
- continue;
- if (!sym->def)
- break;
- }
+ if (fseek(fp, dp->offset, SEEK_SET) == EOF) {
+ error(errstr());
+ break;
+ }
- if (!dp)
- goto clean;
+ if ((t = objtype(fp, NULL)) == -1) {
+ error("library file corrupted");
+ break;
+ }
- if (fseek(fp, dp->offset, SEEK_SET) == EOF) {
- error(errstr());
- goto clean;
- }
+ if (t != bintype) {
+ error("incompatible library");
+ break;
+ }
- if ((t = objtype(fp, NULL)) == -1) {
- error("library file corrupted");
- goto clean;
+ newobject(fp, t, OUTLIB);
+ loaded = 1;
+ }
+ if (!loaded)
+ break;
}
-
- if (t != bintype) {
- error("incompatible library");
- goto clean;
- }
-
- newobject(fp, t, OUTLIB);
- goto repeat;
-
clean:
free(def);
}