diff options
author | Daniel Jacobowitz <dan@debian.org> | 2002-09-18 02:39:43 +0000 |
---|---|---|
committer | Daniel Jacobowitz <dan@debian.org> | 2002-09-18 02:39:43 +0000 |
commit | a499627c7f5c93d9c086f93d788e06d4bf47ed30 (patch) | |
tree | a5148ce6edbcbdcbd93bfbc6b0229d6632e75f45 /bfd | |
parent | 70d43236d1e31c18d239287788c7dfd7ffbcc21c (diff) | |
download | binutils-redhat-a499627c7f5c93d9c086f93d788e06d4bf47ed30.tar.gz |
* 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.
Diffstat (limited to 'bfd')
-rw-r--r-- | bfd/ChangeLog | 10 | ||||
-rw-r--r-- | bfd/bfd-in.h | 2 | ||||
-rw-r--r-- | bfd/bfd-in2.h | 6 | ||||
-rw-r--r-- | bfd/bfd.c | 3 | ||||
-rw-r--r-- | bfd/elf.c | 6 | ||||
-rw-r--r-- | bfd/elfcode.h | 7 |
6 files changed, 32 insertions, 2 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index ce930f809b..f0c5ef56b8 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 3941906979..f30e20d0cb 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 abb6405f57..b6edd0a04c 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; @@ -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; . @@ -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 eb667eb50e..7f9ed5fe3a 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; |