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