> On Aug 10, 2017, at 3:38 AM, Gao, Liming <liming....@intel.com> wrote:
> 
> Andrew:
>  If this is a mtoc bug, I suggest to update GenFw to always correct it in the 
> generated EFI image. If so, the EFI image is always correct. There is no 
> change requirement in PeCoff library in MdePkg.
> 

Liming,

EFI supports loading PE/COFF images that are not built at the same time as the 
platform firmware (UEFI Shell, OS loader), and that is why I added the fix to 
the PE/COFF library code. 

Thanks,

Andrew Fish

> Thanks
> Liming
> From: af...@apple.com <mailto:af...@apple.com> [mailto:af...@apple.com 
> <mailto:af...@apple.com>]
> Sent: Tuesday, August 8, 2017 12:26 AM
> To: Zhu, Yonghong <yonghong....@intel.com <mailto:yonghong....@intel.com>>
> Cc: edk2-devel@lists.01.org <mailto:edk2-devel@lists.01.org>; Gao, Liming 
> <liming....@intel.com <mailto:liming....@intel.com>>; Kinney, Michael D 
> <michael.d.kin...@intel.com <mailto:michael.d.kin...@intel.com>>
> Subject: Re: [Patch] BaseTools: Fix Segmentation fault: 11 when build AppPkg 
> with XCODE5
> 
> Should that be:
> Contributed-under: TianoCore Contribution Agreement 1.1
> 
> I also noticed the PeCoff lib is going to loop and reload the .debug suction 
> due to this mtoc bug, so it would be good to harden that code too.
> 
> git diff MdePkg/Library/BasePeCoffLib/BasePeCoff.c
> diff --git a/MdePkg/Library/BasePeCoffLib/BasePeCoff.c 
> b/MdePkg/Library/BasePeCoffLib/BasePeCoff.c
> index 8d1daba..1e4c67e 100644
> --- a/MdePkg/Library/BasePeCoffLib/BasePeCoff.c
> +++ b/MdePkg/Library/BasePeCoffLib/BasePeCoff.c
> @@ -771,6 +771,8 @@ PeCoffLoaderGetImageInfo (
>             }
> 
>             return RETURN_SUCCESS;
> +          } else if (DebugEntry.Type == CODEVIEW_SIGNATURE_MTOC) {
> +            return RETURN_SUCCESS;
>           }
>         }
>       }
> @@ -862,6 +864,8 @@ PeCoffLoaderGetImageInfo (
>         if (DebugEntry.Type == EFI_IMAGE_DEBUG_TYPE_CODEVIEW) {
>           ImageContext->DebugDirectoryEntryRva = (UINT32) 
> (DebugDirectoryEntryRva + Index);
>           return RETURN_SUCCESS;
> +        } else if (DebugEntry.Type == CODEVIEW_SIGNATURE_MTOC) {
> +          return RETURN_SUCCESS;
>         }
>       }
>     }
> 
> 
> 
> https://bugzilla.tianocore.org/show_bug.cgi?id=663
> Contributed-under: TianoCore Contribution Agreement 1.1
> 
> Thanks,
> 
> Andrew Fish
> 
> 
> On Aug 6, 2017, at 9:00 PM, Yonghong Zhu <yonghong....@intel.com 
> <mailto:yonghong....@intel.com><mailto:yonghong....@intel.com 
> <mailto:yonghong....@intel.com>>> wrote:
> 
> it is a bug in mtoc setting the size of the debug directory entry to
> the size of the .debug section, not the size of the
> EFI_IMAGE_DEBUG_DIRECTORY_ENTRY. It was causing a loop to iterate and
> get bogus EFI_IMAGE_DEBUG_DIRECTORY_ENTRY data and pass that to
> memset() and boom.
> 
> Cc: Liming Gao <liming....@intel.com<mailto:liming....@intel.com>>
> Cc: Michael D Kinney 
> <michael.d.kin...@intel.com<mailto:michael.d.kin...@intel.com>>
> Contributed-under: TianoCore Contribution Agreement 1.0
> Signed-off-by: Andrew Fish <af...@apple.com<mailto:af...@apple.com>>
> ---
> BaseTools/Source/C/GenFw/GenFw.c | 12 +++++++++++-
> 1 file changed, 11 insertions(+), 1 deletion(-)
> 
> diff --git a/BaseTools/Source/C/GenFw/GenFw.c 
> b/BaseTools/Source/C/GenFw/GenFw.c
> index 246deb0..af60c92 100644
> --- a/BaseTools/Source/C/GenFw/GenFw.c
> +++ b/BaseTools/Source/C/GenFw/GenFw.c
> @@ -2813,10 +2813,11 @@ Returns:
>  //
>  // Get Debug, Export and Resource EntryTable RVA address.
>  // Resource Directory entry need to review.
>  //
>  Optional32Hdr = (EFI_IMAGE_OPTIONAL_HEADER32 *) ((UINT8*) FileHdr + sizeof 
> (EFI_IMAGE_FILE_HEADER));
> +  Optional64Hdr = (EFI_IMAGE_OPTIONAL_HEADER64 *) ((UINT8*) FileHdr + sizeof 
> (EFI_IMAGE_FILE_HEADER));
>  if (Optional32Hdr->Magic == EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC) {
>    SectionHeader = (EFI_IMAGE_SECTION_HEADER *) ((UINT8 *) Optional32Hdr +  
> FileHdr->SizeOfOptionalHeader);
>    if (Optional32Hdr->NumberOfRvaAndSizes > EFI_IMAGE_DIRECTORY_ENTRY_EXPORT 
> && \
>        Optional32Hdr->DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_EXPORT].Size != 
> 0) {
>      ExportDirectoryEntryRva = 
> Optional32Hdr->DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress;
> @@ -2833,11 +2834,10 @@ Returns:
>        Optional32Hdr->DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_DEBUG].Size = 0;
>        
> Optional32Hdr->DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_DEBUG].VirtualAddress 
> = 0;
>      }
>    }
>  } else {
> -    Optional64Hdr = (EFI_IMAGE_OPTIONAL_HEADER64 *) ((UINT8*) FileHdr + 
> sizeof (EFI_IMAGE_FILE_HEADER));
>    SectionHeader = (EFI_IMAGE_SECTION_HEADER *) ((UINT8 *) Optional64Hdr +  
> FileHdr->SizeOfOptionalHeader);
>    if (Optional64Hdr->NumberOfRvaAndSizes > EFI_IMAGE_DIRECTORY_ENTRY_EXPORT 
> && \
>        Optional64Hdr->DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_EXPORT].Size != 
> 0) {
>      ExportDirectoryEntryRva = 
> Optional64Hdr->DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress;
>    }
> @@ -2907,10 +2907,20 @@ Returns:
>          RsdsEntry->Unknown  = 0;
>          RsdsEntry->Unknown2 = 0;
>          RsdsEntry->Unknown3 = 0;
>          RsdsEntry->Unknown4 = 0;
>          RsdsEntry->Unknown5 = 0;
> +        } else if (RsdsEntry->Signature == CODEVIEW_SIGNATURE_MTOC) {
> +          // MTOC sets DebugDirectoryEntrySize to size of the .debug 
> section, so fix it.
> +          if (!ZeroDebugFlag) {
> +            if (Optional32Hdr->Magic == EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC) {
> +              
> Optional32Hdr->DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_DEBUG].Size = sizeof 
> (EFI_IMAGE_DEBUG_DIRECTORY_ENTRY);
> +            } else {
> +              
> Optional64Hdr->DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_DEBUG].Size = sizeof 
> (EFI_IMAGE_DEBUG_DIRECTORY_ENTRY);
> +            }
> +          }
> +          break;
>        }
>      }
>    }
>  }
> 
> --
> 2.6.1.windows.1
> 
> _______________________________________________
> edk2-devel mailing list
> edk2-devel@lists.01.org
> https://lists.01.org/mailman/listinfo/edk2-devel

_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to