From 8384fb8f0c3c451f7aa8164fc87e162eb9816925 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Fri, 22 Sep 2006 13:16:45 +0000 Subject: [PATCH] * elfcode.h (elf_swap_symbol_in): Return bfd_boolean. Don't abort on error. * elf-bfd.h (elf_size_info ): 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. --- bfd/ChangeLog | 10 ++++++++++ bfd/elf-bfd.h | 6 +++--- bfd/elf.c | 10 +++++++++- bfd/elf32-arm.c | 6 ++++-- bfd/elfcode.h | 5 +++-- 5 files changed, 29 insertions(+), 8 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 9602cf07010..bd6aed7fb05 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,13 @@ +2006-09-22 Alan Modra + + * elfcode.h (elf_swap_symbol_in): Return bfd_boolean. Don't abort + on error. + * elf-bfd.h (elf_size_info ): 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 * elf32-s390.c (elf_s390_relocate_section): Remove check for code diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h index 32b381c8ada..da0eb72e1cb 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 *); diff --git a/bfd/elf.c b/bfd/elf.c index 8ce0933ad95..73a8713e218 100644 --- a/bfd/elf.c +++ b/bfd/elf.c @@ -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 f46b6ae58bc..337f959878d 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 a285a133088..d58cf344718 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 -- 2.30.2