diff options
author | Mark Wielaard <mark@klomp.org> | 2018-10-13 10:27:47 +0200 |
---|---|---|
committer | Mark Wielaard <mark@klomp.org> | 2018-10-19 22:53:40 +0200 |
commit | eee4269e53154daaf0251371aacd91ec5db3eb30 (patch) | |
tree | 7acbdb928e04115c4c79f08e81faedd798f84d76 | |
parent | c06ab0bbb4761a69d2f188675d21d1a9131e9ecb (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/ChangeLog | 4 | ||||
-rw-r--r-- | src/unstrip.c | 14 |
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. */ |