Update to ELF Tool Chain r3477

This fixes a EFI/PE header issue that prevented elfcopy-produced .efi
files from working with Secure Boot:

  Make sure section raw size is always padded to multiple of
  FileAlignment from the optional header, as requested by the PE
  specification. This change should reduce the diff between PE image
  generated by Binutils objcopy and elftoolchain elfcopy.

Submitted by:	kaiw
Reported by:	ambrisko
This commit is contained in:
Ed Maste 2016-05-25 20:56:30 +00:00
commit d38447b51d
2 changed files with 10 additions and 12 deletions

View File

@ -34,7 +34,7 @@
#include "elfcopy.h"
ELFTC_VCSID("$Id: pe.c 3312 2016-01-10 09:23:51Z kaiwang27 $");
ELFTC_VCSID("$Id: pe.c 3477 2016-05-25 20:00:42Z kaiwang27 $");
/* Convert ELF object to Portable Executable (PE). */
void
@ -54,7 +54,7 @@ create_pe(struct elfcopy *ecp, int ifd, int ofd)
PE_Buffer *pb;
const char *name;
size_t indx;
int elferr, i;
int elferr;
if (ecp->otf == ETF_EFI || ecp->oem == EM_X86_64)
po = PE_O_PE32P;
@ -175,7 +175,7 @@ create_pe(struct elfcopy *ecp, int ifd, int ofd)
psh.sh_addr = sh.sh_addr;
psh.sh_virtsize = sh.sh_size;
if (sh.sh_type != SHT_NOBITS)
psh.sh_rawsize = sh.sh_size;
psh.sh_rawsize = roundup(sh.sh_size, poh.oh_filealign);
else
psh.sh_char |= IMAGE_SCN_CNT_UNINITIALIZED_DATA;
@ -190,12 +190,6 @@ create_pe(struct elfcopy *ecp, int ifd, int ofd)
IMAGE_SCN_CNT_CODE;
if ((sh.sh_flags & SHF_ALLOC) && (psh.sh_char & 0xF0) == 0)
psh.sh_char |= IMAGE_SCN_CNT_INITIALIZED_DATA;
for (i = 0xE; i > 0; i--) {
if (sh.sh_addralign & (1U << (i - 1))) {
psh.sh_char |= i << 20;
break;
}
}
/* Mark relocation section "discardable". */
if (strcmp(name, ".reloc") == 0)
@ -213,8 +207,12 @@ create_pe(struct elfcopy *ecp, int ifd, int ofd)
}
pb->pb_align = 1;
pb->pb_off = 0;
pb->pb_size = sh.sh_size;
pb->pb_buf = d->d_buf;
pb->pb_size = roundup(sh.sh_size, poh.oh_filealign);
if ((pb->pb_buf = calloc(1, pb->pb_size)) == NULL) {
warn("calloc failed");
continue;
}
memcpy(pb->pb_buf, d->d_buf, sh.sh_size);
}
elferr = elf_errno();
if (elferr != 0)

View File

@ -6,5 +6,5 @@
const char *
elftc_version(void)
{
return "elftoolchain r3475M";
return "elftoolchain r3477M";
}