Hi Aaron,

On Tue, Nov 05, 2024 at 05:53:38PM -0500, Aaron Merey wrote:
> strip --reloc-debug-sections-only is expected to be a no-op for
> non-ET_REL files.  This was not enforced in the code.  Sections
> were copied over to a new output file and normally its contents
> would be identical to the input file.
> 
> However the output file is not identical to a non-ET_REL input
> file if the linker organized sections such that the indices of
> SHF_ALLOC sections are not in a contigous group.
> 
> In this case strip will modify sections in order to keep all SHF_ALLOC
> sections in a contiguous group.
> 
> Fix this by ignoring --reloc-debug-sections-only for non-ET_REL files.
> 
> https://sourceware.org/bugzilla/show_bug.cgi?id=32253
> 
> Signed-off-by: Aaron Merey <ame...@redhat.com>
> ---
>  src/strip.c | 7 +++++++
>  1 file changed, 7 insertions(+)
> 
> diff --git a/src/strip.c b/src/strip.c
> index 403e0f6f..3812fb17 100644
> --- a/src/strip.c
> +++ b/src/strip.c
> @@ -1139,6 +1139,13 @@ handle_elf (int fd, Elf *elf, const char *prefix, 
> const char *fname,
>  
>    if (reloc_debug_only)
>      {
> +      if (ehdr->e_type != ET_REL)
> +     {
> +       /* Only ET_REL files should have debug relocations to remove.  */
> +       error (0, 0, _("Ignoring --reloc-debug-sections-only for " \
> +                      "non-ET_REL file '%s'"), fname);
> +       goto fail_close;
> +     }

Do we have to fail here?  I think it is nicer for the user to just
turn this into an warning with

if (ehdr->e_type != ET_REL) else if (handle_debug_relocs (...))

>        if (handle_debug_relocs (elf, ebl, newelf, ehdr, fname, shstrndx,
>                              &lastsec_offset, &lastsec_size) != 0)
>       {

Cheers,

Mark

Reply via email to