Allows linker scripts to set the SEC_READONLY flag.
authorLuca Boccassi <luca.boccassi@microsoft.com>
Wed, 21 Jul 2021 13:32:03 +0000 (14:32 +0100)
committerNick Clifton <nickc@redhat.com>
Wed, 21 Jul 2021 13:36:02 +0000 (14:36 +0100)
* ld.texi: Document new output section type.
* ldgram.y: Add new token.
* ldlang.c: Handle the new flag.
* ldlang.h: Add readonly_section to list of section types.
* ldlex.l: Add a new identifier.
* testsuite/ld-scripts/output-section-types.t: New example linker script.
* testsuite/ld-scripts/output-section-types.d: Test driver.
* testsyute/ld-scripts/script.exp: Run the new test.

ld/ld.texi
ld/ldgram.y
ld/ldlang.c
ld/ldlang.h
ld/ldlex.l
ld/testsuite/ld-scripts/output-section-types.d [new file with mode: 0644]
ld/testsuite/ld-scripts/output-section-types.t [new file with mode: 0644]
ld/testsuite/ld-scripts/script.exp

index b6d8dccea0bc18f8ff44d83fdb7a3ef4bd18821b..60bb071fb79043e7cdef9f59b3b06f72b145a73f 100644 (file)
@@ -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
index dd911f461693292042f798a86fd5b3d8b1feee19..31e0071c6fc92ad4988b3b913fad6e1e241871ed 100644 (file)
@@ -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:
index 37b64c89ee1d48b10647a07996a21d1f27ecf59a..2610be995cad0e960a494dffe77bf511efc4dd26 100644 (file)
@@ -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)
index 6fbe16d97d9594ab2436836e8076c72ac058d107..f68ae27b409aee839a7bf1887bb46f728f36cdd3 100644 (file)
@@ -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
index c1b15263587dae424e33c3e0dc709746be332a90..25b4bcaae01daf319a8399324a497263bb90c30e 100644 (file)
@@ -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);}
diff --git a/ld/testsuite/ld-scripts/output-section-types.d b/ld/testsuite/ld-scripts/output-section-types.d
new file mode 100644 (file)
index 0000000..ab124fa
--- /dev/null
@@ -0,0 +1,13 @@
+#ld: -Toutput-section-types.t
+#source: align2a.s
+#objdump: -h
+#target: [is_elf_format]
+
+#...
+  . \.rom.*
+[      ]+ALLOC, READONLY
+  . \.ro.*
+[      ]+CONTENTS, ALLOC, LOAD, READONLY, DATA
+  . \.over.*
+[      ]+CONTENTS, READONLY
+#pass
diff --git a/ld/testsuite/ld-scripts/output-section-types.t b/ld/testsuite/ld-scripts/output-section-types.t
new file mode 100644 (file)
index 0000000..d8fdfda
--- /dev/null
@@ -0,0 +1,7 @@
+SECTIONS {
+  .rom  (NOLOAD)   : { LONG(1234); }
+  .ro   (READONLY) : { LONG(5678); }
+  .over (OVERLAY)  : { LONG(0123); }
+  /DISCARD/        : { *(*) }
+
+}
index 961cd08c4b15dd7763396070c286181fa6ea16e4..ff50199b3aec05aae844d263545f661dcabc1f53 100644 (file)
@@ -229,6 +229,7 @@ foreach test_script $test_script_list {
 
 run_dump_test "align-with-input"
 run_dump_test "pr20302"
+run_dump_test "output-section-types"
 
 run_dump_test "segment-start" {{name (default)}}
 run_dump_test "segment-start" {{name (overridden)} \