From: Mark Wielaard Date: Thu, 9 Apr 2026 12:40:44 +0000 (+0200) Subject: elflint: Recognize debug dwo sections X-Git-Tag: elfutils-0.195~12 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=11c0b56a36e00bae043c690af758a190c2eb97ba;p=thirdparty%2Felfutils.git elflint: Recognize debug dwo sections .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 --- diff --git a/src/elflint.c b/src/elflint.c index a05f37d1..9e1180af 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 caf172a6..41b531ee 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