diff options
-rw-r--r-- | bfd/Makefile.am | 2 | ||||
-rw-r--r-- | bfd/Makefile.in | 2 | ||||
-rw-r--r-- | bfd/elfcode.h | 29 | ||||
-rw-r--r-- | bfd/format.c | 16 | ||||
-rw-r--r-- | bfd/libbfd.h | 5 | ||||
-rw-r--r-- | bfd/targets.c | 29 |
6 files changed, 68 insertions, 15 deletions
diff --git a/bfd/Makefile.am b/bfd/Makefile.am index c23dff6..a5652b2 100644 --- a/bfd/Makefile.am +++ b/bfd/Makefile.am @@ -927,7 +927,7 @@ BFD_H_FILES = bfd-in.h init.c opncls.c libbfd.c \ linker.c simple.c compress.c BFD64_H_FILES = archive64.c LIBBFD_H_FILES = libbfd-in.h libbfd.c bfdio.c bfdwin.c \ - cache.c reloc.c archures.c linker.c + cache.c reloc.c targets.c archures.c linker.c LIBCOFF_H_FILES = libcoff-in.h coffcode.h headers: stmp-bin2-h stmp-lbfd-h stmp-lcoff-h diff --git a/bfd/Makefile.in b/bfd/Makefile.in index 82843d2..83d6865 100644 --- a/bfd/Makefile.in +++ b/bfd/Makefile.in @@ -1214,7 +1214,7 @@ BFD_H_FILES = bfd-in.h init.c opncls.c libbfd.c \ BFD64_H_FILES = archive64.c LIBBFD_H_FILES = libbfd-in.h libbfd.c bfdio.c bfdwin.c \ - cache.c reloc.c archures.c linker.c + cache.c reloc.c targets.c archures.c linker.c LIBCOFF_H_FILES = libcoff-in.h coffcode.h diff --git a/bfd/elfcode.h b/bfd/elfcode.h index 39c84b4..1392240 100644 --- a/bfd/elfcode.h +++ b/bfd/elfcode.h @@ -323,11 +323,11 @@ elf_swap_shdr_in (bfd *abfd, if (filesize != 0 && ((ufile_ptr) dst->sh_offset > filesize - || dst->sh_size > filesize - dst->sh_offset)) + || dst->sh_size > filesize - dst->sh_offset) + && !abfd->read_only) { - if (!abfd->read_only) - _bfd_error_handler (_("warning: %pB has a section " - "extending past end of file"), abfd); + const char **warn = _bfd_per_xvec_warn (abfd->xvec); + *warn = _("warning: %pB has a section extending past end of file"); abfd->read_only = 1; } } @@ -771,10 +771,12 @@ elf_object_p (bfd *abfd) So we are kind, and reset the string index value to 0 so that at least some processing can be done. */ i_ehdrp->e_shstrndx = SHN_UNDEF; - abfd->read_only = 1; - _bfd_error_handler - (_("warning: %pB has a corrupt string table index - ignoring"), - abfd); + if (!abfd->read_only) + { + const char **warn = _bfd_per_xvec_warn (abfd->xvec); + *warn = _("warning: %pB has a corrupt string table index"); + abfd->read_only = 1; + } } } else if (i_ehdrp->e_shstrndx != SHN_UNDEF) @@ -816,9 +818,14 @@ elf_object_p (bfd *abfd) two, as required by the ELF spec. */ if (i_phdr->p_align != (i_phdr->p_align & -i_phdr->p_align)) { - abfd->read_only = 1; - _bfd_error_handler (_("warning: %pB has a program header " - "with invalid alignment"), abfd); + i_phdr->p_align &= -i_phdr->p_align; + if (!abfd->read_only) + { + const char **warn = _bfd_per_xvec_warn (abfd->xvec); + *warn = _("warning: %pB has a program header " + "with invalid alignment"); + abfd->read_only = 1; + } } } } diff --git a/bfd/format.c b/bfd/format.c index 489ffcf..7e2813c 100644 --- a/bfd/format.c +++ b/bfd/format.c @@ -202,6 +202,13 @@ bfd_preserve_finish (bfd *abfd ATTRIBUTE_UNUSED, struct bfd_preserve *preserve) preserve->marker = NULL; } +static void +clear_warnmsg (const bfd_target *targ) +{ + const char **warn = _bfd_per_xvec_warn (targ); + *warn = NULL; +} + /* FUNCTION bfd_check_format_matches @@ -275,6 +282,7 @@ bfd_check_format_matches (bfd *abfd, bfd_format format, char ***matching) if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0) /* rewind! */ goto err_ret; + clear_warnmsg (abfd->xvec); cleanup = BFD_SEND_FMT (abfd, _bfd_check_format, (abfd)); if (cleanup) @@ -341,6 +349,7 @@ bfd_check_format_matches (bfd *abfd, bfd_format format, char ***matching) if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0) goto err_ret; + clear_warnmsg (abfd->xvec); cleanup = BFD_SEND_FMT (abfd, _bfd_check_format, (abfd)); if (cleanup) { @@ -506,6 +515,13 @@ bfd_check_format_matches (bfd *abfd, bfd_format format, char ***matching) bfd_preserve_finish (abfd, &preserve_match); bfd_preserve_finish (abfd, &preserve); + if (!abfd->my_archive) + { + const char **warn = _bfd_per_xvec_warn (abfd->xvec); + if (*warn) + _bfd_error_handler (*warn, abfd); + } + /* File position has moved, BTW. */ return true; } diff --git a/bfd/libbfd.h b/bfd/libbfd.h index 68d0c42..a17b98e 100644 --- a/bfd/libbfd.h +++ b/bfd/libbfd.h @@ -1,6 +1,6 @@ /* DO NOT EDIT! -*- buffer-read-only: t -*- This file is automatically generated from "libbfd-in.h", "libbfd.c", "bfdio.c", "bfdwin.c", - "cache.c", "reloc.c", "archures.c" and "linker.c". + "cache.c", "reloc.c", "targets.c", "archures.c" and "linker.c". Run "make headers" in your build bfd/ to regenerate. */ /* libbfd.h -- Declarations used by bfd library *implementation*. @@ -3546,6 +3546,9 @@ bool _bfd_unrecognized_reloc sec_ptr section, unsigned int r_type); +/* Extracted from targets.c. */ +const char **_bfd_per_xvec_warn (const bfd_target *); + /* Extracted from archures.c. */ extern const bfd_arch_info_type bfd_default_arch_struct; const bfd_arch_info_type *bfd_default_compatible diff --git a/bfd/targets.c b/bfd/targets.c index dc33123..7dbc3a5 100644 --- a/bfd/targets.c +++ b/bfd/targets.c @@ -20,6 +20,7 @@ MA 02110-1301, USA. */ #include "sysdep.h" +#include "libiberty.h" #include "bfd.h" #include "libbfd.h" #include "fnmatch.h" @@ -1454,7 +1455,10 @@ const bfd_target *const *const bfd_associated_vector = _bfd_associated_vector; /* When there is an ambiguous match, bfd_check_format_matches puts the names of the matching targets in an array. This variable is the maximum number of entries that the array could possibly need. */ -const size_t _bfd_target_vector_entries = sizeof (_bfd_target_vector)/sizeof (*_bfd_target_vector); +const size_t _bfd_target_vector_entries = ARRAY_SIZE (_bfd_target_vector); + +/* A place to stash a warning from _bfd_check_format. */ +static const char *per_xvec_warn[ARRAY_SIZE (_bfd_target_vector) + 1]; /* This array maps configuration triplets onto BFD vectors. */ @@ -1474,6 +1478,29 @@ static const struct targmatch bfd_target_match[] = { { NULL, NULL } }; +/* +INTERNAL_FUNCTION + _bfd_per_xvec_warn + +SYNOPSIS + const char **_bfd_per_xvec_warn (const bfd_target *); + +DESCRIPTION + Return a location for the given target xvec to use for + warnings specific to that target. +*/ + +const char ** +_bfd_per_xvec_warn (const bfd_target *targ) +{ + size_t idx; + + for (idx = 0; idx < ARRAY_SIZE (_bfd_target_vector); idx++) + if (_bfd_target_vector[idx] == targ) + break; + return per_xvec_warn + idx; +} + /* Find a target vector, given a name or configuration triplet. */ static const bfd_target * |