summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Mitchell <mark@codesourcery.com>2005-03-20 19:16:25 +0000
committerMark Mitchell <mark@codesourcery.com>2005-03-20 19:16:25 +0000
commitac502a881bffcc36ebe4d24c309b36b7c061a837 (patch)
tree172c5517d2516d537a110eb70db289c25627374f
parent3711da0359f02f727e40e4fec2e4b4c3b2aa3ba7 (diff)
downloadbinutils-redhat-ac502a881bffcc36ebe4d24c309b36b7c061a837.tar.gz
* elf32-arm.c (elf32_arm_modify_segment_map): New function.
(elf32_arm_additional_program_headers): Likewise. (elf_backend_modify_segment_map): Define. (elf_backend_additional_program_headers): Likewise. (elf32_arm_symbian_modify_segment_map): Use elf32_arm_modify_segment_map. * binutils/readelf.c (get_arm_segment_type): New function. (get_segment_type): Use it. * arm.h (PT_ARM_EXIDX): Define.
-rw-r--r--bfd/ChangeLog11
-rw-r--r--bfd/elf32-arm.c58
-rw-r--r--bfd/po/es.gmobin71201 -> 84719 bytes
-rw-r--r--binutils/ChangeLog7
-rw-r--r--binutils/po/es.gmobin120925 -> 133199 bytes
-rw-r--r--binutils/po/fr.gmobin119583 -> 129232 bytes
-rw-r--r--binutils/po/ru.gmobin115866 -> 126130 bytes
-rw-r--r--binutils/po/tr.gmobin119049 -> 129842 bytes
-rw-r--r--binutils/readelf.c17
-rw-r--r--include/elf/ChangeLog6
-rw-r--r--include/elf/arm.h3
11 files changed, 99 insertions, 3 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 9114c4e5cc..3bbd61f28d 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,14 @@
+2005-03-17 Paul Brook <paul@codesourcery.com>
+ Dan Jacobowitz <dan@codesourcery.com>
+ Mark Mitchell <mark@codesourcery.com>
+
+ * elf32-arm.c (elf32_arm_modify_segment_map): New function.
+ (elf32_arm_additional_program_headers): Likewise.
+ (elf_backend_modify_segment_map): Define.
+ (elf_backend_additional_program_headers): Likewise.
+ (elf32_arm_symbian_modify_segment_map): Use
+ elf32_arm_modify_segment_map.
+
2005-03-16 Alan Modra <amodra@bigpond.net.au>
* elf32-ppc.c (ppc_elf_create_linker_section): Set SEC_LINKER_CREATED
diff --git a/bfd/elf32-arm.c b/bfd/elf32-arm.c
index 660a9909dc..f438f03e70 100644
--- a/bfd/elf32-arm.c
+++ b/bfd/elf32-arm.c
@@ -5710,6 +5710,55 @@ elf32_arm_swap_symbol_out (bfd *abfd,
bfd_elf32_swap_symbol_out (abfd, src, cdst, shndx);
}
+/* Add the PT_ARM_EXIDX program header. */
+
+static bfd_boolean
+elf32_arm_modify_segment_map (bfd *abfd,
+ struct bfd_link_info *info ATTRIBUTE_UNUSED)
+{
+ struct elf_segment_map *m;
+ asection *sec;
+
+ sec = bfd_get_section_by_name (abfd, ".ARM.exidx");
+ if (sec != NULL && (sec->flags & SEC_LOAD) != 0)
+ {
+ /* If there is already a PT_ARM_EXIDX header, then we do not
+ want to add another one. This situation arises when running
+ "strip"; the input binary already has the header. */
+ m = elf_tdata (abfd)->segment_map;
+ while (m && m->p_type != PT_ARM_EXIDX)
+ m = m->next;
+ if (!m)
+ {
+ m = bfd_zalloc (abfd, sizeof (struct elf_segment_map));
+ if (m == NULL)
+ return FALSE;
+ m->p_type = PT_ARM_EXIDX;
+ m->count = 1;
+ m->sections[0] = sec;
+
+ m->next = elf_tdata (abfd)->segment_map;
+ elf_tdata (abfd)->segment_map = m;
+ }
+ }
+
+ return TRUE;
+}
+
+/* We may add a PT_ARM_EXIDX program header. */
+
+static int
+elf32_arm_additional_program_headers (bfd *abfd)
+{
+ asection *sec;
+
+ sec = bfd_get_section_by_name (abfd, ".ARM.exidx");
+ if (sec != NULL && (sec->flags & SEC_LOAD) != 0)
+ return 1;
+ else
+ return 0;
+}
+
/* We use this to override swap_symbol_in and swap_symbol_out. */
const struct elf_size_info elf32_arm_size_info = {
sizeof (Elf32_External_Ehdr),
@@ -5780,6 +5829,9 @@ const struct elf_size_info elf32_arm_size_info = {
#define elf_backend_copy_indirect_symbol elf32_arm_copy_indirect_symbol
#define elf_backend_symbol_processing elf32_arm_symbol_processing
#define elf_backend_size_info elf32_arm_size_info
+#define elf_backend_modify_segment_map elf32_arm_modify_segment_map
+#define elf_backend_additional_program_headers \
+ elf32_arm_additional_program_headers
#define elf_backend_can_refcount 1
#define elf_backend_can_gc_sections 1
@@ -5914,8 +5966,7 @@ elf32_arm_symbian_begin_write_processing (bfd *abfd,
static bfd_boolean
elf32_arm_symbian_modify_segment_map (bfd *abfd,
- struct bfd_link_info *info
- ATTRIBUTE_UNUSED)
+ struct bfd_link_info *info)
{
struct elf_segment_map *m;
asection *dynsec;
@@ -5932,7 +5983,8 @@ elf32_arm_symbian_modify_segment_map (bfd *abfd,
elf_tdata (abfd)->segment_map = m;
}
- return TRUE;
+ /* Also call the generic arm routine. */
+ return elf32_arm_modify_segment_map (abfd, info);
}
#undef elf32_bed
diff --git a/bfd/po/es.gmo b/bfd/po/es.gmo
index 3b3adfc6aa..cff702a204 100644
--- a/bfd/po/es.gmo
+++ b/bfd/po/es.gmo
Binary files differ
diff --git a/binutils/ChangeLog b/binutils/ChangeLog
index 2c302ca049..a978d0b448 100644
--- a/binutils/ChangeLog
+++ b/binutils/ChangeLog
@@ -1,3 +1,10 @@
+2005-03-17 Paul Brook <paul@codesourcery.com>
+ Dan Jacobowitz <dan@codesourcery.com>
+ Mark Mitchell <mark@codesourcery.com>
+
+ * binutils/readelf.c (get_arm_segment_type): New function.
+ (get_segment_type): Use it.
+
2005-03-15 Alan Modra <amodra@bigpond.net.au>
* po/es.po: Commit new Spanish translation.
diff --git a/binutils/po/es.gmo b/binutils/po/es.gmo
index 622e305344..bc12e33774 100644
--- a/binutils/po/es.gmo
+++ b/binutils/po/es.gmo
Binary files differ
diff --git a/binutils/po/fr.gmo b/binutils/po/fr.gmo
index 4425835e7c..e92b6c8b83 100644
--- a/binutils/po/fr.gmo
+++ b/binutils/po/fr.gmo
Binary files differ
diff --git a/binutils/po/ru.gmo b/binutils/po/ru.gmo
index 5ea07a1ee4..df9584885b 100644
--- a/binutils/po/ru.gmo
+++ b/binutils/po/ru.gmo
Binary files differ
diff --git a/binutils/po/tr.gmo b/binutils/po/tr.gmo
index ba1cda99b8..bf530ce5e6 100644
--- a/binutils/po/tr.gmo
+++ b/binutils/po/tr.gmo
Binary files differ
diff --git a/binutils/readelf.c b/binutils/readelf.c
index 9c4d2a44b0..31fd3fa0e9 100644
--- a/binutils/readelf.c
+++ b/binutils/readelf.c
@@ -2235,6 +2235,20 @@ get_osabi_name (unsigned int osabi)
}
static const char *
+get_arm_segment_type (unsigned long type)
+{
+ switch (type)
+ {
+ case PT_ARM_EXIDX:
+ return "EXIDX";
+ default:
+ break;
+ }
+
+ return NULL;
+}
+
+static const char *
get_mips_segment_type (unsigned long type)
{
switch (type)
@@ -2324,6 +2338,9 @@ get_segment_type (unsigned long p_type)
switch (elf_header.e_machine)
{
+ case EM_ARM:
+ result = get_arm_segment_type (p_type);
+ break;
case EM_MIPS:
case EM_MIPS_RS3_LE:
result = get_mips_segment_type (p_type);
diff --git a/include/elf/ChangeLog b/include/elf/ChangeLog
index 91a81b9959..46df13d03a 100644
--- a/include/elf/ChangeLog
+++ b/include/elf/ChangeLog
@@ -1,3 +1,9 @@
+2005-03-17 Paul Brook <paul@codesourcery.com>
+ Dan Jacobowitz <dan@codesourcery.com>
+ Mark Mitchell <mark@codesourcery.com>
+
+ * arm.h (PT_ARM_EXIDX): Define.
+
2005-03-02 Daniel Jacobowitz <dan@codesourcery.com>
Joseph Myers <joseph@codesourcery.com>
diff --git a/include/elf/arm.h b/include/elf/arm.h
index 78678295d9..de3ed06644 100644
--- a/include/elf/arm.h
+++ b/include/elf/arm.h
@@ -37,6 +37,9 @@
#define EF_ARM_VFP_FLOAT 0x400
#define EF_ARM_MAVERICK_FLOAT 0x800
+/* Frame unwind information */
+#define PT_ARM_EXIDX (PT_LOPROC + 1)
+
/* Other constants defined in the ARM ELF spec. version B-01. */
#define EF_ARM_SYMSARESORTED 0x04 /* NB conflicts with EF_INTERWORK */
#define EF_ARM_DYNSYMSUSESEGIDX 0x08 /* NB conflicts with EF_APCS26 */