diff options
-rw-r--r-- | bfd/ChangeLog | 11 | ||||
-rw-r--r-- | bfd/elf32-arm.c | 58 | ||||
-rw-r--r-- | binutils/ChangeLog | 7 | ||||
-rw-r--r-- | binutils/readelf.c | 17 | ||||
-rw-r--r-- | include/elf/ChangeLog | 6 | ||||
-rw-r--r-- | include/elf/arm.h | 3 |
6 files changed, 99 insertions, 3 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 010c900..75b8b61 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-18 H.J. Lu <hongjiu.lu@intel.com> * elflink.c (elf_mark_used_section): Check bfd_is_const_section diff --git a/bfd/elf32-arm.c b/bfd/elf32-arm.c index 660a990..f438f03 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/binutils/ChangeLog b/binutils/ChangeLog index 8520871..0455b5f 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-18 Paul Brook <paul@codesourcery.com> * objdump.c (objdump_print_addr): Avoid uninitialized warning. diff --git a/binutils/readelf.c b/binutils/readelf.c index 9c4d2a4..31fd3fa 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 91a81b9..46df13d 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 7867829..de3ed06 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 */ |