This is the mail archive of the binutils-cvs@sourceware.org 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]

[binutils-gdb] Add support for an ARM specific 'y' section attribute flag to mark the section as NOREAD.


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=91f68a68f992e3f6c3da26c616b5257230bd1eec

commit 91f68a68f992e3f6c3da26c616b5257230bd1eec
Author: Mickael Guene <mickael.guene@st.com>
Date:   Wed Jan 20 12:53:50 2016 +0000

    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:
---
 bfd/ChangeLog                                      |  5 ++++
 bfd/elf32-arm.c                                    | 12 ---------
 binutils/ChangeLog                                 | 11 ++++++++
 binutils/doc/binutils.texi                         |  5 ++++
 binutils/objdump.c                                 | 16 +++++++++++-
 binutils/readelf.c                                 |  8 ++++++
 gas/ChangeLog                                      | 15 +++++++++++
 gas/config/obj-elf.c                               |  9 +++++++
 gas/config/tc-arm.c                                |  9 +++++++
 gas/config/tc-arm.h                                |  3 +++
 gas/doc/c-arm.texi                                 | 13 ++++++++++
 gas/testsuite/gas/arm/section-execute-only.d       | 27 +++++++++++++++++++
 gas/testsuite/gas/arm/section-execute-only.s       | 30 ++++++++++++++++++++++
 ld/ChangeLog                                       |  8 ++++++
 .../ld-arm/thumb1-input-section-flag-match.s       |  2 +-
 .../thumb1-noread-not-present-mixing-two-section.s |  2 +-
 .../ld-arm/thumb1-noread-present-one-section.s     |  2 +-
 .../ld-arm/thumb1-noread-present-two-section.s     |  4 +--
 18 files changed, 163 insertions(+), 18 deletions(-)

diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index ed99d92..739393d 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,8 @@
+2016-01-20  Mickael Guene  <mickael.guene@st.com>
+
+	* elf32-arm.c (elf32_arm_special_sections): Remove catch of noread
+	section using '.text.noread' pattern.
+
 2016-01-19  John Baldwin  <jhb@FreeBSD.org>
 
 	* elf.c (elfcore_grok_note): Recognize NT_FREEBSD_THRMISC notes.
diff --git a/bfd/elf32-arm.c b/bfd/elf32-arm.c
index 1c52526..39b6153 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 24e2afe..2d23f20 100644
--- a/binutils/ChangeLog
+++ b/binutils/ChangeLog
@@ -1,3 +1,14 @@
+2016-01-20  Mickael Guene  <mickael.guene@st.com>
+
+	* 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  <jhb@FreeBSD.org>
 
 	* readelf.c (get_freebsd_elfcore_note_type): Remove unused variable.
diff --git a/binutils/doc/binutils.texi b/binutils/doc/binutils.texi
index 771100e..b173732 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 fa991a9..3c94a76 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 b4aaf51..b3a28a8 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';
@@ -6007,6 +6010,11 @@ process_section_headers (FILE * file)
   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\
   W (write), A (alloc), X (execute), M (merge), S (strings)\n\
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
+
diff --git a/ld/ChangeLog b/ld/ChangeLog
index 67aad57..94b6f47 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,3 +1,11 @@
+2016-01-20  Mickael Guene  <mickael.guene@st.com>
+
+	* 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  <nickc@redhat.com>
 
 	* 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 ac7c89f..6f1ad62 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 ac7c89f..5b14873 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 4be37d2..203cfd5 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 a97f379..245ab25 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


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