@ -1243,78 +1243,9 @@ validate_offset_imm (unsigned int val, int hwse)
# 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 . */
( 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 ;
@ -1336,15 +1267,15 @@ mapping_state (enum mstate state)
{
case MAP_DATA :
symname = " $d " ;
type = BSF_OBJECT ;
type = BSF_NO_FLAGS ;
break ;
case MAP_ARM :
symname = " $a " ;
type = BSF_FUNCTION ;
type = BSF_NO_FLAGS ;
break ;
case MAP_THUMB :
symname = " $t " ;
type = BSF_FUNCTION ;
type = BSF_NO_FLAGS ;
break ;
case MAP_UNDEFINED :
return ;
@ -13738,14 +13669,17 @@ arm_adjust_symtab (void)
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 ) ;
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