aboutsummaryrefslogtreecommitdiff
path: root/bfd/elf.c
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2019-11-18 12:31:55 +1030
committerAlan Modra <amodra@gmail.com>2019-11-18 22:06:09 +1030
commit9aea1e31371a883452e80bd96e8818289c3e6b6e (patch)
treec1a28a6b86dfa423cef5cb9cc6057deb8df83264 /bfd/elf.c
parent66f8b2cbbb675ccbcae56e2bdb6dae485878ec00 (diff)
downloadfsf-binutils-gdb-9aea1e31371a883452e80bd96e8818289c3e6b6e.zip
fsf-binutils-gdb-9aea1e31371a883452e80bd96e8818289c3e6b6e.tar.gz
fsf-binutils-gdb-9aea1e31371a883452e80bd96e8818289c3e6b6e.tar.bz2
PR25196, abort in rewrite_elf_program_header
This patch introduces a new "sorry, cannot handle this file" bfd error status. The idea is to use this error in cases where bfd hasn't found a bfd_bad_value error, ie. an input file or set of options that are invalid, but rather an input file that is simply too difficult to process. Typically this might happen with fuzzed object files such as the one in the PR, a wildly improbable core file. Some things are just not worth wasting time over to fix "properly". PR 25196 * bfd.c (bfd_error_type): Add bfd_error_sorry. (bfd_errmsgs): Likewise. * elf.c (rewrite_elf_program_header): Don't abort on confused lma/alignment. Replace bfd_error_bad_value with bfd_error_sorry. (_bfd_elf_validate_reloc): Use bfd_error_sorry. (_bfd_elf_final_write_processing): Likewise. * bfd-in2.h: Regenerate.
Diffstat (limited to 'bfd/elf.c')
-rw-r--r--bfd/elf.c9
1 files changed, 5 insertions, 4 deletions
diff --git a/bfd/elf.c b/bfd/elf.c
index be060d5..e100998 100644
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -7324,7 +7324,7 @@ rewrite_elf_program_header (bfd *ibfd, bfd *obfd)
: 0),
output_section->alignment_power)
!= output_section->lma)
- abort ();
+ goto sorry;
}
else
{
@@ -7363,7 +7363,8 @@ rewrite_elf_program_header (bfd *ibfd, bfd *obfd)
negative size - or segments that do not contain any sections. */
if (map->count == 0)
{
- bfd_set_error (bfd_error_bad_value);
+ sorry:
+ bfd_set_error (bfd_error_sorry);
free (sections);
return FALSE;
}
@@ -9277,7 +9278,7 @@ _bfd_elf_validate_reloc (bfd *abfd, arelent *areloc)
/* xgettext:c-format */
_bfd_error_handler (_("%pB: %s unsupported"),
abfd, areloc->howto->name);
- bfd_set_error (bfd_error_bad_value);
+ bfd_set_error (bfd_error_sorry);
return FALSE;
}
@@ -12249,7 +12250,7 @@ _bfd_elf_final_write_processing (bfd *abfd)
_bfd_error_handler (_("symbol type STT_GNU_IFUNC is unsupported"));
if (elf_tdata (abfd)->has_gnu_osabi & elf_gnu_osabi_unique)
_bfd_error_handler (_("symbol binding STB_GNU_UNIQUE is unsupported"));
- bfd_set_error (bfd_error_bad_value);
+ bfd_set_error (bfd_error_sorry);
return FALSE;
}
}