[PATCH] ld: add READONLY attribute for SECTIONS

Fangrui Song i@maskray.me
Wed May 12 05:05:33 GMT 2021


On Mon, May 10, 2021 at 7:47 AM luca.boccassi--- via Binutils
<binutils@sourceware.org> wrote:
>
> From: Luca Boccassi <luca.boccassi@microsoft.com>
>
> Allows linker scripts to set the SEC_READONLY flag.
>
> Before:
>
>   3 .note.package 0000004c  0000000000000308  0000000000000308  00000308  2**2
>                   CONTENTS, ALLOC, LOAD, DATA
>
> After:
>
>   3 .note.package 0000004c  0000000000000308  0000000000000308  00000308  2**2
>                   CONTENTS, ALLOC, LOAD, READONLY, DATA
>
> Linker script:
>
> SECTIONS
> {
>     .note.package (READONLY) : ALIGN(4) {
>         BYTE(0x04) BYTE(0x00) BYTE(0x00) BYTE(0x00) /* Length of Owner including NUL */
>         BYTE(0x39) BYTE(0x00) BYTE(0x00) BYTE(0x00) /* Length of Value including NUL */
>         BYTE(0x7e) BYTE(0x1a) BYTE(0xfe) BYTE(0xca) /* Note ID */
>         BYTE(0x46) BYTE(0x44) BYTE(0x4f) BYTE(0x00) /* Owner: 'FDO\x00' */
>         BYTE(0x7b) BYTE(0x22) BYTE(0x74) BYTE(0x79)
>         BYTE(0x70) BYTE(0x65) BYTE(0x22) BYTE(0x3a)
>         BYTE(0x22) BYTE(0x64) BYTE(0x65) BYTE(0x62)
>         BYTE(0x22) BYTE(0x2c) BYTE(0x22) BYTE(0x6e)
>         BYTE(0x61) BYTE(0x6d) BYTE(0x65) BYTE(0x22)
>         BYTE(0x3a) BYTE(0x22) BYTE(0x66) BYTE(0x73)
>         BYTE(0x76) BYTE(0x65) BYTE(0x72) BYTE(0x69)
>         BYTE(0x74) BYTE(0x79) BYTE(0x2d) BYTE(0x75)
>         BYTE(0x74) BYTE(0x69) BYTE(0x6c) BYTE(0x73)
>         BYTE(0x22) BYTE(0x2c) BYTE(0x22) BYTE(0x76)
>         BYTE(0x65) BYTE(0x72) BYTE(0x73) BYTE(0x69)
>         BYTE(0x6f) BYTE(0x6e) BYTE(0x22) BYTE(0x3a)
>         BYTE(0x22) BYTE(0x31) BYTE(0x2e) BYTE(0x33)
>         BYTE(0x2d) BYTE(0x31) BYTE(0x22) BYTE(0x7d)
>         BYTE(0x00) BYTE(0x00) BYTE(0x00) BYTE(0x00)
>     }
> }
> INSERT AFTER .note.gnu.build-id;
>
> ---
>  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(-)
>
> diff --git a/ld/ld.texi b/ld/ld.texi
> index fe653daacd7..a7f2267308d 100644
> --- a/ld/ld.texi
> +++ b/ld/ld.texi
> @@ -5440,6 +5440,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);}
> --
> 2.29.2
>

Do we need this? .note.package does not have the SHF_WRITE flag even
without the new keyword
https://sourceware.org/bugzilla/show_bug.cgi?id=26378

It is also odd to introduce a "readonly" concept instead of a "write".


More information about the Binutils mailing list