This is the mail archive of the binutils@sources.redhat.com mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] Fix type and alignment of ARM/Thumb EABI mapping symbols


Paul Brook wrote:
! 4.5.7 Mapping symbols

!       A section of an ELF file can contain a mixture of ARM code, Thumb
code

There's no need to quote the entirety of this section in the source file. A cross reference is fine. The correct reference should be to v1.0 of the spec, where the section number is 4.5.5.


Might also be worth explicitly noting that this is a change from previous behaviour.

I'll apply this version on mainline and binutils-csl-arm-2005q1-branch.


ChangeLog:

  * bfd/bfd-in.h (bfd_elf32_is_arm_mapping_symbol_name): Add prototype.
  * bfd/bfd-in2.h: Regenerate.
  * bfd/elf32-arm.c (elf32_arm_is_target_special_symbol): Rename call to
  bfd_elf32_is_arm_mapping_symbol_name.
  (elf32_arm_output_symbol_hook): Likewise.
  (arm_elf_find_function): Likewise, and include STT_NOTYPE in test
  for mapping symbols.
  (is_arm_mapping_symbol_name): Function moved from here...
  * bfd/cpu-arm.c (bfd_elf32_is_arm_mapping_symbol_name): ...to here,
  renamed and made global.
  * gas/config/tc-arm.c (mapping_state): Change documentation in
  function comment to cross-reference spec instead. Change type of
  mapping symbols to BSF_NO_TYPE.
  (arm_adjust_symtab): Don't change type of mapping symbols here.
  * gas/testsuite/gas/arm/mapping.d: Update expected output.
  * ld/testsuite/ld-arm/arm-app-abs32.d: Likewise.
  * ld/testsuite/ld-arm/arm-app.d: Likewise.
  * ld/testsuite/ld-arm/mixed-app.d: Likewise.

Index: bfd/bfd-in.h
===================================================================
RCS file: /cvs/src/src/bfd/bfd-in.h,v
retrieving revision 1.95
diff -c -p -r1.95 bfd-in.h
*** bfd/bfd-in.h	23 Mar 2005 04:14:42 -0000	1.95
--- bfd/bfd-in.h	30 Mar 2005 15:25:34 -0000
*************** extern bfd_boolean bfd_elf32_arm_get_bfd
*** 824,829 ****
--- 824,833 ----
  extern bfd_boolean bfd_elf32_arm_add_glue_sections_to_bfd
    (bfd *, struct bfd_link_info *);
  
+ /* ELF ARM mapping symbol support */
+ extern bfd_boolean bfd_elf32_is_arm_mapping_symbol_name
+   (const char * name);
+ 
  /* ARM Note section processing.  */
  extern bfd_boolean bfd_arm_merge_machines
    (bfd *, bfd *);
Index: bfd/elf32-arm.c
===================================================================
RCS file: /cvs/src/src/bfd/elf32-arm.c,v
retrieving revision 1.28
diff -c -p -r1.28 elf32-arm.c
*** bfd/elf32-arm.c	29 Mar 2005 16:54:19 -0000	1.28
--- bfd/elf32-arm.c	30 Mar 2005 15:25:35 -0000
*************** elf32_arm_check_relocs (bfd *abfd, struc
*** 4705,4725 ****
    return TRUE;
  }
  
- static bfd_boolean
- is_arm_mapping_symbol_name (const char * name)
- {
-   return (name != NULL)
-     && (name[0] == '$')
-     && ((name[1] == 'a') || (name[1] == 't') || (name[1] == 'd'))
-     && (name[2] == 0);
- }
- 
  /* Treat mapping symbols as special target symbols.  */
  
  static bfd_boolean
  elf32_arm_is_target_special_symbol (bfd * abfd ATTRIBUTE_UNUSED, asymbol * sym)
  {
!   return is_arm_mapping_symbol_name (sym->name);
  }
  
  /* This is a copy of elf_find_function() from elf.c except that
--- 4705,4716 ----
    return TRUE;
  }
  
  /* Treat mapping symbols as special target symbols.  */
  
  static bfd_boolean
  elf32_arm_is_target_special_symbol (bfd * abfd ATTRIBUTE_UNUSED, asymbol * sym)
  {
!   return bfd_elf32_is_arm_mapping_symbol_name (sym->name);
  }
  
  /* This is a copy of elf_find_function() from elf.c except that
*************** arm_elf_find_function (bfd *         abf
*** 4754,4765 ****
  	  break;
  	case STT_FUNC:
  	case STT_ARM_TFUNC:
  	  /* Skip $a and $t symbols.  */
  	  if ((q->symbol.flags & BSF_LOCAL)
! 	      && is_arm_mapping_symbol_name (q->symbol.name))
  	    continue;
  	  /* Fall through.  */
- 	case STT_NOTYPE:
  	  if (bfd_get_section (&q->symbol) == section
  	      && q->symbol.value >= low_func
  	      && q->symbol.value <= offset)
--- 4745,4756 ----
  	  break;
  	case STT_FUNC:
  	case STT_ARM_TFUNC:
+ 	case STT_NOTYPE:
  	  /* Skip $a and $t symbols.  */
  	  if ((q->symbol.flags & BSF_LOCAL)
! 	      && bfd_elf32_is_arm_mapping_symbol_name (q->symbol.name))
  	    continue;
  	  /* Fall through.  */
  	  if (bfd_get_section (&q->symbol) == section
  	      && q->symbol.value >= low_func
  	      && q->symbol.value <= offset)
*************** elf32_arm_output_symbol_hook (struct bfd
*** 6086,6092 ****
      return TRUE;
  
    /* We only want mapping symbols.  */
!   if (! is_arm_mapping_symbol_name (name))
      return TRUE;
  
    mapcount = ++(elf32_arm_section_data (input_sec)->mapcount);
--- 6077,6083 ----
      return TRUE;
  
    /* We only want mapping symbols.  */
!   if (! bfd_elf32_is_arm_mapping_symbol_name (name))
      return TRUE;
  
    mapcount = ++(elf32_arm_section_data (input_sec)->mapcount);
Index: bfd/cpu-arm.c
===================================================================
RCS file: /cvs/src/src/bfd/cpu-arm.c,v
retrieving revision 1.15
diff -c -p -r1.15 cpu-arm.c
*** bfd/cpu-arm.c	20 Feb 2005 14:59:06 -0000	1.15
--- bfd/cpu-arm.c	30 Mar 2005 15:25:35 -0000
*************** bfd_arm_get_mach_from_notes (bfd *abfd, 
*** 400,402 ****
--- 400,412 ----
      free (buffer);
    return bfd_mach_arm_unknown;
  }
+ 
+ bfd_boolean
+ bfd_elf32_is_arm_mapping_symbol_name (const char * name)
+ {
+   return (name != NULL)
+     && (name[0] == '$')
+     && ((name[1] == 'a') || (name[1] == 't') || (name[1] == 'd'))
+     && (name[2] == 0);
+ }
+ 
Index: gas/config/tc-arm.c
===================================================================
RCS file: /cvs/src/src/gas/config/tc-arm.c,v
retrieving revision 1.199
diff -c -p -r1.199 tc-arm.c
*** gas/config/tc-arm.c	29 Mar 2005 16:54:21 -0000	1.199
--- gas/config/tc-arm.c	30 Mar 2005 15:25:35 -0000
*************** validate_offset_imm (unsigned int val, i
*** 1243,1320 ****
  
  #ifdef OBJ_ELF
  /* This code is to handle mapping symbols as defined in the ARM ELF spec.
!    (This text is taken from version B-02 of the spec):
! 
!       4.4.7 Mapping and tagging symbols
! 
!       A section of an ARM ELF file can contain a mixture of ARM code,
!       Thumb code, and data.  There are inline transitions between code
!       and data at literal pool boundaries. There can also be inline
!       transitions between ARM code and Thumb code, for example in
!       ARM-Thumb inter-working veneers.  Linkers, machine-level
!       debuggers, profiling tools, and disassembly tools need to map
!       images accurately. For example, setting an ARM breakpoint on a
!       Thumb location, or in a literal pool, can crash the program
!       being debugged, ruining the debugging session.
! 
!       ARM ELF entities are mapped (see section 4.4.7.1 below) and
!       tagged (see section 4.4.7.2 below) using local symbols (with
!       binding STB_LOCAL).  To assist consumers, mapping and tagging
!       symbols should be collated first in the symbol table, before
!       other symbols with binding STB_LOCAL.
! 
!       To allow properly collated mapping and tagging symbols to be
!       skipped by consumers that have no interest in them, the first
!       such symbol should have the name $m and its st_value field equal
!       to the total number of mapping and tagging symbols (including
!       the $m) in the symbol table.
! 
!       4.4.7.1 Mapping symbols
! 
!       $a    Labels the first byte of a sequence of ARM instructions.
!             Its type is STT_FUNC.
! 
!       $d    Labels the first byte of a sequence of data items.
!             Its type is STT_OBJECT.
! 
!       $t    Labels the first byte of a sequence of Thumb instructions.
!             Its type is STT_FUNC.
! 
!       This list of mapping symbols may be extended in the future.
! 
!       Section-relative mapping symbols
! 
!       Mapping symbols defined in a section define a sequence of
!       half-open address intervals that cover the address range of the
!       section. Each interval starts at the address defined by a
!       mapping symbol, and continues up to, but not including, the
!       address defined by the next (in address order) mapping symbol or
!       the end of the section. A corollary is that there must be a
!       mapping symbol defined at the beginning of each section.
!       Consumers can ignore the size of a section-relative mapping
!       symbol. Producers can set it to 0.
! 
!       Absolute mapping symbols
! 
!       Because of the need to crystallize a Thumb address with the
!       Thumb-bit set, absolute symbol of type STT_FUNC (symbols of type
!       STT_FUNC defined in section SHN_ABS) need to be mapped with $a
!       or $t.
! 
!       The extent of a mapping symbol defined in SHN_ABS is [st_value,
!       st_value + st_size), or [st_value, st_value + 1) if st_size = 0,
!       where [x, y) denotes the half-open address range from x,
!       inclusive, to y, exclusive.
! 
!       In the absence of a mapping symbol, a consumer can interpret a
!       function symbol with an odd value as the Thumb code address
!       obtained by clearing the least significant bit of the
!       value. This interpretation is deprecated, and it may not work in
!       the future.
! 
!    Note - the Tagging symbols ($b, $f, $p $m) have been dropped from
!    the EABI (which is still under development), so they are not
!    implemented here.  */
  
  static enum mstate mapstate = MAP_UNDEFINED;
  
--- 1243,1251 ----
  
  #ifdef OBJ_ELF
  /* This code is to handle mapping symbols as defined in the ARM ELF spec.
!    (See "Mapping symbols", section 4.5.5, ARM AAELF version 1.0).
!    Note that previously, $a and $t has type STT_FUNC (BSF_OBJECT flag),
!    and $d has type STT_OBJECT (BSF_OBJECT flag). Now all three are untyped.  */
  
  static enum mstate mapstate = MAP_UNDEFINED;
  
*************** mapping_state (enum mstate state)
*** 1336,1350 ****
      {
      case MAP_DATA:
        symname = "$d";
!       type = BSF_OBJECT;
        break;
      case MAP_ARM:
        symname = "$a";
!       type = BSF_FUNCTION;
        break;
      case MAP_THUMB:
        symname = "$t";
!       type = BSF_FUNCTION;
        break;
      case MAP_UNDEFINED:
        return;
--- 1267,1281 ----
      {
      case MAP_DATA:
        symname = "$d";
!       type = BSF_NO_FLAGS;
        break;
      case MAP_ARM:
        symname = "$a";
!       type = BSF_NO_FLAGS;
        break;
      case MAP_THUMB:
        symname = "$t";
!       type = BSF_NO_FLAGS;
        break;
      case MAP_UNDEFINED:
        return;
*************** arm_adjust_symtab (void)
*** 13738,13751 ****
  	  elf_sym = elf_symbol (symbol_get_bfdsym (sym));
  	  bind = ELF_ST_BIND (elf_sym->internal_elf_sym.st_info);
  
! 	  /* If it's a .thumb_func, declare it as so,
! 	     otherwise tag label as .code 16.  */
! 	  if (THUMB_IS_FUNC (sym))
! 	    elf_sym->internal_elf_sym.st_info =
! 	      ELF_ST_INFO (bind, STT_ARM_TFUNC);
! 	  else
! 	    elf_sym->internal_elf_sym.st_info =
! 	      ELF_ST_INFO (bind, STT_ARM_16BIT);
  	}
      }
  #endif
--- 13669,13685 ----
  	  elf_sym = elf_symbol (symbol_get_bfdsym (sym));
  	  bind = ELF_ST_BIND (elf_sym->internal_elf_sym.st_info);
  
! 	  if (! bfd_elf32_is_arm_mapping_symbol_name (elf_sym->symbol.name))
! 	    { 
! 	      /* If it's a .thumb_func, declare it as so,
! 		 otherwise tag label as .code 16.  */
! 	      if (THUMB_IS_FUNC (sym))
! 		elf_sym->internal_elf_sym.st_info =
! 		  ELF_ST_INFO (bind, STT_ARM_TFUNC);
! 	      else
! 		elf_sym->internal_elf_sym.st_info =
! 		  ELF_ST_INFO (bind, STT_ARM_16BIT);
! 	    }
  	}
      }
  #endif
Index: gas/testsuite/gas/arm/mapping.d
===================================================================
RCS file: /cvs/src/src/gas/testsuite/gas/arm/mapping.d,v
retrieving revision 1.4
diff -c -p -r1.4 mapping.d
*** gas/testsuite/gas/arm/mapping.d	11 Dec 2004 04:32:36 -0000	1.4
--- gas/testsuite/gas/arm/mapping.d	30 Mar 2005 15:25:35 -0000
*************** SYMBOL TABLE:
*** 9,18 ****
  0+00 l    d  .text	0+0 (|.text)
  0+00 l    d  .data	0+0 (|.data)
  0+00 l    d  .bss	0+0 (|.bss)
! 0+00 l     F .text	0+0 \$a
! 0+08 l     F .text	0+0 \$t
! 0+00 l     O .data	0+0 \$d
  0+00 l    d  foo	0+0 (|foo)
! 0+00 l     F foo	0+0 \$t
  0+00 g       .text	0+0 mapping
  0+08 g     F .text	0+0 thumb_mapping
--- 9,18 ----
  0+00 l    d  .text	0+0 (|.text)
  0+00 l    d  .data	0+0 (|.data)
  0+00 l    d  .bss	0+0 (|.bss)
! 0+00 l       .text	0+0 \$a
! 0+08 l       .text	0+0 \$t
! 0+00 l       .data	0+0 \$d
  0+00 l    d  foo	0+0 (|foo)
! 0+00 l       foo	0+0 \$t
  0+00 g       .text	0+0 mapping
  0+08 g     F .text	0+0 thumb_mapping
Index: ld/testsuite/ld-arm/arm-app-abs32.d
===================================================================
RCS file: /cvs/src/src/ld/testsuite/ld-arm/arm-app-abs32.d,v
retrieving revision 1.2
diff -c -p -r1.2 arm-app-abs32.d
*** ld/testsuite/ld-arm/arm-app-abs32.d	17 Nov 2004 17:50:27 -0000	1.2
--- ld/testsuite/ld-arm/arm-app-abs32.d	30 Mar 2005 15:25:35 -0000
*************** Disassembly of section .plt:
*** 8,14 ****
  
  .* <.plt>:
      .*:	e52de004 	str	lr, \[sp, #-4\]!
!     .*:	e59fe004 	ldr	lr, \[pc, #4\]	; .* <.plt\+0x10>
      .*:	e08fe00e 	add	lr, pc, lr
      .*:	e5bef008 	ldr	pc, \[lr, #8\]!
      .*:	.* 	.*
--- 8,14 ----
  
  .* <.plt>:
      .*:	e52de004 	str	lr, \[sp, #-4\]!
!     .*:	e59fe004 	ldr	lr, \[pc, #4\]	; .* <_start-0x10>
      .*:	e08fe00e 	add	lr, pc, lr
      .*:	e5bef008 	ldr	pc, \[lr, #8\]!
      .*:	.* 	.*
Index: ld/testsuite/ld-arm/arm-app.d
===================================================================
RCS file: /cvs/src/src/ld/testsuite/ld-arm/arm-app.d,v
retrieving revision 1.2
diff -c -p -r1.2 arm-app.d
*** ld/testsuite/ld-arm/arm-app.d	17 Nov 2004 17:50:27 -0000	1.2
--- ld/testsuite/ld-arm/arm-app.d	30 Mar 2005 15:25:35 -0000
*************** Disassembly of section .plt:
*** 8,14 ****
  
  .* <.plt>:
   .*:	e52de004 	str	lr, \[sp, #-4\]!
!  .*:	e59fe004 	ldr	lr, \[pc, #4\]	; .* <.plt\+0x10>
   .*:	e08fe00e 	add	lr, pc, lr
   .*:	e5bef008 	ldr	pc, \[lr, #8\]!
   .*:	.*
--- 8,14 ----
  
  .* <.plt>:
   .*:	e52de004 	str	lr, \[sp, #-4\]!
!  .*:	e59fe004 	ldr	lr, \[pc, #4\]	; .* <_start-0x10>
   .*:	e08fe00e 	add	lr, pc, lr
   .*:	e5bef008 	ldr	pc, \[lr, #8\]!
   .*:	.*
*************** Disassembly of section .text:
*** 27,33 ****
  .* <app_func>:
   .*:	e1a0c00d 	mov	ip, sp
   .*:	e92dd800 	stmdb	sp!, {fp, ip, lr, pc}
!  .*:	ebfffff4 	bl	.* <.text-0xc>
   .*:	e89d6800 	ldmia	sp, {fp, sp, lr}
   .*:	e12fff1e 	bx	lr
  
--- 27,33 ----
  .* <app_func>:
   .*:	e1a0c00d 	mov	ip, sp
   .*:	e92dd800 	stmdb	sp!, {fp, ip, lr, pc}
!  .*:	ebfffff4 	bl	.* <_start-0xc>
   .*:	e89d6800 	ldmia	sp, {fp, sp, lr}
   .*:	e12fff1e 	bx	lr
  
Index: ld/testsuite/ld-arm/mixed-app.d
===================================================================
RCS file: /cvs/src/src/ld/testsuite/ld-arm/mixed-app.d,v
retrieving revision 1.1
diff -c -p -r1.1 mixed-app.d
*** ld/testsuite/ld-arm/mixed-app.d	17 Nov 2004 17:50:27 -0000	1.1
--- ld/testsuite/ld-arm/mixed-app.d	30 Mar 2005 15:25:35 -0000
*************** Disassembly of section .plt:
*** 8,14 ****
  
  .* <.plt>:
   .*:	e52de004 	str	lr, \[sp, #-4\]!
!  .*:	e59fe004 	ldr	lr, \[pc, #4\]	; .* <.plt\+0x10>
   .*:	e08fe00e 	add	lr, pc, lr
   .*:	e5bef008 	ldr	pc, \[lr, #8\]!
   .*:	.*
--- 8,14 ----
  
  .* <.plt>:
   .*:	e52de004 	str	lr, \[sp, #-4\]!
!  .*:	e59fe004 	ldr	lr, \[pc, #4\]	; .* <_start-0x2c>
   .*:	e08fe00e 	add	lr, pc, lr
   .*:	e5bef008 	ldr	pc, \[lr, #8\]!
   .*:	.*
*************** Disassembly of section .text:
*** 34,40 ****
  .* <app_func>:
   .*:	e1a0c00d 	mov	ip, sp
   .*:	e92dd800 	stmdb	sp!, {fp, ip, lr, pc}
!  .*:	ebffffe. 	bl	.* <.text-0x..>
   .*:	e89d6800 	ldmia	sp, {fp, sp, lr}
   .*:	e12fff1e 	bx	lr
   .*:	e1a00000 	nop			\(mov r0,r0\)
--- 34,40 ----
  .* <app_func>:
   .*:	e1a0c00d 	mov	ip, sp
   .*:	e92dd800 	stmdb	sp!, {fp, ip, lr, pc}
!  .*:	ebffffe. 	bl	.* <_start-0x..>
   .*:	e89d6800 	ldmia	sp, {fp, sp, lr}
   .*:	e12fff1e 	bx	lr
   .*:	e1a00000 	nop			\(mov r0,r0\)
*************** Disassembly of section .text:
*** 49,55 ****
  
  .* <app_tfunc>:
   .*:	b500      	push	{lr}
!  .*:	(ffc.f7ff|f7ffffc.) 	bl	.* <.text-0x..>
   .*:	bd00      	pop	{pc}
   .*:	4770      	bx	lr
   .*:	46c0      	nop			\(mov r8, r8\)
--- 49,55 ----
  
  .* <app_tfunc>:
   .*:	b500      	push	{lr}
!  .*:	(ffc.f7ff|f7ffffc.) 	bl	.* <_start-0x..>
   .*:	bd00      	pop	{pc}
   .*:	4770      	bx	lr
   .*:	46c0      	nop			\(mov r8, r8\)

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]