public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc(refs/vendors/ARM/heads/morello)] Section attribute and RELRO handling
@ 2022-05-05 12:05 Matthew Malcomson
0 siblings, 0 replies; only message in thread
From: Matthew Malcomson @ 2022-05-05 12:05 UTC (permalink / raw)
To: gcc-cvs
https://gcc.gnu.org/g:407e0b5441f9d544549753228bf0ba9aeb22ce53
commit 407e0b5441f9d544549753228bf0ba9aeb22ce53
Author: Matthew Malcomson <matthew.malcomson@arm.com>
Date: Fri Apr 8 17:20:35 2022 +0100
Section attribute and RELRO handling
If the user requests a specific section for a variable, GCC determines
whether that section should be readonly, relro, or writeable based
mainly on the properties of that decl (e.g. whether it is const or not).
Glibc requests that some non-const variables are put in the .data.rel.ro
section. This is valid in the part of glibc that uses it, since glibc
wants to assign to these variables before the `mprotect` call which
turns that section to readonly.
Due to the extra use of the .data.rel.ro section in Morello GCC when
creating variables to be initialised as capabilities by the runtime, we
end up using the .data.rel.ro through default_elf_select_rtx_section.
In this case, default_elf_select_rtx_section explicitly requests the
.data.rel.ro section is marked as SECTION_RELRO.
This request for a SECTION_RELRO flag clashes with the earlier
determination that .data.rel.ro is SECTION_WRITE due to the non-const
decl we put in it. This triggers an error.
This patch adds an exception in `default_section_type_flags` so that if
we're trying to determine the section flags that we would like for a
DECL's section we account for if that section is named .data.rel.ro*.
Throughout GCC a sections name is quite strongly tied to the properties
that section will have. This patch ensures that the user can not break
that tie in ways that GCC can not handle.
Alternatives considered:
-- Override flags in `get_section` --
get_section already contains a clause to allow overwriting of a sections
flags from readonly to RELRO. We could add another condition allowing
the switch from WRITE to RELRO.
This seems a bit too lax. In general putting a non-const variable in a
RELRO section is invalid, it's only in the special case inside glibc
before the RELRO section has been made invalid that this is OK.
-- Allow specifying RELRO as an argument in an attribute --
This approach seems problematic since the compiler can not determine
whether a section is RELRO or not. That property is imparted to a
section by the linker script.
Allowing the user to mark a section as RELRO could therefore cause
confusion where the user requests something and the resulting binary
does not have that behaviour.
-- Allow specifying all flags (not just RELRO) --
This approach would raise questions about how to specify the flags
(especially given that different targets have different avaialable
flags).
It would also break the strong tie between section name and section
flags. Until now the only section flags that we took from the DECL were
to do with the readonly / RELRO / WRITE option. Changing this seems
like it would add unnecessary complexity for the motivating case of
specifying a RELRO section.
Diff:
---
.../gcc.target/aarch64/morello/relro-attribute-accepted.c | 6 ++++++
gcc/varasm.c | 10 ++++------
2 files changed, 10 insertions(+), 6 deletions(-)
diff --git a/gcc/testsuite/gcc.target/aarch64/morello/relro-attribute-accepted.c b/gcc/testsuite/gcc.target/aarch64/morello/relro-attribute-accepted.c
new file mode 100644
index 00000000000..b71acbaea3b
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/morello/relro-attribute-accepted.c
@@ -0,0 +1,6 @@
+static __uintcap_t testvar __attribute__ ((section (".data.rel.ro")));
+int main()
+{
+ testvar = 1;
+ return 0;
+}
diff --git a/gcc/varasm.c b/gcc/varasm.c
index 029a1e9fbac..b52b8ab6a5d 100644
--- a/gcc/varasm.c
+++ b/gcc/varasm.c
@@ -6669,12 +6669,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;
@@ -6694,6 +6689,9 @@ default_section_type_flags (tree decl, const char *name, int reloc)
|| strncmp (name, ".gnu.linkonce.sb.", 17) == 0)
flags |= SECTION_BSS;
+ if (strncmp (name, ".data.rel.ro", 12) == 0)
+ flags |= SECTION_WRITE | SECTION_RELRO;
+
if (strcmp (name, ".tdata") == 0
|| strncmp (name, ".tdata.", 7) == 0
|| strncmp (name, ".gnu.linkonce.td.", 17) == 0)
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2022-05-05 12:05 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-05-05 12:05 [gcc(refs/vendors/ARM/heads/morello)] Section attribute and RELRO handling Matthew Malcomson
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).