After a bit more testing found one other issue.
It can happen that the section indexes in the group need to be
renumbered when eu-unstrip puts the stripped and debug file together
again. So we need to explicitly do that.
commit eee4269e53154daaf0251371aacd91ec5db3eb30
Author: Mark Wielaard <m...@klomp.org>
Date:   Sat Oct 13 10:27:47 2018 +0200

    unstrip: Renumber the group section indexes.
    
    When unstripping we might need to renumber the group section indexes.
    Just like we do when stripping.
    
    Signed-off-by: Mark Wielaard <m...@klomp.org>

diff --git a/src/ChangeLog b/src/ChangeLog
index d151e0d..5aa31fc 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,7 @@
+2018-10-19  Mark Wielaard  <m...@klomp.org>
+
+	* unstrip.c (copy_elided_sections): Renumber group section indexes.
+
 2018-10-12  Mark Wielaard  <m...@klomp.org>
 
 	* strip.c (handle_elf): Don't remove SHF_GROUP flag from sections.
diff --git a/src/unstrip.c b/src/unstrip.c
index 03a0346..2cfd3b3 100644
--- a/src/unstrip.c
+++ b/src/unstrip.c
@@ -1708,6 +1708,20 @@ more sections in stripped file than debug file -- arguments reversed?"));
 	    if (shdr_mem.sh_type == SHT_DYNSYM)
 	      stripped_dynsym = sec;
 	  }
+
+	if (shdr_mem.sh_type == SHT_GROUP)
+	  {
+	    /* We must adjust all the section indices in the group.
+	       Skip the first word, which is the section group flag.
+	       Everything else is a section index.  */
+	    Elf32_Word *shndx = (Elf32_Word *) outdata->d_buf;
+	    for (size_t i = 1; i < shdr_mem.sh_size / sizeof (Elf32_Word); ++i)
+	      if (shndx[i]  == SHN_UNDEF || shndx[i] >= stripped_shnum)
+		error (EXIT_FAILURE, 0,
+		       _("group has invalid section index [%zd]"), i);
+	      else
+		shndx[i] = ndx_section[shndx[i] - 1];
+	  }
       }
 
   /* We may need to update the symbol table.  */

Reply via email to