diff options
author | Mickael Guene <mickael.guene@st.com> | 2016-01-20 12:53:50 +0000 |
---|---|---|
committer | Nick Clifton <nickc@redhat.com> | 2016-01-20 12:53:50 +0000 |
commit | 91f68a68f992e3f6c3da26c616b5257230bd1eec (patch) | |
tree | 9e549da0d8aaacafb6231069425241f003357a14 /gas | |
parent | be56871ee8f65c51b9eee611532ed036a71a72e0 (diff) | |
download | gdb-91f68a68f992e3f6c3da26c616b5257230bd1eec.zip gdb-91f68a68f992e3f6c3da26c616b5257230bd1eec.tar.gz gdb-91f68a68f992e3f6c3da26c616b5257230bd1eec.tar.bz2 |
Add support for an ARM specific 'y' section attribute flag to mark the section as NOREAD.
bfd/ChangeLog:
* elf32-arm.c ((elf32_arm_special_sections): Remove catch of noread
section using '.text.noread' pattern.
gas/ChangeLog:
* config/obj-elf.c (obj_elf_change_section) : Allow arm section with
SHF_ARM_NOREAD section flag.
* config/tc-arm.h (md_elf_section_letter) : Implement this hook to
handle letter 'y'.
(arm_elf_section_letter) : Declare it.
* config/tc-arm.c (arm_elf_section_letter): Handle letter 'y' to set
SHF_ARM_NOREAD section flag.
* doc/c-arm.texi (ARM section attribute 'y'): Document it.
gas/testsuite/ChangeLog:
* gas/arm/section-execute-only.s: New test case.
* gas/arm/section-execute-only.d: Expected output.
ld/testsuite/ChangeLog:
* ld-arm/thumb1-noread-not-present-mixing-two-section.s: Add 'y'
attribute usage.
* ld-arm/thumb1-noread-present-one-section.s: Likewise.
* ld-arm/thumb1-noread-present-two-section.s: Likewise.
* ld-arm/thumb1-input-section-flag-match.s: Likewise.
binutils/ChangeLog:
* readelf.c (get_elf_section_flags): Display y letter for section
with SHF_ARM_NOREAD section flag in readelf section output.
(process_section_headers): Add y letter in readelf section output
key mapping for ARM architecture.
Diffstat (limited to 'gas')
-rw-r--r-- | gas/ChangeLog | 15 | ||||
-rw-r--r-- | gas/config/obj-elf.c | 9 | ||||
-rw-r--r-- | gas/config/tc-arm.c | 9 | ||||
-rw-r--r-- | gas/config/tc-arm.h | 3 | ||||
-rw-r--r-- | gas/doc/c-arm.texi | 13 | ||||
-rw-r--r-- | gas/testsuite/gas/arm/section-execute-only.d | 27 | ||||
-rw-r--r-- | gas/testsuite/gas/arm/section-execute-only.s | 30 |
7 files changed, 106 insertions, 0 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog index a905d6f..75bee53 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,18 @@ +2016-01-20 Mickael Guene <mickael.guene@st.com> + Terry Guo <terry.guo@arm.com> + + * config/obj-elf.c (obj_elf_change_section) : Allow arm section with + SHF_ARM_NOREAD section flag. + * config/tc-arm.h (md_elf_section_letter) : Implement this hook to + handle letter 'y'. + (arm_elf_section_letter) : Declare it. + * config/tc-arm.c (arm_elf_section_letter): Handle letter 'y' to set + SHF_ARM_NOREAD section flag. + * doc/c-arm.texi (ARM section attribute): Document the 'y' attribute. + + * testsuite/gas/arm/section-execute-only.s: New test case. + * testsuite/gas/arm/section-execute-only.d: Expected output. + 2016-01-18 Maciej W. Rozycki <macro@imgtec.com> * config/tc-mips.c (micromips_insn_length): Remove the mention diff --git a/gas/config/obj-elf.c b/gas/config/obj-elf.c index f4726ff..6d6d5f3 100644 --- a/gas/config/obj-elf.c +++ b/gas/config/obj-elf.c @@ -64,6 +64,10 @@ #include "elf/nios2.h" #endif +#ifdef TC_ARM +#include "elf/arm.h" +#endif + static void obj_elf_line (int); static void obj_elf_size (int); static void obj_elf_type (int); @@ -674,6 +678,11 @@ obj_elf_change_section (const char *name, /* RX init/fini arrays can and should have the "awx" attributes set. */ ; #endif +#ifdef TC_ARM + else if (attr == (SHF_EXECINSTR | SHF_ARM_NOREAD | SHF_ALLOC)) + /* ARM can have code section with SHF_ARM_NOREAD attribute. */ + ; +#endif else { if (group_name == NULL) diff --git a/gas/config/tc-arm.c b/gas/config/tc-arm.c index 046abe5..4a16267 100644 --- a/gas/config/tc-arm.c +++ b/gas/config/tc-arm.c @@ -24091,6 +24091,15 @@ arm_fix_adjustable (fixS * fixP) #endif /* defined (OBJ_ELF) || defined (OBJ_COFF) */ #ifdef OBJ_ELF +bfd_vma +arm_elf_section_letter (int letter, char **ptrmsg) +{ + if (letter == 'y') + return SHF_ARM_NOREAD; + + *ptrmsg = _("unrecognized .section attribute: want a,e,w,x,y,M,S,G,T"); + return -1; +} const char * elf32_arm_target_format (void) diff --git a/gas/config/tc-arm.h b/gas/config/tc-arm.h index 319b2c2..749629c 100644 --- a/gas/config/tc-arm.h +++ b/gas/config/tc-arm.h @@ -114,6 +114,9 @@ extern bfd_boolean tc_start_label_without_colon (void); #define tc_frob_fake_label(S) arm_frob_label (S) #ifdef OBJ_ELF +#define md_elf_section_letter arm_elf_section_letter +extern bfd_vma arm_elf_section_letter (int, char **); + #define md_end arm_md_end extern void arm_md_end (void); bfd_boolean arm_is_eabi (void); diff --git a/gas/doc/c-arm.texi b/gas/doc/c-arm.texi index 4ee6a21..886b024 100644 --- a/gas/doc/c-arm.texi +++ b/gas/doc/c-arm.texi @@ -23,6 +23,7 @@ * ARM Opcodes:: Opcodes * ARM Mapping Symbols:: Mapping Symbols * ARM Unwinding Tutorial:: Unwinding +* ARM Section Attribute:: Section Attribute @end menu @node ARM Options @@ -1237,3 +1238,15 @@ code that calls functions which may throw exceptions. If you need to know more about the object-file format used to represent unwind information, you may consult the @cite{Exception Handling ABI for the ARM Architecture} available from @uref{http://infocenter.arm.com}. + +@node ARM Section Attribute +@section Section Attribute + +@cindex ARM section attribute +@table @code +@item y +This letter specifies a text section with NOREAD attribute for +hardware that supports execute-only memory region. If not supported +by hardware a section with this attribute will be treated as normal +text section. +@end table diff --git a/gas/testsuite/gas/arm/section-execute-only.d b/gas/testsuite/gas/arm/section-execute-only.d new file mode 100644 index 0000000..d45a132 --- /dev/null +++ b/gas/testsuite/gas/arm/section-execute-only.d @@ -0,0 +1,27 @@ +# name: test executable-only section attribute +# as: +# readelf: -t +# This test is only valid on EABI based ports. +# target: *-*-*eabi* *-*-nacl* +There are 10 section headers, starting at offset 0x16c: + +Section Headers: + \[Nr\] Name + Type Addr Off Size ES Lk Inf Al + Flags + \[ 0\] + NULL 00000000 000000 000000 00 0 0 0 + \[00000000\]: + \[ 1\] .text + PROGBITS 00000000 000034 000000 00 0 0 2 + \[00000006\]: ALLOC, EXEC + \[ 2\] .data + PROGBITS 00000000 000034 000000 00 0 0 1 + \[00000003\]: WRITE, ALLOC + \[ 3\] .bss + NOBITS 00000000 000034 000000 00 0 0 1 + \[00000003\]: WRITE, ALLOC + \[ 4\] .text.foo + PROGBITS 00000000 000034 000010 00 0 0 4 + \[20000006\]: ALLOC, EXEC, ARM_NOREAD +#pass diff --git a/gas/testsuite/gas/arm/section-execute-only.s b/gas/testsuite/gas/arm/section-execute-only.s new file mode 100644 index 0000000..9d5ffc6 --- /dev/null +++ b/gas/testsuite/gas/arm/section-execute-only.s @@ -0,0 +1,30 @@ + .syntax unified + .cpu cortex-m3 + .fpu softvfp + .eabi_attribute 20, 1 + .eabi_attribute 21, 1 + .eabi_attribute 23, 3 + .eabi_attribute 24, 1 + .eabi_attribute 25, 1 + .eabi_attribute 26, 1 + .eabi_attribute 30, 2 + .eabi_attribute 34, 1 + .eabi_attribute 18, 4 + .thumb + .section .text.foo,"axy",%progbits + .align 2 + .global foo + .thumb + .thumb_func + .type foo, %function +foo: + @ args = 0, pretend = 0, frame = 0 + @ frame_needed = 0, uses_anonymous_args = 0 + @ link register save eliminated. + movs r0, #1 + movs r1, #1 + movw r2, #257 + movs r3, #1 + b madd + .size foo, .-foo + |