aboutsummaryrefslogtreecommitdiff
path: root/bfd
diff options
context:
space:
mode:
authorNick Clifton <nickc@redhat.com>2004-10-01 12:59:42 +0000
committerNick Clifton <nickc@redhat.com>2004-10-01 12:59:42 +0000
commit40a18ebd3ae910042b4d7bf053a41c247db7cbc1 (patch)
treecd1e24028a8d52668bd1579632901934575f3d52 /bfd
parent14127cc4f2b98a818bef55c977eb3ea11b0ba5ce (diff)
downloadgdb-40a18ebd3ae910042b4d7bf053a41c247db7cbc1.zip
gdb-40a18ebd3ae910042b4d7bf053a41c247db7cbc1.tar.gz
gdb-40a18ebd3ae910042b4d7bf053a41c247db7cbc1.tar.bz2
The patch below adds binutils support for the SHT_ARM_EXIDX, as defined by
the ARM EABI.
Diffstat (limited to 'bfd')
-rw-r--r--bfd/ChangeLog7
-rw-r--r--bfd/elf32-arm.h64
2 files changed, 68 insertions, 3 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index cc743c7..4467b65 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,10 @@
+2004-10-01 Paul Brook <paul@codesourcery.com>
+
+ * elf32-arm.h (elf32_arm_fake_sections,
+ is_arm_elf_unwind_section_name, elf32_arm_section_from_shdr): New
+ functions.
+ (elf_backend_fake_sections, elf_backend_section_from_shdr): Define.
+
2004-10-01 Alan Modra <amodra@bigpond.net.au>
* elf-bfd.h (struct eh_cie_fde): Add need_relative and
diff --git a/bfd/elf32-arm.h b/bfd/elf32-arm.h
index 99ed731..a8aac2b 100644
--- a/bfd/elf32-arm.h
+++ b/bfd/elf32-arm.h
@@ -4235,9 +4235,6 @@ elf32_arm_reloc_type_class (const Elf_Internal_Rela *rela)
}
}
-static bfd_boolean elf32_arm_section_flags (flagword *, const Elf_Internal_Shdr *);
-static void elf32_arm_final_write_processing (bfd *, bfd_boolean);
-
/* Set the right machine number for an Arm ELF file. */
static bfd_boolean
@@ -4255,6 +4252,65 @@ elf32_arm_final_write_processing (bfd *abfd, bfd_boolean linker ATTRIBUTE_UNUSED
bfd_arm_update_notes (abfd, ARM_NOTE_SECTION);
}
+/* Return TRUE if this is an unwinding table entry. */
+
+static bfd_boolean
+is_arm_elf_unwind_section_name (bfd * abfd ATTRIBUTE_UNUSED, const char * name)
+{
+ size_t len1, len2;
+
+ len1 = sizeof (ELF_STRING_ARM_unwind) - 1;
+ len2 = sizeof (ELF_STRING_ARM_unwind_once) - 1;
+ return (strncmp (name, ELF_STRING_ARM_unwind, len1) == 0
+ || strncmp (name, ELF_STRING_ARM_unwind_once, len2) == 0);
+}
+
+
+/* Set the type and flags for an ARM section. We do this by
+ the section name, which is a hack, but ought to work. */
+
+static bfd_boolean
+elf32_arm_fake_sections (bfd * abfd, Elf_Internal_Shdr * hdr, asection * sec)
+{
+ const char * name;
+
+ name = bfd_get_section_name (abfd, sec);
+
+ if (is_arm_elf_unwind_section_name (abfd, name))
+ {
+ hdr->sh_type = SHT_ARM_EXIDX;
+ hdr->sh_flags |= SHF_LINK_ORDER;
+ }
+ return TRUE;
+}
+
+/* Handle an ARM specific section when reading an object file.
+ This is called when elf.c finds a section with an unknown type. */
+
+static bfd_boolean
+elf32_arm_section_from_shdr (bfd *abfd,
+ Elf_Internal_Shdr * hdr,
+ const char *name)
+{
+ /* There ought to be a place to keep ELF backend specific flags, but
+ at the moment there isn't one. We just keep track of the
+ sections by their name, instead. Fortunately, the ABI gives
+ names for all the ARM specific sections, so we will probably get
+ away with this. */
+ switch (hdr->sh_type)
+ {
+ case SHT_ARM_EXIDX:
+ break;
+
+ default:
+ return FALSE;
+ }
+
+ if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name))
+ return FALSE;
+
+ return TRUE;
+}
/* Called for each symbol. Builds a section map based on mapping symbols.
Does not alter any of the symbols. */
@@ -4426,6 +4482,8 @@ elf32_arm_write_section (bfd *output_bfd ATTRIBUTE_UNUSED, asection *sec,
#define elf_backend_reloc_type_class elf32_arm_reloc_type_class
#define elf_backend_object_p elf32_arm_object_p
#define elf_backend_section_flags elf32_arm_section_flags
+#define elf_backend_fake_sections elf32_arm_fake_sections
+#define elf_backend_section_from_shdr elf32_arm_section_from_shdr
#define elf_backend_final_write_processing elf32_arm_final_write_processing
#define elf_backend_copy_indirect_symbol elf32_arm_copy_indirect_symbol