[v2] ld: add READONLY attribute for SECTIONS

Message ID 20210721103205.3575996-1-luca.boccassi@gmail.com
State New
Headers show
Series
  • [v2] ld: add READONLY attribute for SECTIONS
Related show

Commit Message

Libor Bukata via Binutils July 21, 2021, 10:32 a.m.
From: Luca Boccassi <luca.boccassi@microsoft.com>


Allows linker scripts to set the SEC_READONLY flag
---
Copyright assignment to the FSF completed, so refreshing and resending.

 ld/ld.texi  | 2 ++
 ld/ldgram.y | 2 ++
 ld/ldlang.c | 6 ++++++
 ld/ldlang.h | 3 ++-
 ld/ldlex.l  | 1 +
 5 files changed, 13 insertions(+), 1 deletion(-)

-- 
2.30.2

Comments

Libor Bukata via Binutils July 21, 2021, 1:36 p.m. | #1
Hi Luce,

> Allows linker scripts to set the SEC_READONLY flag


Patch approved and applied.

Cheers
   Nick
Fangrui Song July 25, 2021, 12:04 a.m. | #2
On 2021-07-21, Nick Clifton via Binutils wrote:
>Hi Luce,

>

>>Allows linker scripts to set the SEC_READONLY flag

>

>Patch approved and applied.

>

>Cheers

>  Nick

>


My question persists as of why READONLY is needed
https://sourceware.org/pipermail/binutils/2021-May/116579.html

SECTIONS
{
     .note.package : ALIGN(4) {
         BYTE(0x04) BYTE(0x00) BYTE(0x00) BYTE(0x00)
     }
} INSERT AFTER .note.gnu.build-id;

ld-new a.o -T a.lds --build-id -o a


.note.package doesn't have the SHF_WRITE flag. No need for READONLY.

Patch

diff --git a/ld/ld.texi b/ld/ld.texi
index b6d8dccea0b..60bb071fb79 100644
--- a/ld/ld.texi
+++ b/ld/ld.texi
@@ -5474,6 +5474,8 @@  parentheses.  The following types are defined:
 @item NOLOAD
 The section should be marked as not loadable, so that it will not be
 loaded into memory when the program is run.
+@item READONLY
+The section should be marked as read-only.
 @item DSECT
 @itemx COPY
 @itemx INFO
diff --git a/ld/ldgram.y b/ld/ldgram.y
index dd911f46169..31e0071c6fc 100644
--- a/ld/ldgram.y
+++ b/ld/ldgram.y
@@ -139,6 +139,7 @@  static int error_index;
 %token REGION_ALIAS
 %token LD_FEATURE
 %token NOLOAD DSECT COPY INFO OVERLAY
+%token READONLY
 %token DEFINED TARGET_K SEARCH_DIR MAP ENTRY
 %token <integer> NEXT
 %token SIZEOF ALIGNOF ADDR LOADADDR MAX_K MIN_K
@@ -1123,6 +1124,7 @@  type:
 	|  COPY    { sectype = noalloc_section; }
 	|  INFO    { sectype = noalloc_section; }
 	|  OVERLAY { sectype = noalloc_section; }
+	|  READONLY { sectype = readonly_section; }
 	;
 
 atype:
diff --git a/ld/ldlang.c b/ld/ldlang.c
index 37b64c89ee1..2610be995ca 100644
--- a/ld/ldlang.c
+++ b/ld/ldlang.c
@@ -2639,6 +2639,9 @@  lang_add_section (lang_statement_list_type *ptr,
     case noalloc_section:
       flags &= ~SEC_ALLOC;
       break;
+    case readonly_section:
+      flags |= SEC_READONLY;
+      break;
     case noload_section:
       flags &= ~SEC_LOAD;
       flags |= SEC_NEVER_LOAD;
@@ -4232,6 +4235,9 @@  map_input_to_output_sections
 	    case noalloc_section:
 	      flags = SEC_HAS_CONTENTS;
 	      break;
+	    case readonly_section:
+	      flags |= SEC_READONLY;
+	      break;
 	    case noload_section:
 	      if (bfd_get_flavour (link_info.output_bfd)
 		  == bfd_target_elf_flavour)
diff --git a/ld/ldlang.h b/ld/ldlang.h
index 6fbe16d97d9..f68ae27b409 100644
--- a/ld/ldlang.h
+++ b/ld/ldlang.h
@@ -121,7 +121,8 @@  enum section_type
   first_overlay_section,
   overlay_section,
   noload_section,
-  noalloc_section
+  noalloc_section,
+  readonly_section
 };
 
 /* This structure holds a list of program headers describing
diff --git a/ld/ldlex.l b/ld/ldlex.l
index c1b15263587..25b4bcaae01 100644
--- a/ld/ldlex.l
+++ b/ld/ldlex.l
@@ -294,6 +294,7 @@  V_IDENTIFIER [*?.$_a-zA-Z\[\]\-\!\^\\]([*?.$_a-zA-Z0-9\[\]\-\!\^\\]|::)*
 <BOTH,SCRIPT>"SORT_BY_INIT_PRIORITY"	{ RTOKEN(SORT_BY_INIT_PRIORITY); }
 <BOTH,SCRIPT>"SORT_NONE"		{ RTOKEN(SORT_NONE); }
 <EXPRESSION,BOTH,SCRIPT>"NOLOAD"	{ RTOKEN(NOLOAD);}
+<EXPRESSION,BOTH,SCRIPT>"READONLY"	{ RTOKEN(READONLY);}
 <EXPRESSION,BOTH,SCRIPT>"DSECT"		{ RTOKEN(DSECT);}
 <EXPRESSION,BOTH,SCRIPT>"COPY"		{ RTOKEN(COPY);}
 <EXPRESSION,BOTH,SCRIPT>"INFO"		{ RTOKEN(INFO);}