From 94c9a77f6504170a6bd38b0aa29039208987650e Mon Sep 17 00:00:00 2001 From: Ard Biesheuvel Date: Wed, 13 Aug 2014 13:35:38 +0200 Subject: [PATCH 52/74] 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 --- shim.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/shim.c b/shim.c index ea8eba8..1329212 100644 --- a/shim.c +++ b/shim.c @@ -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; } /* -- 1.9.3