.debug dwo sections can include the SHF_EXCLUDE flag to indicate that
the linker shouldn't process them. Also a .debug_str.dwo section is
like a normal .debug_str section. There is no .debug_line_str.dwo
section, so that doesn't need special casing..
Add some dwo files to run-elflint-test.sh to make sure debug files
with .dwo sections aren't flagged by eu-elflint with --gnu --debug.
* src/elflint.c (special_sections): Add .debug_str.dwo.
(IS_DEBUG_DWO): New macro.
(check_sections): For IS_DEBUG_DWO files allow SHF_EXCLUDE.
* tests/run-elflint-test.sh: Add .dwo testfiles.
Signed-off-by: Mark Wielaard <[email protected]>
---
src/elflint.c | 17 +++++++++++++----
tests/run-elflint-test.sh | 8 ++++++++
2 files changed, 21 insertions(+), 4 deletions(-)
diff --git a/src/elflint.c b/src/elflint.c
index a05f37d166ea..9e1180af67ce 100644
--- a/src/elflint.c
+++ b/src/elflint.c
@@ -3686,6 +3686,7 @@ static const struct
{ ".data", 6, SHT_PROGBITS, exact, SHF_ALLOC | SHF_WRITE, 0 },
{ ".data1", 7, SHT_PROGBITS, exact, SHF_ALLOC | SHF_WRITE, 0 },
{ ".debug_str", 11, SHT_PROGBITS, exact_or_gnuld, SHF_MERGE | SHF_STRINGS,
0 },
+ { ".debug_str.dwo", 15, SHT_PROGBITS, exact_or_gnuld, SHF_MERGE |
SHF_STRINGS, 0 },
{ ".debug_line_str", 16, SHT_PROGBITS, exact_or_gnuld, SHF_MERGE |
SHF_STRINGS, 0 },
{ ".debug", 6, SHT_PROGBITS, exact, 0, 0 },
{ ".dynamic", 9, SHT_DYNAMIC, atleast, SHF_ALLOC, SHF_WRITE },
@@ -3734,6 +3735,10 @@ static const struct
&& !memcmp (special_sections[idx].name, string, \
sizeof string - (prefix ? 1 : 0)))
+#define IS_DEBUG_DWO(name) \
+ (startswith (name, ".debug_") \
+ && strcmp (name + strlen (name) - 4, ".dwo") == 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 \
@@ -3856,10 +3861,14 @@ 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, retain, group bit and
- compression flag all the other bits should
- match exactly. */
- if ((shdr->sh_flags & ~EXTRA_SHFLAGS)
+ /* Except for the link order, retain, group bit
+ and compression flag all the other bits should
+ match exactly. .debug.dwo sections can also be
+ SHF_EXCLUDE. */
+ GElf_Word extra_shflags = EXTRA_SHFLAGS;
+ if (IS_DEBUG_DWO (scnname))
+ extra_shflags |= SHF_EXCLUDE;
+ if ((shdr->sh_flags & ~extra_shflags)
!= special_sections[s].attr
&& (special_sections[s].attrflag == exact || !gnuld))
ERROR (_("\
diff --git a/tests/run-elflint-test.sh b/tests/run-elflint-test.sh
index caf172a61631..41b531ee3c91 100755
--- a/tests/run-elflint-test.sh
+++ b/tests/run-elflint-test.sh
@@ -57,4 +57,12 @@ tempfiles testfile-s390x-hash-bothz
testrun ${abs_top_builddir}/src/elfcompress -f -q --name='.s??tab' -o
testfile-s390x-hash-bothz testfile-s390x-hash-both
testrun ${abs_top_builddir}/src/elflint -q --gnu-ld testfile-s390x-hash-bothz
+# Recognize debug dwo sections
+testfiles testfile-hello4.dwo testfile-world4.dwo
+testfiles testfile-hello5.dwo testfile-world5.dwo
+testrun ${abs_top_builddir}/src/elflint -q --gnu --debug \
+ testfile-hello4.dwo testfile-world4.dwo
+testrun ${abs_top_builddir}/src/elflint -q --gnu --debug \
+ testfile-hello5.dwo testfile-world5.dwo
+
exit 0
--
2.53.0