From: Mickael Guene Date: Wed, 20 Jan 2016 12:53:50 +0000 (+0000) Subject: Add support for an ARM specific 'y' section attribute flag to mark the section as... X-Git-Tag: gdb-7.11-release~208 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=91f68a68f992e3f6c3da26c616b5257230bd1eec;p=thirdparty%2Fbinutils-gdb.git 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. --- diff --git a/bfd/ChangeLog b/bfd/ChangeLog index ed99d928804..739393d1e9c 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,8 @@ +2016-01-20 Mickael Guene + + * elf32-arm.c (elf32_arm_special_sections): Remove catch of noread + section using '.text.noread' pattern. + 2016-01-19 John Baldwin * elf.c (elfcore_grok_note): Recognize NT_FREEBSD_THRMISC notes. diff --git a/bfd/elf32-arm.c b/bfd/elf32-arm.c index 1c52526b611..39b6153359d 100644 --- a/bfd/elf32-arm.c +++ b/bfd/elf32-arm.c @@ -17839,16 +17839,6 @@ elf32_arm_get_synthetic_symtab (bfd *abfd, return n; } -static const struct bfd_elf_special_section -elf32_arm_special_sections[] = -{ -/* Catch sections with .text.noread prefix and apply allocate, execute and - noread section attributes. */ - { STRING_COMMA_LEN (".text.noread"), -2, SHT_PROGBITS, - SHF_ALLOC + SHF_EXECINSTR + SHF_ARM_NOREAD }, - { NULL, 0, 0, 0, 0 } -}; - static bfd_boolean elf32_arm_section_flags (flagword *flags, const Elf_Internal_Shdr * hdr) { @@ -17953,8 +17943,6 @@ elf32_arm_count_additional_relocs (asection *sec) #define elf_backend_obj_attrs_order elf32_arm_obj_attrs_order #define elf_backend_obj_attrs_handle_unknown elf32_arm_obj_attrs_handle_unknown -#undef elf_backend_special_sections -#define elf_backend_special_sections elf32_arm_special_sections #undef elf_backend_section_flags #define elf_backend_section_flags elf32_arm_section_flags #undef elf_backend_lookup_section_flags_hook diff --git a/binutils/ChangeLog b/binutils/ChangeLog index 24e2afea4cd..2d23f209fc6 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -1,3 +1,14 @@ +2016-01-20 Mickael Guene + + * 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. + * objdump.c (dump_section_header): Display NOREAD attributes as + well. + * doc/binutils.texi (objdump): Note that it is correct for + sections to have both the READONLY and NOREAD attributes. + 2016-01-19 John Baldwin * readelf.c (get_freebsd_elfcore_note_type): Remove unused variable. diff --git a/binutils/doc/binutils.texi b/binutils/doc/binutils.texi index 771100e74b7..b17373222e6 100644 --- a/binutils/doc/binutils.texi +++ b/binutils/doc/binutils.texi @@ -2125,6 +2125,11 @@ although @command{ld} relocates the sections correctly, using @samp{objdump Instead, it shows the usual addresses, which are implicit for the target. +Note, in some cases it is possible for a section to have both the +READONLY and the NOREAD attributes set. In such cases the NOREAD +attribute takes precedence, but @command{objdump} will report both +since the exact setting of the flag bits might be important. + @item -H @itemx --help Print a summary of the options to @command{objdump} and exit. diff --git a/binutils/objdump.c b/binutils/objdump.c index fa991a96955..3c94a761a5e 100644 --- a/binutils/objdump.c +++ b/binutils/objdump.c @@ -488,9 +488,23 @@ dump_section_header (bfd *abfd, asection *section, } PF (SEC_SMALL_DATA, "SMALL_DATA"); if (bfd_get_flavour (abfd) == bfd_target_coff_flavour) - PF (SEC_COFF_SHARED, "SHARED"); + { + PF (SEC_COFF_SHARED, "SHARED"); + PF (SEC_COFF_NOREAD, "NOREAD"); + } + else if (bfd_get_flavour (abfd) == bfd_target_elf_flavour) + { + /* Note - sections can have both the READONLY and NOREAD attributes + set. In this case the NOREAD takes precedence, but we report both + since the user may need to know that both bits are set. */ + PF (SEC_ELF_NOREAD, "NOREAD"); + } PF (SEC_THREAD_LOCAL, "THREAD_LOCAL"); PF (SEC_GROUP, "GROUP"); + if (bfd_get_arch (abfd) == bfd_arch_mep) + { + PF (SEC_MEP_VLIW, "VLIW"); + } if ((section->flags & SEC_LINK_ONCE) != 0) { diff --git a/binutils/readelf.c b/binutils/readelf.c index b4aaf51ace1..b3a28a8d88d 100644 --- a/binutils/readelf.c +++ b/binutils/readelf.c @@ -5430,6 +5430,9 @@ get_elf_section_flags (bfd_vma sh_flags) || elf_header.e_machine == EM_K1OM) && flag == SHF_X86_64_LARGE) *p = 'l'; + else if (elf_header.e_machine == EM_ARM + && flag == SHF_ARM_NOREAD) + *p = 'y'; else if (flag & SHF_MASKOS) { *p = 'o'; @@ -6006,6 +6009,11 @@ process_section_headers (FILE * file) printf (_("Key to Flags:\n\ W (write), A (alloc), X (execute), M (merge), S (strings), l (large)\n\ I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown)\n\ + O (extra OS processing required) o (OS specific), p (processor specific)\n")); + else if (elf_header.e_machine == EM_ARM) + printf (_("Key to Flags:\n\ + W (write), A (alloc), X (execute), M (merge), S (strings), y (noread)\n\ + I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown)\n\ O (extra OS processing required) o (OS specific), p (processor specific)\n")); else printf (_("Key to Flags:\n\ diff --git a/gas/ChangeLog b/gas/ChangeLog index a905d6f44f1..75bee536792 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,18 @@ +2016-01-20 Mickael Guene + Terry Guo + + * 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 * 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 f4726ffcfae..6d6d5f3a3fc 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); @@ -673,6 +677,11 @@ obj_elf_change_section (const char *name, || ssect->type == SHT_PREINIT_ARRAY)) /* 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 { diff --git a/gas/config/tc-arm.c b/gas/config/tc-arm.c index 046abe5b9e6..4a16267f539 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 319b2c2dfef..749629c15fe 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 4ee6a21598a..886b02496e8 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 00000000000..d45a1326612 --- /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 00000000000..9d5ffc64e29 --- /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 + diff --git a/ld/ChangeLog b/ld/ChangeLog index 67aad579a1e..94b6f47d6e7 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,11 @@ +2016-01-20 Mickael Guene + + * testsuite/ld-arm/thumb1-noread-not-present-mixing-two-section.s: + Add 'y' attribute usage. + * testsuite/ld-arm/thumb1-noread-present-one-section.s: Likewise. + * testsuite/ld-arm/thumb1-noread-present-two-section.s: Likewise. + * testsuite/ld-arm/thumb1-input-section-flag-match.s: Likewise. + 2016-01-19 Nick Clifton * testsuite/ld-elf/pr18735.d: Allow for extra symbols between diff --git a/ld/testsuite/ld-arm/thumb1-input-section-flag-match.s b/ld/testsuite/ld-arm/thumb1-input-section-flag-match.s index ac7c89f016c..6f1ad62ddf9 100644 --- a/ld/testsuite/ld-arm/thumb1-input-section-flag-match.s +++ b/ld/testsuite/ld-arm/thumb1-input-section-flag-match.s @@ -1,5 +1,5 @@ .text - .section .text.noread + .section .text.fetchonly,"axy",%progbits .arch armv6s-m .syntax unified .global _start diff --git a/ld/testsuite/ld-arm/thumb1-noread-not-present-mixing-two-section.s b/ld/testsuite/ld-arm/thumb1-noread-not-present-mixing-two-section.s index ac7c89f016c..5b14873f448 100644 --- a/ld/testsuite/ld-arm/thumb1-noread-not-present-mixing-two-section.s +++ b/ld/testsuite/ld-arm/thumb1-noread-not-present-mixing-two-section.s @@ -1,5 +1,5 @@ .text - .section .text.noread + .section .text.noread,"axy",%progbits .arch armv6s-m .syntax unified .global _start diff --git a/ld/testsuite/ld-arm/thumb1-noread-present-one-section.s b/ld/testsuite/ld-arm/thumb1-noread-present-one-section.s index 4be37d24d7d..203cfd5428c 100644 --- a/ld/testsuite/ld-arm/thumb1-noread-present-one-section.s +++ b/ld/testsuite/ld-arm/thumb1-noread-present-one-section.s @@ -1,5 +1,5 @@ .text - .section .text.noread + .section .text.fetchonly,"axy",%progbits .arch armv6s-m .syntax unified .global _start diff --git a/ld/testsuite/ld-arm/thumb1-noread-present-two-section.s b/ld/testsuite/ld-arm/thumb1-noread-present-two-section.s index a97f3799969..245ab255bf3 100644 --- a/ld/testsuite/ld-arm/thumb1-noread-present-two-section.s +++ b/ld/testsuite/ld-arm/thumb1-noread-present-two-section.s @@ -1,5 +1,5 @@ .text - .section .text.noread.first + .section .text.fetchonly.first,"axy",%progbits .arch armv6s-m .syntax unified .global _start @@ -9,7 +9,7 @@ _start: bx lr .text - .section .text.noread.second + .section .text.fetchonly.second,"axy",%progbits .arch armv6s-m .syntax unified .global foo