diff --git a/binutils-ld-read-only-script.patch b/binutils-ld-read-only-script.patch new file mode 100644 index 0000000..481b387 --- /dev/null +++ b/binutils-ld-read-only-script.patch @@ -0,0 +1,158 @@ +From a0b911576eb49e06a457ebf757b42543d2c7e548 Mon Sep 17 00:00:00 2001 +From: Luca Boccassi +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 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\[\]\-\!\^\\]|::)* + "SORT_BY_INIT_PRIORITY" { RTOKEN(SORT_BY_INIT_PRIORITY); } + "SORT_NONE" { RTOKEN(SORT_NONE); } + "NOLOAD" { RTOKEN(NOLOAD);} ++"READONLY" { RTOKEN(READONLY);} + "DSECT" { RTOKEN(DSECT);} + "COPY" { RTOKEN(COPY);} + "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 + diff --git a/binutils.spec b/binutils.spec index 5192bd2..8c7d5db 100644 --- a/binutils.spec +++ b/binutils.spec @@ -313,6 +313,10 @@ Patch24: binutils-gas-Use-the-directory-name-in-.file-0.patch # Lifetime: Fixed in 2.38. Patch25: binutils.unicode.patch +# Purpose: Add ability to create read-only notes via linker scripts +# Lifetime: Fixed in 2.38. +Patch26: binutils-ld-read-only-script.patch + #---------------------------------------------------------------------------- Provides: bundled(libiberty)