aboutsummaryrefslogtreecommitdiff
path: root/bfd
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2006-09-22 13:16:45 +0000
committerAlan Modra <amodra@gmail.com>2006-09-22 13:16:45 +0000
commit8384fb8f0c3c451f7aa8164fc87e162eb9816925 (patch)
treefead06b59caade8d3776b88a06b2b74c75b13e6b /bfd
parent885afe7b6fda4324ac445cfdd9e37630f5061dc0 (diff)
downloadgdb-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/ChangeLog10
-rw-r--r--bfd/elf-bfd.h6
-rw-r--r--bfd/elf.c10
-rw-r--r--bfd/elf32-arm.c6
-rw-r--r--bfd/elfcode.h5
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 *);
diff --git a/bfd/elf.c b/bfd/elf.c
index 8ce0933..73a8713 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 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