> 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). > > Signed-off-by: Jose E. Marchesi <jose.march...@oracle.com> OK, so you cannot really check this through check_special_section because you need access to the dynamic section to check whether this is really is the special section we are looking for. And .dynamic is also nobits in a debuginfo file. So we cannot verify. I think we should at least also check that the section itself is NOBITS in that case.
What about this. commit 01b4f63005dd55632f49373a1d9ffe60acb9c211 Author: Jose E. Marchesi <jose.march...@oracle.com> Date: Tue Oct 13 12:40:44 2015 -0400 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.march...@oracle.com> Conflicts: src/ChangeLog diff --git a/src/ChangeLog b/src/ChangeLog index 796878f..0f4ce33 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,9 @@ +2015-10-13 Jose E. Marchesi <jose.march...@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-07 Mark Wielaard <m...@redhat.com> * Makefile.am (ldlex_no_Wstack_usage): New. diff --git a/src/elflint.c b/src/elflint.c index fac457e..9683c1c 100644 --- a/src/elflint.c +++ b/src/elflint.c @@ -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)