summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMark Wielaard <mark@klomp.org>2018-10-13 10:27:47 +0200
committerMark Wielaard <mark@klomp.org>2018-10-19 22:53:40 +0200
commiteee4269e53154daaf0251371aacd91ec5db3eb30 (patch)
tree7acbdb928e04115c4c79f08e81faedd798f84d76
parentc06ab0bbb4761a69d2f188675d21d1a9131e9ecb (diff)
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 <mark@klomp.org>
-rw-r--r--src/ChangeLog4
-rw-r--r--src/unstrip.c14
2 files changed, 18 insertions, 0 deletions
diff --git a/src/ChangeLog b/src/ChangeLog
index d151e0d9..5aa31fc7 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,7 @@
+2018-10-19 Mark Wielaard <mark@klomp.org>
+
+ * unstrip.c (copy_elided_sections): Renumber group section indexes.
+
2018-10-12 Mark Wielaard <mark@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 03a03462..2cfd3b37 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. */