From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 7096 invoked by alias); 30 Mar 2005 15:31:42 -0000 Mailing-List: contact binutils-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: binutils-owner@sources.redhat.com Received: (qmail 6911 invoked from network); 30 Mar 2005 15:31:21 -0000 Received: from unknown (HELO mail.codesourcery.com) (65.74.133.9) by sourceware.org with SMTP; 30 Mar 2005 15:31:21 -0000 Received: (qmail 16845 invoked from network); 30 Mar 2005 15:31:19 -0000 Received: from localhost (HELO ?10.1.1.125?) (julian@127.0.0.1) by mail.codesourcery.com with SMTP; 30 Mar 2005 15:31:19 -0000 Message-ID: <424AC63F.7000706@codesourcery.com> Date: Wed, 30 Mar 2005 21:11:00 -0000 From: Julian Brown User-Agent: Debian Thunderbird 1.0 (X11/20050116) MIME-Version: 1.0 To: Paul Brook CC: binutils@sources.redhat.com, Julian Brown , Richard Earnshaw Subject: Re: [PATCH] Fix type and alignment of ARM/Thumb EABI mapping symbols References: <424716CD.5030909@codesourcery.com> <4249C7E9.8000100@codesourcery.com> <1112175967.12337.36.camel@pc960.cambridge.arm.com> <200503301527.50626.paul@codesourcery.com> In-Reply-To: <200503301527.50626.paul@codesourcery.com> Content-Type: multipart/mixed; boundary="------------080303060503040102030704" X-SW-Source: 2005-03/txt/msg00900.txt.bz2 This is a multi-part message in MIME format. --------------080303060503040102030704 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Content-length: 1485 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. --------------080303060503040102030704 Content-Type: text/plain; name="patch-6" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="patch-6" Content-length: 14971 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 **** .* : .*: 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 ---- .* : .*: 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 **** .* : .*: 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 ---- .* : .*: 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 **** .* : .*: b500 push {lr} ! .*: (ffc.f7ff|f7ffffc.) bl .* <.text-0x..> .*: bd00 pop {pc} .*: 4770 bx lr .*: 46c0 nop \(mov r8, r8\) --- 49,55 ---- .* : .*: b500 push {lr} ! .*: (ffc.f7ff|f7ffffc.) bl .* <_start-0x..> .*: bd00 pop {pc} .*: 4770 bx lr .*: 46c0 nop \(mov r8, r8\) --------------080303060503040102030704--