diff options
| author | Ard Biesheuvel <ard.biesheuvel@linaro.org> | 2014-08-27 11:49:39 -0400 |
|---|---|---|
| committer | Peter Jones <pjones@redhat.com> | 2014-08-27 11:49:39 -0400 |
| commit | 4ca60879150d3290b616044b5556116586983cdd (patch) | |
| tree | 5d0aa843d82884f76197c805547ecbc4cf6278ec | |
| parent | 64508097209970e0df28ed77446a9a816149052a (diff) | |
| download | efi-boot-shim-4ca60879150d3290b616044b5556116586983cdd.tar.gz efi-boot-shim-4ca60879150d3290b616044b5556116586983cdd.zip | |
Handle empty .reloc section in PE/COFF loader
On archs where no EFI aware objcopy is available, the generated PE/COFF
header contains a .reloc section which is completely empty. Handle this by
- returning early from relocate_coff() with EFI_SUCCESS,
- ignoring discardable sections in the section loader.
Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
| -rw-r--r-- | shim.c | 11 |
1 files changed, 8 insertions, 3 deletions
@@ -145,6 +145,9 @@ static EFI_STATUS relocate_coff (PE_COFF_LOADER_IMAGE_CONTEXT *context, return EFI_UNSUPPORTED; } + if (!context->RelocDir->Size) + return EFI_SUCCESS; + RelocBase = ImageAddress(data, size, context->RelocDir->VirtualAddress); RelocBaseEnd = ImageAddress(data, size, context->RelocDir->VirtualAddress + context->RelocDir->Size - 1); @@ -996,7 +999,11 @@ static EFI_STATUS handle_image (void *data, unsigned int datasize, * Copy the executable's sections to their desired offsets */ Section = context.FirstSection; - for (i = 0; i < context.NumberOfSections; i++) { + for (i = 0; i < context.NumberOfSections; i++, Section++) { + if (Section->Characteristics & 0x02000000) + /* section has EFI_IMAGE_SCN_MEM_DISCARDABLE attr set */ + continue; + size = Section->Misc.VirtualSize; if (size > Section->SizeOfRawData) @@ -1021,8 +1028,6 @@ static EFI_STATUS handle_image (void *data, unsigned int datasize, if (size < Section->Misc.VirtualSize) ZeroMem (base + size, Section->Misc.VirtualSize - size); - - Section += 1; } /* |
