free (temp);
read_object_file (name, pos + sizeof (*hdr), data_size);
-
- memcpy (pos, ALREADY_READ, sizeof (ALREADY_READ));
free (name);
+ memcpy (pos, ALREADY_READ, sizeof (ALREADY_READ));
change = 1;
}
if (!(symbol = symbol_find (symbol->name))) {
symbol = of->symbol_arr + i;
+
report_at (program_name, 0, REPORT_INTERNAL_ERROR, "external symbol '%s' not found in hashtab", symbol->name);
+ exit (EXIT_FAILURE);
}
}
if (unresolved) {
+
report_at (program_name, 0, REPORT_FATAL_ERROR, "%lu unresolved external%s", unresolved, (unresolved > 1 ? "s" : ""));
+ exit (EXIT_FAILURE);
+
}
}
struct reloc_entry *relocs = part->reloc_arr;
struct symbol *symbol;
- unsigned long i;
+ unsigned long undef = 0, i;
for (i = 0; i < part->reloc_cnt; i++) {
if (!(symbol = symbol_find (symbol->name))) {
symbol = relocs[i].symbol;
+
report_at (program_name, 0, REPORT_INTERNAL_ERROR, "external symbol '%s' not found in hashtab", symbol->name);
+ exit (EXIT_FAILURE);
}
if (symbol_is_undefined (symbol)) {
report_at (program_name, 0, REPORT_ERROR, "%s:(%s+%#lu): undefined reference to '%s'", part->of->filename, part->section->name, relocs[i].offset, symbol->name);
+ undef++;
+
continue;
}
reloc_generic (part, &relocs[i], symbol);
}
+
+ if (undef) { exit (EXIT_FAILURE); }
}