On Fri, 2024-10-11 at 02:54 +0800, Xi Ruoyao wrote:
> At least two ports (hppa and loongarch) need to set SECTION_RELRO for
> .data.rel.ro{,.local} in section_type_flags (PR52999 and PR116887), and
> I cannot see a reason not to just set it in the generic code.
> 
> With this applied we can also remove the hppa-specific
> pa_section_type_flags in a future patch.
> 
> gcc/ChangeLog:
> 
>       PR target/116887
>       * varasm.cc (default_section_type_flags): Always set
>       SECTION_RELRO if name is .data.rel.ro{,.local}.
> 
> gcc/testsuite/ChangeLog:
> 
>       PR target/116887
>       * gcc.dg/pr116887.c: New test.

Ping.

> ---
> 
> Bootstrapped & regtested on x86_64-linux-gnu.  Ok for trunk?
> 
>  gcc/testsuite/gcc.dg/pr116887.c | 23 +++++++++++++++++++++++
>  gcc/varasm.cc                   | 10 ++++------
>  2 files changed, 27 insertions(+), 6 deletions(-)
>  create mode 100644 gcc/testsuite/gcc.dg/pr116887.c
> 
> diff --git a/gcc/testsuite/gcc.dg/pr116887.c
> b/gcc/testsuite/gcc.dg/pr116887.c
> new file mode 100644
> index 00000000000..b7255e09a18
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/pr116887.c
> @@ -0,0 +1,23 @@
> +/* { dg-do compile } */
> +/* { dg-options "-fpic" } */
> +
> +struct link_map
> +{
> +  struct link_map *l_next;
> +};
> +struct rtld_global
> +{
> +  struct link_map *_ns_loaded;
> +  char buf[4096];
> +  struct link_map _dl_rtld_map;
> +};
> +extern struct rtld_global _rtld_global;
> +static int _dlfo_main __attribute__ ((section (".data.rel.ro"),
> used));
> +void
> +_dlfo_process_initial (int ns)
> +{
> +  for (struct link_map *l = _rtld_global._ns_loaded; l != ((void
> *)0);
> +       l = l->l_next)
> +    if (l == &_rtld_global._dl_rtld_map)
> +      asm ("");
> +}
> diff --git a/gcc/varasm.cc b/gcc/varasm.cc
> index 4426e7ce6c6..aa450092ce5 100644
> --- a/gcc/varasm.cc
> +++ b/gcc/varasm.cc
> @@ -6863,6 +6863,9 @@ default_section_type_flags (tree decl, const
> char *name, int reloc)
>  
>    if (decl && TREE_CODE (decl) == FUNCTION_DECL)
>      flags = SECTION_CODE;
> +  else if (strcmp (name, ".data.rel.ro") == 0
> +        || strcmp (name, ".data.rel.ro.local") == 0)
> +    flags = SECTION_WRITE | SECTION_RELRO;
>    else if (decl)
>      {
>        enum section_category category
> @@ -6876,12 +6879,7 @@ default_section_type_flags (tree decl, const
> char *name, int reloc)
>       flags = SECTION_WRITE;
>      }
>    else
> -    {
> -      flags = SECTION_WRITE;
> -      if (strcmp (name, ".data.rel.ro") == 0
> -       || strcmp (name, ".data.rel.ro.local") == 0)
> -     flags |= SECTION_RELRO;
> -    }
> +    flags = SECTION_WRITE;
>  
>    if (decl && DECL_P (decl) && DECL_COMDAT_GROUP (decl))
>      flags |= SECTION_LINKONCE;

-- 
Xi Ruoyao <xry...@xry111.site>
School of Aerospace Science and Technology, Xidian University

Reply via email to