[PATCH] elflint: Recognize SHF_GNU_RETAIN as extra section flag.

Mark Wielaard mark@klomp.org
Tue Jan 12 10:37:01 GMT 2021


SHF_GNU_RETAIN is like SHF_LINK_ORDER it can appear on any section
and should be ignored by elflint. Add all such flags to a new
EXTRA_SHFLAGS and use it consistently in check_sections.

Signed-off-by: Mark Wielaard <mark@klomp.org>
---
 src/ChangeLog |  8 +++++++-
 src/elflint.c | 21 +++++++++++++--------
 2 files changed, 20 insertions(+), 9 deletions(-)

diff --git a/src/ChangeLog b/src/ChangeLog
index 62aaad8f..bd76256e 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,6 +1,12 @@
+2021-01-12  Mark Wielaard  <mark@klomp.org>
+
+	* elflint.c (EXTRA_SHFLAGS): New define.
+	(check_sections): Use EXTRA_SHFLAGS. Add SHF_GNU_RETAIN to
+	ALL_SH_FLAGS.
+
 2020-12-31  Sergei Trofimovich  <slyfox@gentoo.org>
 
-	* elflint.c (srction_flags_string): Add NEWFLAG for GNU_RETAIN,
+	* elflint.c (section_flags_string): Add NEWFLAG for GNU_RETAIN,
 	ORDERED and EXCLUDE.
 
 2020-12-31  Sergei Trofimovich  <slyfox@gentoo.org>
diff --git a/src/elflint.c b/src/elflint.c
index dcf7e199..6a946838 100644
--- a/src/elflint.c
+++ b/src/elflint.c
@@ -3681,6 +3681,13 @@ static const struct
    && !memcmp (special_sections[idx].name, string, \
 	       sizeof string - (prefix ? 1 : 0)))
 
+/* Extra section flags that might or might not be added to the section
+   and have to be ignored.  */
+#define EXTRA_SHFLAGS (SHF_LINK_ORDER \
+		       | SHF_GNU_RETAIN \
+		       | SHF_GROUP \
+		       | SHF_COMPRESSED)
+
 
 /* Indices of some sections we need later.  */
 static size_t eh_frame_hdr_scnndx;
@@ -3796,11 +3803,10 @@ section [%2d] '%s' has wrong type: expected %s, is %s\n"),
 		if (special_sections[s].attrflag == exact
 		    || special_sections[s].attrflag == exact_or_gnuld)
 		  {
-		    /* Except for the link order, group bit and
+		    /* Except for the link order, retain, group bit and
 		       compression flag all the other bits should
 		       match exactly.  */
-		    if ((shdr->sh_flags
-			 & ~(SHF_LINK_ORDER | SHF_GROUP | SHF_COMPRESSED))
+		    if ((shdr->sh_flags & ~EXTRA_SHFLAGS)
 			!= special_sections[s].attr
 			&& (special_sections[s].attrflag == exact || !gnuld))
 		      ERROR (_("\
@@ -3809,7 +3815,7 @@ section [%2zu] '%s' has wrong flags: expected %s, is %s\n"),
 			     section_flags_string (special_sections[s].attr,
 						   stbuf1, sizeof (stbuf1)),
 			     section_flags_string (shdr->sh_flags
-						   & ~SHF_LINK_ORDER,
+						   & ~EXTRA_SHFLAGS,
 						   stbuf2, sizeof (stbuf2)));
 		  }
 		else if (special_sections[s].attrflag == atleast)
@@ -3817,7 +3823,7 @@ section [%2zu] '%s' has wrong flags: expected %s, is %s\n"),
 		    if ((shdr->sh_flags & special_sections[s].attr)
 			!= special_sections[s].attr
 			|| ((shdr->sh_flags
-			     & ~(SHF_LINK_ORDER | SHF_GROUP | SHF_COMPRESSED
+			     & ~(EXTRA_SHFLAGS
 				 | special_sections[s].attr
 				 | special_sections[s].attr2))
 			    != 0))
@@ -3829,8 +3835,7 @@ section [%2zu] '%s' has wrong flags: expected %s and possibly %s, is %s\n"),
 			     section_flags_string (special_sections[s].attr2,
 						   stbuf2, sizeof (stbuf2)),
 			     section_flags_string (shdr->sh_flags
-						   & ~(SHF_LINK_ORDER
-						       | SHF_GROUP),
+						   & ~EXTRA_SHFLAGS,
 						   stbuf3, sizeof (stbuf3)));
 		  }
 
@@ -3923,7 +3928,7 @@ section [%2zu] '%s': size not multiple of entry size\n"),
 #define ALL_SH_FLAGS (SHF_WRITE | SHF_ALLOC | SHF_EXECINSTR | SHF_MERGE \
 		      | SHF_STRINGS | SHF_INFO_LINK | SHF_LINK_ORDER \
 		      | SHF_OS_NONCONFORMING | SHF_GROUP | SHF_TLS \
-		      | SHF_COMPRESSED)
+		      | SHF_COMPRESSED | SHF_GNU_RETAIN)
       if (shdr->sh_flags & ~(GElf_Xword) ALL_SH_FLAGS)
 	{
 	  GElf_Xword sh_flags = shdr->sh_flags & ~(GElf_Xword) ALL_SH_FLAGS;
-- 
2.18.4



More information about the Elfutils-devel mailing list