f2871776ca
Resolves: #2171926
159 lines
5.2 KiB
Diff
159 lines
5.2 KiB
Diff
From a0b911576eb49e06a457ebf757b42543d2c7e548 Mon Sep 17 00:00:00 2001
|
|
From: Luca Boccassi <luca.boccassi@microsoft.com>
|
|
Date: Wed, 21 Jul 2021 14:32:03 +0100
|
|
Subject: [PATCH] Allows linker scripts to set the SEC_READONLY flag.
|
|
|
|
* 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.
|
|
|
|
(cherry picked from commit 6b86da53d5ee2022b9065f445d23356190380746)
|
|
---
|
|
ld/ld.texi | 2 ++
|
|
ld/ldgram.y | 2 ++
|
|
ld/ldlang.c | 6 ++++++
|
|
ld/ldlang.h | 3 ++-
|
|
ld/ldlex.l | 1 +
|
|
ld/testsuite/ld-scripts/output-section-types.d | 13 +++++++++++++
|
|
ld/testsuite/ld-scripts/output-section-types.t | 7 +++++++
|
|
ld/testsuite/ld-scripts/script.exp | 1 +
|
|
8 files changed, 34 insertions(+), 1 deletion(-)
|
|
create mode 100644 ld/testsuite/ld-scripts/output-section-types.d
|
|
create mode 100644 ld/testsuite/ld-scripts/output-section-types.t
|
|
|
|
diff --git a/ld/ld.texi b/ld/ld.texi
|
|
index dd8f571d4e4..cf1e637adbf 100644
|
|
--- a/ld/ld.texi
|
|
+++ b/ld/ld.texi
|
|
@@ -5456,6 +5456,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);}
|
|
diff --git a/ld/testsuite/ld-scripts/output-section-types.d b/ld/testsuite/ld-scripts/output-section-types.d
|
|
new file mode 100644
|
|
index 00000000000..ab124fa4dd7
|
|
--- /dev/null
|
|
+++ b/ld/testsuite/ld-scripts/output-section-types.d
|
|
@@ -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
|
|
index 00000000000..d8fdfda1a03
|
|
--- /dev/null
|
|
+++ b/ld/testsuite/ld-scripts/output-section-types.t
|
|
@@ -0,0 +1,7 @@
|
|
+SECTIONS {
|
|
+ .rom (NOLOAD) : { LONG(1234); }
|
|
+ .ro (READONLY) : { LONG(5678); }
|
|
+ .over (OVERLAY) : { LONG(0123); }
|
|
+ /DISCARD/ : { *(*) }
|
|
+
|
|
+}
|
|
diff --git a/ld/testsuite/ld-scripts/script.exp b/ld/testsuite/ld-scripts/script.exp
|
|
index 961cd08c4b1..ff50199b3ae 100644
|
|
--- a/ld/testsuite/ld-scripts/script.exp
|
|
+++ b/ld/testsuite/ld-scripts/script.exp
|
|
@@ -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)} \
|
|
--
|
|
2.30.2
|
|
|