aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bfd/Makefile.am2
-rw-r--r--bfd/Makefile.in2
-rw-r--r--bfd/elfcode.h29
-rw-r--r--bfd/format.c16
-rw-r--r--bfd/libbfd.h5
-rw-r--r--bfd/targets.c29
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 *