aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bfd/ChangeLog10
-rw-r--r--bfd/bfd-in.h2
-rw-r--r--bfd/bfd-in2.h6
-rw-r--r--bfd/bfd.c3
-rw-r--r--bfd/elf.c6
-rw-r--r--bfd/elfcode.h7
6 files changed, 32 insertions, 2 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index ce930f8..f0c5ef5 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,13 @@
+2002-09-17 Daniel Jacobowitz <drow@mvista.com>
+
+ * bfd-in.h (bfd_get_dynamic_symcount): Define.
+ * bfd.c (struct _bfd): Add dynsymcount.
+ * bfd-in2.h: Regenerated.
+ * elf.c (_bfd_elf_canonicalize_dynamic_symtab): Set
+ abfd->dynsymcount.
+ * elfcode.h (elf_slurp_reloc_table_from_section): Check
+ for overflow.
+
2002-09-17 Stan Cox <scox@redhat.com>
* elf64-mips.c (mips_elf64_be_swap_reloca_out): Handle type2 and type3.
diff --git a/bfd/bfd-in.h b/bfd/bfd-in.h
index 3941906..f30e20d 100644
--- a/bfd/bfd-in.h
+++ b/bfd/bfd-in.h
@@ -529,6 +529,8 @@ extern void warn_deprecated
#define bfd_get_outsymbols(abfd) ((abfd)->outsymbols)
#define bfd_count_sections(abfd) ((abfd)->section_count)
+#define bfd_get_dynamic_symcount(abfd) ((abfd)->dynsymcount)
+
#define bfd_get_symbol_leading_char(abfd) ((abfd)->xvec->symbol_leading_char)
#define bfd_set_cacheable(abfd,bool) (((abfd)->cacheable = (boolean) (bool)), true)
diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h
index abb6405..b6edd0a 100644
--- a/bfd/bfd-in2.h
+++ b/bfd/bfd-in2.h
@@ -535,6 +535,8 @@ extern void warn_deprecated
#define bfd_get_outsymbols(abfd) ((abfd)->outsymbols)
#define bfd_count_sections(abfd) ((abfd)->section_count)
+#define bfd_get_dynamic_symcount(abfd) ((abfd)->dynsymcount)
+
#define bfd_get_symbol_leading_char(abfd) ((abfd)->xvec->symbol_leading_char)
#define bfd_set_cacheable(abfd,bool) (((abfd)->cacheable = (boolean) (bool)), true)
@@ -1629,7 +1631,6 @@ enum bfd_architecture
bfd_arch_v850, /* NEC V850 */
#define bfd_mach_v850 0
#define bfd_mach_v850e 'E'
-#define bfd_mach_v850ea 'A'
bfd_arch_arc, /* ARC Cores */
#define bfd_mach_arc_5 0
#define bfd_mach_arc_6 1
@@ -3462,6 +3463,9 @@ struct _bfd
/* Symbol table for output BFD (with symcount entries). */
struct symbol_cache_entry **outsymbols;
+ /* Used for slurped dynamic symbol tables. */
+ unsigned int dynsymcount;
+
/* Pointer to structure which contains architecture information. */
const struct bfd_arch_info *arch_info;
diff --git a/bfd/bfd.c b/bfd/bfd.c
index 277c74a..cfd7772 100644
--- a/bfd/bfd.c
+++ b/bfd/bfd.c
@@ -128,6 +128,9 @@ CODE_FRAGMENT
. {* Symbol table for output BFD (with symcount entries). *}
. struct symbol_cache_entry **outsymbols;
.
+. {* Used for slurped dynamic symbol tables. *}
+. unsigned int dynsymcount;
+.
. {* Pointer to structure which contains architecture information. *}
. const struct bfd_arch_info *arch_info;
.
diff --git a/bfd/elf.c b/bfd/elf.c
index 7f54909..b8a300e 100644
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -5572,7 +5572,11 @@ _bfd_elf_canonicalize_dynamic_symtab (abfd, alocation)
asymbol **alocation;
{
struct elf_backend_data *bed = get_elf_backend_data (abfd);
- return bed->s->slurp_symbol_table (abfd, alocation, true);
+ long symcount = bed->s->slurp_symbol_table (abfd, alocation, true);
+
+ if (symcount >= 0)
+ bfd_get_dynamic_symcount (abfd) = symcount;
+ return symcount;
}
/* Return the size required for the dynamic reloc entries. Any
diff --git a/bfd/elfcode.h b/bfd/elfcode.h
index eb667eb..7f9ed5f 100644
--- a/bfd/elfcode.h
+++ b/bfd/elfcode.h
@@ -1421,6 +1421,13 @@ elf_slurp_reloc_table_from_section (abfd, asect, rel_hdr, reloc_count,
if (ELF_R_SYM (rela.r_info) == 0)
relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
+ else if (ELF_R_SYM (rela.r_info) > bfd_get_dynamic_symcount (abfd))
+ {
+ (*_bfd_error_handler)
+ (_("%s(%s): relocation %d has invalid symbol index %ld"),
+ abfd->filename, asect->name, i, ELF_R_SYM (rela.r_info));
+ relent->sym_ptr_ptr = bfd_abs_section.symbol_ptr_ptr;
+ }
else
{
asymbol **ps, *s;