Do not rely on ebl_check_special_section when checking debuginfo files.

The test run-strip-strmerge.sh is failing in sparc targets.  This is
because it does an `elflint -d' in a debuginfo file, and this fails
with:

  section [21] '.plt' is both executable and writable

elflint uses the ebl_check_special_section hook (implemented only by
the alpha and sparc backends) in order to determine whether an
executable+writable section must be flagged or not.  In both cases the
hook will fail analyzing eu-strip debuginfo files (as they should,
because debuginfo files are broken ;).

This patch just modifies elflint to not use the hook when -d is
specified in the command-line.  This fixes the test in sparc-* and
sparc64-* targets (and presumably in alpha* targets too).

Additionaly, the patch checks that the type of WE sections in
debuginfo files is NOBITS.

Signed-off-by: Jose E. Marchesi <jose.marchesi@oracle.com>
This commit is contained in:
Jose E. Marchesi
2015-10-13 18:39:15 +02:00
committed by Mark Wielaard
parent b9be1434ff
commit bc119074c2
2 changed files with 19 additions and 5 deletions
+6
View File
@@ -1,3 +1,9 @@
2015-10-13 Jose E. Marchesi <jose.marchesi@oracle.com>
* elflint.c (check_sections): Do not rely on
ebl_check_special_section when checking debuginfo files. Also
check that the type of WE sections in debuginfo files is NOBITS.
2015-10-13 Mark Wielaard <mjw@redhat.com>
* elflint.c (check_program_header): Check relro flags are a subset
+13 -5
View File
@@ -3938,12 +3938,20 @@ section [%2zu] '%s' has unexpected type %d for an executable section\n"),
break;
}
if ((shdr->sh_flags & SHF_WRITE)
&& !ebl_check_special_section (ebl, cnt, shdr,
section_name (ebl, cnt)))
ERROR (gettext ("\
if (shdr->sh_flags & SHF_WRITE)
{
if (is_debuginfo && shdr->sh_type != SHT_NOBITS)
ERROR (gettext ("\
section [%2zu] '%s' must be of type NOBITS in debuginfo files\n"),
cnt, section_name (ebl, cnt));
if (!is_debuginfo
&& !ebl_check_special_section (ebl, cnt, shdr,
section_name (ebl, cnt)))
ERROR (gettext ("\
section [%2zu] '%s' is both executable and writable\n"),
cnt, section_name (ebl, cnt));
cnt, section_name (ebl, cnt));
}
}
if (ehdr->e_type != ET_REL && (shdr->sh_flags & SHF_ALLOC) != 0)