On 22 August 2016 at 09:07, Gao, Liming <[email protected]> wrote:
> Ard:
>   This is done to convert PE/COFF image to TE image. TE image Relocation 
> VirtualAddress will be set to non-zero. You can find the following logic in 
> GenFw.c line 2515. Then, PeCoffLib can restore RELOCS_STRIPPED flag from TE 
> image.
>
>   if (((PeHdr->Pe32.FileHeader.Characteristics & 
> EFI_IMAGE_FILE_RELOCS_STRIPPED) == 0) && \
>     
> (TEImageHeader.DataDirectory[EFI_TE_IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress
>  == 0) && \
>     (TEImageHeader.DataDirectory[EFI_TE_IMAGE_DIRECTORY_ENTRY_BASERELOC].Size 
> == 0)) {
>       //
>       // PeImage can be loaded into memory, but it has no relocation section.
>       // Fix TeImage Header to set VA of relocation data directory to not 
> zero, the size is still zero.
>       //
>       if (Optional32 != NULL) {
>         
> TEImageHeader.DataDirectory[EFI_TE_IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress
>  = Optional32->SizeOfImage - sizeof (EFI_IMAGE_BASE_RELOCATION);
>       } else if (Optional64 != NULL) {
>         
> TEImageHeader.DataDirectory[EFI_TE_IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress
>  = Optional64->SizeOfImage - sizeof (EFI_IMAGE_BASE_RELOCATION);
>       }
>   }
>

Apologies. Your patch does work, but I failed to clean BaseTools/
before rebuilding it.

Tested-by: Ard Biesheuvel <[email protected]>

Thanks for fixing this,
Ard.


>> -----Original Message-----
>> From: Ard Biesheuvel [mailto:[email protected]]
>> Sent: Monday, August 22, 2016 3:00 PM
>> To: Gao, Liming <[email protected]>
>> Cc: edk2-devel-01 <[email protected]>; Zhu, Yonghong
>> <[email protected]>
>> Subject: Re: [Patch] BaseTools PeCoffLib: Fix the issue to get
>> RelocationsStripped from TE image
>>
>> On 22 August 2016 at 05:09, Liming Gao <[email protected]> wrote:
>> > If PE image has no relocation section, and has not set RELOCS_STRIPPED,
>> > after it is converted to TE image, GenFw will set its relocation section
>> > VirtualAddress to non-zero address, and keep Size value as Zero.
>>
>> I cannot find this in the code. Instead, I see
>>
>> Elf64Convert.c-1031-  Dir->Size = mCoffOffset - mRelocOffset;
>> Elf64Convert.c-1032-  if (Dir->Size == 0) {
>> Elf64Convert.c:1033:    // If no relocations, null out the directory
>> entry and don't add the .reloc section
>> Elf64Convert.c-1034-    Dir->VirtualAddress = 0;
>> Elf64Convert.c-1035-    NtHdr->Pe32Plus.FileHeader.NumberOfSections--;
>> Elf64Convert.c-1036-  } else {
>> Elf64Convert.c-1037-    Dir->VirtualAddress = mRelocOffset;
>> Elf64Convert.c:1038:    CreateSectionHeader (".reloc", mRelocOffset,
>> mCoffOffset - mRelocOffset,
>> Elf64Convert.c-1039-            EFI_IMAGE_SCN_CNT_INITIALIZED_DATA
>> Elf64Convert.c-1040-            | EFI_IMAGE_SCN_MEM_DISCARDABLE
>> Elf64Convert.c-1041-            | EFI_IMAGE_SCN_MEM_READ);
>> Elf64Convert.c-1042-  }
>> Elf64Convert.c-1043-}
>>
>> so the virtual address is set to zero.
>>
>> I also tried applying the patch, and it does not solve the issue for me.
>>
>> Thanks,
>> Ard.
>>
>> > MdePkg
>> > BasePeCoffLib applied this rule to get RelocationsStripped attribute. But,
>> > it is missing in BaseTools BasePeCoffLib.
>> >
>> > Cc: Ard Biesheuvel <[email protected]>
>> > Cc: Yonghong Zhu <[email protected]>
>> > Contributed-under: TianoCore Contribution Agreement 1.0
>> > Signed-off-by: Liming Gao <[email protected]>
>> > ---
>> >  BaseTools/Source/C/Common/BasePeCoff.c | 4 ++--
>> >  1 file changed, 2 insertions(+), 2 deletions(-)
>> >
>> > diff --git a/BaseTools/Source/C/Common/BasePeCoff.c
>> b/BaseTools/Source/C/Common/BasePeCoff.c
>> > index 9652557..d0cc1af 100644
>> > --- a/BaseTools/Source/C/Common/BasePeCoff.c
>> > +++ b/BaseTools/Source/C/Common/BasePeCoff.c
>> > @@ -2,7 +2,7 @@
>> >
>> >    Functions to get info and load PE/COFF image.
>> >
>> > -Copyright (c) 2004 - 2010, Intel Corporation. All rights reserved.<BR>
>> > +Copyright (c) 2004 - 2016, Intel Corporation. All rights reserved.<BR>
>> >  Portions Copyright (c) 2011 - 2013, ARM Ltd. All rights reserved.<BR>
>> >  This program and the accompanying materials
>> >  are licensed and made available under the terms and conditions of the BSD
>> License
>> > @@ -336,7 +336,7 @@ Returns:
>> >    //
>> >    if ((!(ImageContext->IsTeImage)) && ((PeHdr-
>> >Pe32.FileHeader.Characteristics & EFI_IMAGE_FILE_RELOCS_STRIPPED) !=
>> 0)) {
>> >      ImageContext->RelocationsStripped = TRUE;
>> > -  } else if ((ImageContext->IsTeImage) && (TeHdr->DataDirectory[0].Size
>> == 0)) {
>> > +  } else if ((ImageContext->IsTeImage) && (TeHdr->DataDirectory[0].Size
>> == 0) && (TeHdr->DataDirectory[0].VirtualAddress == 0)) {
>> >      ImageContext->RelocationsStripped = TRUE;
>> >    } else {
>> >      ImageContext->RelocationsStripped = FALSE;
>> > --
>> > 2.8.0.windows.1
>> >
_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to