From: Mark Wielaard Date: Tue, 5 Nov 2013 15:27:32 +0000 (+0100) Subject: libelf: Write all section headers if elf flags contains ELF_F_DIRTY. X-Git-Tag: elfutils-0.158~78 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=88ad5ddb71bd1fa8ed043a840157ebf23c0057b3;p=thirdparty%2Felfutils.git libelf: Write all section headers if elf flags contains ELF_F_DIRTY. When ehdr e_shoff changes, elf flags is set dirty. This indicates that the section header moved because sections were added/removed or changed in size. Reported-by: Jiri Slaby Signed-off-by: Mark Wielaard --- diff --git a/libelf/ChangeLog b/libelf/ChangeLog index c2c5fc420..a996ccf6f 100644 --- a/libelf/ChangeLog +++ b/libelf/ChangeLog @@ -1,3 +1,8 @@ +2013-11-05 Mark Wielaard + + * elf32_updatefile.c (elfXX_updatefile): Copy all section headers + if elf->flags dirty. + 2013-11-01 Michael Forney * Makefile.am: Use READELF. diff --git a/libelf/elf32_updatefile.c b/libelf/elf32_updatefile.c index 296b1ac9d..c4af9c020 100644 --- a/libelf/elf32_updatefile.c +++ b/libelf/elf32_updatefile.c @@ -633,7 +633,8 @@ __elfw2(LIBELFBITS,updatefile) (Elf *elf, int change_bo, size_t shnum) #endif ElfW2(LIBELFBITS,Shdr) *shdr_data; - if (change_bo || elf->state.ELFW(elf,LIBELFBITS).shdr == NULL) + if (change_bo || elf->state.ELFW(elf,LIBELFBITS).shdr == NULL + || (elf->flags & ELF_F_DIRTY)) shdr_data = (ElfW2(LIBELFBITS,Shdr) *) alloca (shnum * sizeof (ElfW2(LIBELFBITS,Shdr))); else @@ -764,7 +765,8 @@ __elfw2(LIBELFBITS,updatefile) (Elf *elf, int change_bo, size_t shnum) (*shdr_fctp) (&shdr_data[scn->index], scn->shdr.ELFW(e,LIBELFBITS), sizeof (ElfW2(LIBELFBITS,Shdr)), 1); - else if (elf->state.ELFW(elf,LIBELFBITS).shdr == NULL) + else if (elf->state.ELFW(elf,LIBELFBITS).shdr == NULL + || (elf->flags & ELF_F_DIRTY)) memcpy (&shdr_data[scn->index], scn->shdr.ELFW(e,LIBELFBITS), sizeof (ElfW2(LIBELFBITS,Shdr)));