diff options
author | Alan Modra <amodra@gmail.com> | 2006-09-22 13:16:45 +0000 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2006-09-22 13:16:45 +0000 |
commit | 8384fb8f0c3c451f7aa8164fc87e162eb9816925 (patch) | |
tree | fead06b59caade8d3776b88a06b2b74c75b13e6b /bfd | |
parent | 885afe7b6fda4324ac445cfdd9e37630f5061dc0 (diff) | |
download | gdb-8384fb8f0c3c451f7aa8164fc87e162eb9816925.zip gdb-8384fb8f0c3c451f7aa8164fc87e162eb9816925.tar.gz gdb-8384fb8f0c3c451f7aa8164fc87e162eb9816925.tar.bz2 |
* elfcode.h (elf_swap_symbol_in): Return bfd_boolean. Don't abort
on error.
* elf-bfd.h (elf_size_info <swap_symbol_in>): Adjust decl.
(bfd_elf32_swap_symbol_in, bfd_elf64_swap_symbol_in): Likewise.
* elf.c (bfd_elf_get_elf_syms): Test return of swap_symbol_in,
and report error.
* elf32-arm.c (elf32_arm_swap_symbol_in): Return bfd_boolean.
Diffstat (limited to 'bfd')
-rw-r--r-- | bfd/ChangeLog | 10 | ||||
-rw-r--r-- | bfd/elf-bfd.h | 6 | ||||
-rw-r--r-- | bfd/elf.c | 10 | ||||
-rw-r--r-- | bfd/elf32-arm.c | 6 | ||||
-rw-r--r-- | bfd/elfcode.h | 5 |
5 files changed, 29 insertions, 8 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 9602cf0..bd6aed7 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,13 @@ +2006-09-22 Alan Modra <amodra@bigpond.net.au> + + * elfcode.h (elf_swap_symbol_in): Return bfd_boolean. Don't abort + on error. + * elf-bfd.h (elf_size_info <swap_symbol_in>): Adjust decl. + (bfd_elf32_swap_symbol_in, bfd_elf64_swap_symbol_in): Likewise. + * elf.c (bfd_elf_get_elf_syms): Test return of swap_symbol_in, + and report error. + * elf32-arm.c (elf32_arm_swap_symbol_in): Return bfd_boolean. + 2006-09-20 Martin Schwidefsky <schwidefsky@de.ibm.com> * elf32-s390.c (elf_s390_relocate_section): Remove check for code diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h index 32b381c..da0eb72 100644 --- a/bfd/elf-bfd.h +++ b/bfd/elf-bfd.h @@ -468,7 +468,7 @@ struct elf_size_info { (*write_shdrs_and_ehdr) (bfd *); void (*write_relocs) (bfd *, asection *, void *); - void (*swap_symbol_in) + bfd_boolean (*swap_symbol_in) (bfd *, const void *, const void *, Elf_Internal_Sym *); void (*swap_symbol_out) (bfd *, const Elf_Internal_Sym *, void *, void *); @@ -1744,7 +1744,7 @@ extern int bfd_elf32_core_file_failing_signal extern bfd_boolean bfd_elf32_core_file_matches_executable_p (bfd *, bfd *); -extern void bfd_elf32_swap_symbol_in +extern bfd_boolean bfd_elf32_swap_symbol_in (bfd *, const void *, const void *, Elf_Internal_Sym *); extern void bfd_elf32_swap_symbol_out (bfd *, const Elf_Internal_Sym *, void *, void *); @@ -1786,7 +1786,7 @@ extern int bfd_elf64_core_file_failing_signal extern bfd_boolean bfd_elf64_core_file_matches_executable_p (bfd *, bfd *); -extern void bfd_elf64_swap_symbol_in +extern bfd_boolean bfd_elf64_swap_symbol_in (bfd *, const void *, const void *, Elf_Internal_Sym *); extern void bfd_elf64_swap_symbol_out (bfd *, const Elf_Internal_Sym *, void *, void *); @@ -400,7 +400,15 @@ bfd_elf_get_elf_syms (bfd *ibfd, for (esym = extsym_buf, isym = intsym_buf, shndx = extshndx_buf; isym < isymend; esym += extsym_size, isym++, shndx = shndx != NULL ? shndx + 1 : NULL) - (*bed->s->swap_symbol_in) (ibfd, esym, shndx, isym); + if (!(*bed->s->swap_symbol_in) (ibfd, esym, shndx, isym)) + { + symoffset += (esym - (bfd_byte *) extsym_buf) / extsym_size; + (*_bfd_error_handler) (_("%B symbol number %lu references " + "nonexistent SHT_SYMTAB_SHNDX section"), + ibfd, (unsigned long) symoffset); + intsym_buf = NULL; + goto out; + } out: if (alloc_ext != NULL) diff --git a/bfd/elf32-arm.c b/bfd/elf32-arm.c index f46b6ae..337f959 100644 --- a/bfd/elf32-arm.c +++ b/bfd/elf32-arm.c @@ -9338,13 +9338,14 @@ elf32_arm_symbol_processing (bfd *abfd ATTRIBUTE_UNUSED, /* Mangle thumb function symbols as we read them in. */ -static void +static bfd_boolean elf32_arm_swap_symbol_in (bfd * abfd, const void *psrc, const void *pshn, Elf_Internal_Sym *dst) { - bfd_elf32_swap_symbol_in (abfd, psrc, pshn, dst); + if (!bfd_elf32_swap_symbol_in (abfd, psrc, pshn, dst)) + return FALSE; /* New EABI objects mark thumb function symbols by setting the low bit of the address. Turn these into STT_ARM_TFUNC. */ @@ -9354,6 +9355,7 @@ elf32_arm_swap_symbol_in (bfd * abfd, dst->st_info = ELF_ST_INFO (ELF_ST_BIND (dst->st_info), STT_ARM_TFUNC); dst->st_value &= ~(bfd_vma) 1; } + return TRUE; } diff --git a/bfd/elfcode.h b/bfd/elfcode.h index a285a13..d58cf34 100644 --- a/bfd/elfcode.h +++ b/bfd/elfcode.h @@ -166,7 +166,7 @@ static void elf_debug_file (Elf_Internal_Ehdr *); /* Translate an ELF symbol in external format into an ELF symbol in internal format. */ -void +bfd_boolean elf_swap_symbol_in (bfd *abfd, const void *psrc, const void *pshn, @@ -188,9 +188,10 @@ elf_swap_symbol_in (bfd *abfd, if (dst->st_shndx == SHN_XINDEX) { if (shndx == NULL) - abort (); + return FALSE; dst->st_shndx = H_GET_32 (abfd, shndx->est_shndx); } + return TRUE; } /* Translate an ELF symbol in internal format into an ELF symbol in external |