diff options
| author | Jose E. Marchesi <[email protected]> | 2015-10-13 18:39:15 +0200 |
|---|---|---|
| committer | Mark Wielaard <[email protected]> | 2015-10-13 19:42:19 +0200 |
| commit | bc119074c2fadf5288ab8e635a930aac496282d7 (patch) | |
| tree | d5e6c88745f09fd4a3e9a5cd352797e7e2530484 /src/elflint.c | |
| parent | b9be1434ff0a4ce9ebe80fcda5c6a9891904b26e (diff) | |
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 <[email protected]>
Diffstat (limited to 'src/elflint.c')
| -rw-r--r-- | src/elflint.c | 18 |
1 files changed, 13 insertions, 5 deletions
diff --git a/src/elflint.c b/src/elflint.c index 63192bbd..0a6f0df3 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) |
