Downgrade objdump fatal errors to non-fatal

* objdump.c (slurp_symtab): Replace bfd_fatal calls with calls
	to my_bfd_nonfatal.
	(slurp_dynamic_symtab, disassemble_section): Likewise.
	(disassemble_data): Replace fatal call with non_fatal call, and
	set exit_status.  Don't error on non-existent dynamic relocs.
	Don't call bfd_fatal on bfd_canonicalize_dynamic_reloc error.
	(dump_ctf, dump_section_sframe): Replace bfd_fatal calls with
	calls to my_bfd_nonfatal and clean up memory.
	(dump_relocs_in_section): Don't call bfd_fatal on errors.
	(dump_dynamic_relocs): Likewise.
	(display_any_bfd): Make archive nesting too depp non_fatal.
This commit is contained in:
Alan Modra 2023-03-06 10:43:08 +10:30
parent 5db0367e1b
commit ffdfc835dd

View file

@ -1002,16 +1002,20 @@ slurp_symtab (bfd *abfd)
{ {
non_fatal (_("failed to read symbol table from: %s"), non_fatal (_("failed to read symbol table from: %s"),
bfd_get_filename (abfd)); bfd_get_filename (abfd));
bfd_fatal (_("error message was")); my_bfd_nonfatal (_("error message was"));
} }
if (storage == 0) if (storage <= 0)
return NULL; return NULL;
asymbol **sy = (asymbol **) xmalloc (storage); asymbol **sy = (asymbol **) xmalloc (storage);
symcount = bfd_canonicalize_symtab (abfd, sy); symcount = bfd_canonicalize_symtab (abfd, sy);
if (symcount < 0) if (symcount < 0)
bfd_fatal (bfd_get_filename (abfd)); {
my_bfd_nonfatal (bfd_get_filename (abfd));
free (sy);
sy = NULL;
}
return sy; return sy;
} }
@ -1031,16 +1035,20 @@ slurp_dynamic_symtab (bfd *abfd)
return NULL; return NULL;
} }
bfd_fatal (bfd_get_filename (abfd)); my_bfd_nonfatal (bfd_get_filename (abfd));
} }
if (storage == 0) if (storage <= 0)
return NULL; return NULL;
asymbol **sy = (asymbol **) xmalloc (storage); asymbol **sy = (asymbol **) xmalloc (storage);
dynsymcount = bfd_canonicalize_dynamic_symtab (abfd, sy); dynsymcount = bfd_canonicalize_dynamic_symtab (abfd, sy);
if (dynsymcount < 0) if (dynsymcount < 0)
bfd_fatal (bfd_get_filename (abfd)); {
my_bfd_nonfatal (bfd_get_filename (abfd));
free (sy);
sy = NULL;
}
return sy; return sy;
} }
@ -3747,17 +3755,23 @@ disassemble_section (bfd *abfd, asection *section, void *inf)
relsize = bfd_get_reloc_upper_bound (abfd, section); relsize = bfd_get_reloc_upper_bound (abfd, section);
if (relsize < 0) if (relsize < 0)
bfd_fatal (bfd_get_filename (abfd)); my_bfd_nonfatal (bfd_get_filename (abfd));
if (relsize > 0) if (relsize > 0)
{ {
rel_ppstart = rel_pp = (arelent **) xmalloc (relsize); rel_pp = (arelent **) xmalloc (relsize);
rel_count = bfd_canonicalize_reloc (abfd, section, rel_pp, syms); rel_count = bfd_canonicalize_reloc (abfd, section, rel_pp, syms);
if (rel_count < 0) if (rel_count < 0)
bfd_fatal (bfd_get_filename (abfd)); {
my_bfd_nonfatal (bfd_get_filename (abfd));
free (rel_pp);
rel_pp = NULL;
rel_count = 0;
}
else if (rel_count > 1)
/* Sort the relocs by address. */ /* Sort the relocs by address. */
qsort (rel_pp, rel_count, sizeof (arelent *), compare_relocs); qsort (rel_pp, rel_count, sizeof (arelent *), compare_relocs);
rel_ppstart = rel_pp;
} }
} }
} }
@ -4103,8 +4117,11 @@ disassemble_data (bfd *abfd)
const bfd_arch_info_type *inf = bfd_scan_arch (machine); const bfd_arch_info_type *inf = bfd_scan_arch (machine);
if (inf == NULL) if (inf == NULL)
fatal (_("can't use supplied machine %s"), machine); {
non_fatal (_("can't use supplied machine %s"), machine);
exit_status = 1;
}
else
abfd->arch_info = inf; abfd->arch_info = inf;
} }
@ -4156,20 +4173,22 @@ disassemble_data (bfd *abfd)
/* Pre-load the dynamic relocs as we may need them during the disassembly. */ /* Pre-load the dynamic relocs as we may need them during the disassembly. */
long relsize = bfd_get_dynamic_reloc_upper_bound (abfd); long relsize = bfd_get_dynamic_reloc_upper_bound (abfd);
if (relsize < 0 && dump_dynamic_reloc_info)
bfd_fatal (bfd_get_filename (abfd));
if (relsize > 0) if (relsize > 0)
{ {
disasm_info.dynrelbuf = (arelent **) xmalloc (relsize); disasm_info.dynrelbuf = (arelent **) xmalloc (relsize);
disasm_info.dynrelcount disasm_info.dynrelcount
= bfd_canonicalize_dynamic_reloc (abfd, disasm_info.dynrelbuf, dynsyms); = bfd_canonicalize_dynamic_reloc (abfd, disasm_info.dynrelbuf, dynsyms);
if (disasm_info.dynrelcount < 0) if (disasm_info.dynrelcount < 0)
bfd_fatal (bfd_get_filename (abfd)); {
my_bfd_nonfatal (bfd_get_filename (abfd));
free (disasm_info.dynrelbuf);
disasm_info.dynrelbuf = NULL;
disasm_info.dynrelcount = 0;
}
else if (disasm_info.dynrelcount > 1)
/* Sort the relocs by address. */ /* Sort the relocs by address. */
qsort (disasm_info.dynrelbuf, disasm_info.dynrelcount, sizeof (arelent *), qsort (disasm_info.dynrelbuf, disasm_info.dynrelcount,
compare_relocs); sizeof (arelent *), compare_relocs);
} }
disasm_info.symtab = sorted_syms; disasm_info.symtab = sorted_syms;
@ -4789,7 +4808,10 @@ dump_ctf (bfd *abfd, const char *sect_name, const char *parent_name)
sec = read_section (abfd, sect_name, &ctfdata); sec = read_section (abfd, sect_name, &ctfdata);
if (sec == NULL) if (sec == NULL)
bfd_fatal (bfd_get_filename (abfd)); {
my_bfd_nonfatal (bfd_get_filename (abfd));
return;
}
/* Load the CTF file and dump it. Preload the parent dict, since it will /* Load the CTF file and dump it. Preload the parent dict, since it will
need to be imported into every child in turn. */ need to be imported into every child in turn. */
@ -4799,14 +4821,19 @@ dump_ctf (bfd *abfd, const char *sect_name, const char *parent_name)
{ {
dump_ctf_errs (NULL); dump_ctf_errs (NULL);
non_fatal (_("CTF open failure: %s"), ctf_errmsg (err)); non_fatal (_("CTF open failure: %s"), ctf_errmsg (err));
bfd_fatal (bfd_get_filename (abfd)); my_bfd_nonfatal (bfd_get_filename (abfd));
free (ctfdata);
return;
} }
if ((parent = ctf_dict_open (ctfa, parent_name, &err)) == NULL) if ((parent = ctf_dict_open (ctfa, parent_name, &err)) == NULL)
{ {
dump_ctf_errs (NULL); dump_ctf_errs (NULL);
non_fatal (_("CTF open failure: %s"), ctf_errmsg (err)); non_fatal (_("CTF open failure: %s"), ctf_errmsg (err));
bfd_fatal (bfd_get_filename (abfd)); my_bfd_nonfatal (bfd_get_filename (abfd));
ctf_close (ctfa);
free (ctfdata);
return;
} }
printf (_("Contents of CTF section %s:\n"), sanitize_string (sect_name)); printf (_("Contents of CTF section %s:\n"), sanitize_string (sect_name));
@ -4817,7 +4844,7 @@ dump_ctf (bfd *abfd, const char *sect_name, const char *parent_name)
{ {
dump_ctf_errs (NULL); dump_ctf_errs (NULL);
non_fatal (_("CTF archive member open failure: %s"), ctf_errmsg (err)); non_fatal (_("CTF archive member open failure: %s"), ctf_errmsg (err));
bfd_fatal (bfd_get_filename (abfd)); my_bfd_nonfatal (bfd_get_filename (abfd));
} }
ctf_dict_close (parent); ctf_dict_close (parent);
ctf_close (ctfa); ctf_close (ctfa);
@ -4845,7 +4872,10 @@ dump_section_sframe (bfd *abfd ATTRIBUTE_UNUSED,
sec = read_section (abfd, sect_name, &sframe_data); sec = read_section (abfd, sect_name, &sframe_data);
if (sec == NULL) if (sec == NULL)
bfd_fatal (bfd_get_filename (abfd)); {
my_bfd_nonfatal (bfd_get_filename (abfd));
return;
}
sf_size = bfd_section_size (sec); sf_size = bfd_section_size (sec);
sf_vma = bfd_section_vma (sec); sf_vma = bfd_section_vma (sec);
@ -4853,8 +4883,9 @@ dump_section_sframe (bfd *abfd ATTRIBUTE_UNUSED,
sfd_ctx = sframe_decode ((const char*)sframe_data, sf_size, &err); sfd_ctx = sframe_decode ((const char*)sframe_data, sf_size, &err);
if (!sfd_ctx) if (!sfd_ctx)
{ {
my_bfd_nonfatal (bfd_get_filename (abfd));
free (sframe_data); free (sframe_data);
bfd_fatal (bfd_get_filename (abfd)); return;
} }
printf (_("Contents of the SFrame section %s:"), printf (_("Contents of the SFrame section %s:"),
@ -4862,8 +4893,8 @@ dump_section_sframe (bfd *abfd ATTRIBUTE_UNUSED,
/* Dump the contents as text. */ /* Dump the contents as text. */
dump_sframe (sfd_ctx, sf_vma); dump_sframe (sfd_ctx, sf_vma);
free (sframe_data);
sframe_decoder_free (&sfd_ctx); sframe_decoder_free (&sfd_ctx);
free (sframe_data);
} }
@ -5334,7 +5365,7 @@ dump_relocs_in_section (bfd *abfd,
asection *section, asection *section,
void *dummy ATTRIBUTE_UNUSED) void *dummy ATTRIBUTE_UNUSED)
{ {
arelent **relpp = NULL; arelent **relpp;
long relcount; long relcount;
long relsize; long relsize;
@ -5355,7 +5386,10 @@ dump_relocs_in_section (bfd *abfd,
} }
if (relsize < 0) if (relsize < 0)
{
relpp = NULL;
relcount = relsize; relcount = relsize;
}
else else
{ {
relpp = (arelent **) xmalloc (relsize); relpp = (arelent **) xmalloc (relsize);
@ -5367,7 +5401,7 @@ dump_relocs_in_section (bfd *abfd,
printf ("\n"); printf ("\n");
non_fatal (_("failed to read relocs in: %s"), non_fatal (_("failed to read relocs in: %s"),
sanitize_string (bfd_get_filename (abfd))); sanitize_string (bfd_get_filename (abfd)));
bfd_fatal (_("error message was")); my_bfd_nonfatal (_("error message was"));
} }
else if (relcount == 0) else if (relcount == 0)
printf (" (none)\n\n"); printf (" (none)\n\n");
@ -5394,20 +5428,33 @@ dump_dynamic_relocs (bfd *abfd)
long relcount; long relcount;
relsize = bfd_get_dynamic_reloc_upper_bound (abfd); relsize = bfd_get_dynamic_reloc_upper_bound (abfd);
if (relsize < 0)
bfd_fatal (bfd_get_filename (abfd));
printf ("DYNAMIC RELOCATION RECORDS"); printf ("DYNAMIC RELOCATION RECORDS");
if (relsize == 0) if (relsize == 0)
{
printf (" (none)\n\n"); printf (" (none)\n\n");
return;
}
if (relsize < 0)
{
relpp = NULL;
relcount = relsize;
}
else else
{ {
relpp = (arelent **) xmalloc (relsize); relpp = (arelent **) xmalloc (relsize);
relcount = bfd_canonicalize_dynamic_reloc (abfd, relpp, dynsyms); relcount = bfd_canonicalize_dynamic_reloc (abfd, relpp, dynsyms);
}
if (relcount < 0) if (relcount < 0)
bfd_fatal (bfd_get_filename (abfd)); {
printf ("\n");
non_fatal (_("failed to read relocs in: %s"),
sanitize_string (bfd_get_filename (abfd)));
my_bfd_nonfatal (_("error message was"));
}
else if (relcount == 0) else if (relcount == 0)
printf (" (none)\n\n"); printf (" (none)\n\n");
else else
@ -5417,7 +5464,6 @@ dump_dynamic_relocs (bfd *abfd)
printf ("\n\n"); printf ("\n\n");
} }
free (relpp); free (relpp);
}
} }
/* Creates a table of paths, to search for source files. */ /* Creates a table of paths, to search for source files. */
@ -5743,7 +5789,8 @@ display_any_bfd (bfd *file, int level)
{ {
/* Prevent corrupted files from spinning us into an /* Prevent corrupted files from spinning us into an
infinite loop. 100 is an arbitrary heuristic. */ infinite loop. 100 is an arbitrary heuristic. */
fatal (_("Archive nesting is too deep")); non_fatal (_("Archive nesting is too deep"));
exit_status = 1;
return; return;
} }
else else