PATCH: Add PT_ARM_EXIDX

Mark Mitchell mark@codesourcery.com
Fri Mar 18 02:59:00 GMT 2005


This patch adds support for the PT_ARM_EXIDX program header used in
the new ARM EABI.

OK?

--
Mark Mitchell
CodeSourcery, LLC
mark@codesourcery.com
 
2005-03-17  Paul Brook <paul@codesourcery.com>
	    Dan Jacobowitz <dan@codesourcery.com>
	    Mark Mitchell  <mark@codesourcery.com>

	* bfd/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.
	* include/elf/arm.h (PT_ARM_EXIDX): Define.

Index: bfd/elf32-arm.c
===================================================================
RCS file: /cvs/src/src/bfd/elf32-arm.c,v
retrieving revision 1.22
diff -c -5 -p -r1.22 elf32-arm.c
*** bfd/elf32-arm.c	11 Feb 2005 16:41:09 -0000	1.22
--- bfd/elf32-arm.c	18 Mar 2005 00:48:52 -0000
*************** elf32_arm_swap_symbol_out (bfd *abfd,
*** 5708,5717 ****
--- 5708,5766 ----
        src = &newsym;
      }
    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),
    sizeof (Elf32_External_Phdr),
    sizeof (Elf32_External_Shdr),
*************** const struct elf_size_info elf32_arm_siz
*** 5778,5787 ****
--- 5827,5839 ----
  #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
  #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
  #define elf_backend_plt_readonly    1
  #define elf_backend_want_got_plt    1
*************** elf32_arm_symbian_begin_write_processing
*** 5912,5923 ****
    abfd->flags &= ~D_PAGED;
  }
  
  static bfd_boolean
  elf32_arm_symbian_modify_segment_map (bfd *abfd, 
! 				      struct bfd_link_info *info 
! 				        ATTRIBUTE_UNUSED)
  {
    struct elf_segment_map *m;
    asection *dynsec;
  
    /* BPABI shared libraries and executables should have a PT_DYNAMIC
--- 5964,5974 ----
    abfd->flags &= ~D_PAGED;
  }
  
  static bfd_boolean
  elf32_arm_symbian_modify_segment_map (bfd *abfd, 
! 				      struct bfd_link_info *info)
  {
    struct elf_segment_map *m;
    asection *dynsec;
  
    /* BPABI shared libraries and executables should have a PT_DYNAMIC
*************** elf32_arm_symbian_modify_segment_map (bf
*** 5930,5940 ****
        m = _bfd_elf_make_dynamic_segment (abfd, dynsec);
        m->next = elf_tdata (abfd)->segment_map;
        elf_tdata (abfd)->segment_map = m;
      }
  
!   return TRUE;
  }
  
  #undef elf32_bed
  #define elf32_bed elf32_arm_symbian_bed
  
--- 5981,5992 ----
        m = _bfd_elf_make_dynamic_segment (abfd, dynsec);
        m->next = elf_tdata (abfd)->segment_map;
        elf_tdata (abfd)->segment_map = m;
      }
  
!   /* Also call the generic arm routine.  */
!   return elf32_arm_modify_segment_map (abfd, info);
  }
  
  #undef elf32_bed
  #define elf32_bed elf32_arm_symbian_bed
  
Index: binutils/readelf.c
===================================================================
RCS file: /cvs/src/src/binutils/readelf.c,v
retrieving revision 1.281
diff -c -5 -p -r1.281 readelf.c
*** binutils/readelf.c	28 Feb 2005 15:27:16 -0000	1.281
--- binutils/readelf.c	18 Mar 2005 00:48:52 -0000
*************** get_osabi_name (unsigned int osabi)
*** 2233,2242 ****
--- 2233,2256 ----
        return buff;
      }
  }
  
  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)
      {
      case PT_MIPS_REGINFO:
*************** get_segment_type (unsigned long p_type)
*** 2322,2331 ****
--- 2336,2348 ----
  	{
  	  const char *result;
  
  	  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);
  	      break;
  	    case EM_PARISC:
Index: include/elf/arm.h
===================================================================
RCS file: /cvs/src/src/include/elf/arm.h,v
retrieving revision 1.20
diff -c -5 -p -r1.20 arm.h
*** include/elf/arm.h	3 Mar 2005 11:58:05 -0000	1.20
--- include/elf/arm.h	18 Mar 2005 00:48:53 -0000
***************
*** 35,44 ****
--- 35,47 ----
  #define EF_ARM_OLD_ABI     0x100
  #define EF_ARM_SOFT_FLOAT  0x200
  #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 */
  #define EF_ARM_MAPSYMSFIRST 0x10	/* NB conflicts with EF_APCS_FLOAT */
  #define EF_ARM_EABIMASK      0xFF000000



More information about the Binutils mailing list