summaryrefslogtreecommitdiffstats
path: root/contrib/elftoolchain
diff options
context:
space:
mode:
authoremaste <emaste@FreeBSD.org>2016-05-25 20:56:30 +0000
committeremaste <emaste@FreeBSD.org>2016-05-25 20:56:30 +0000
commitc5d27b0315b409284a956091dac015daced93d82 (patch)
tree408d02bcc05d210516b16fc1716f51e15fe269f8 /contrib/elftoolchain
parent8d8c35656ee44a38e24d3e78e45afecf0c29a92c (diff)
downloadFreeBSD-src-c5d27b0315b409284a956091dac015daced93d82.zip
FreeBSD-src-c5d27b0315b409284a956091dac015daced93d82.tar.gz
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
Diffstat (limited to 'contrib/elftoolchain')
-rw-r--r--contrib/elftoolchain/elfcopy/pe.c20
1 files changed, 9 insertions, 11 deletions
diff --git a/contrib/elftoolchain/elfcopy/pe.c b/contrib/elftoolchain/elfcopy/pe.c
index 0d075c5..586b21a 100644
--- a/contrib/elftoolchain/elfcopy/pe.c
+++ b/contrib/elftoolchain/elfcopy/pe.c
@@ -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)
OpenPOWER on IntegriCloud