From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-it0-x235.google.com (mail-it0-x235.google.com [IPv6:2607:f8b0:4001:c0b::235]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 890C21A1DF8 for ; Mon, 22 Aug 2016 00:30:59 -0700 (PDT) Received: by mail-it0-x235.google.com with SMTP id e63so81603703ith.1 for ; Mon, 22 Aug 2016 00:30:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc; bh=XhxzkTCuqeZB85ZGsJLh236xCk9TKjJh8z4OxxKz1aY=; b=h95+7efFeZOS4Q1jNuckeeUWDpXief0iJuZFser7m9zsgBk2mIQzlRdqP82pR3MwNO YDkEvoQBfafKQsAn31FeZJdlaMFYg5HQ0hNN2H3mHyLZ2KgLKRUPx0HzBwQQWct2fyl/ AfoFWeB5FEhuEsymrMD05v7e10lJB8owiqKbo= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=XhxzkTCuqeZB85ZGsJLh236xCk9TKjJh8z4OxxKz1aY=; b=YvJXY3g42SjrKfflS+lW7ZkLBE2l5KT+G6bw/poW/3R/oX+OcNqANP5ehcamlIDSC3 06mm3QWtobNoFtV+SgpXzBuboER3zgYotl+lm+IH6qX9Zo+bcTnbOqDWGUKyWI60CgNN nkSX8ljrbTCtkvuB1kjVMwXPckcFxgJYV9lAAdfNI5hbrY6HVdGk5IfvOYtCCA2GfqPD LkLoRi2GsvCZqASW0I1kWPodO35dHluO7d0qjo1CUzUzccrclmKgmc0234a2vpNae9pc v3jmFwHTPHH+yhAoZPW11aSgBmp9g/d8otPHRCtoqSs4EvYBsSSQrjNqgONSDh6dfL+A fVoA== X-Gm-Message-State: AEkooutVQ+fFWOL3rU0brQuNRer1kZ1jQ2D88ua3NHd9tIhGm5LIvm7SK99S4j5QSkfe/61TOjsXnnpK301t/VBx X-Received: by 10.36.107.211 with SMTP id v202mr18244039itc.51.1471851058860; Mon, 22 Aug 2016 00:30:58 -0700 (PDT) MIME-Version: 1.0 Received: by 10.36.204.195 with HTTP; Mon, 22 Aug 2016 00:30:58 -0700 (PDT) In-Reply-To: <4A89E2EF3DFEDB4C8BFDE51014F606A1155ED73E@shsmsx102.ccr.corp.intel.com> References: <1471835341-25516-1-git-send-email-liming.gao@intel.com> <4A89E2EF3DFEDB4C8BFDE51014F606A1155ED73E@shsmsx102.ccr.corp.intel.com> From: Ard Biesheuvel Date: Mon, 22 Aug 2016 09:30:58 +0200 Message-ID: To: "Gao, Liming" Cc: edk2-devel-01 , "Zhu, Yonghong" Subject: Re: [Patch] BaseTools PeCoffLib: Fix the issue to get RelocationsStripped from TE image X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 22 Aug 2016 07:30:59 -0000 Content-Type: text/plain; charset=UTF-8 On 22 August 2016 at 09:07, Gao, Liming 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 Thanks for fixing this, Ard. >> -----Original Message----- >> From: Ard Biesheuvel [mailto:ard.biesheuvel@linaro.org] >> Sent: Monday, August 22, 2016 3:00 PM >> To: Gao, Liming >> Cc: edk2-devel-01 ; Zhu, Yonghong >> >> Subject: Re: [Patch] BaseTools PeCoffLib: Fix the issue to get >> RelocationsStripped from TE image >> >> On 22 August 2016 at 05:09, Liming Gao 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 >> > Cc: Yonghong Zhu >> > Contributed-under: TianoCore Contribution Agreement 1.0 >> > Signed-off-by: Liming Gao >> > --- >> > 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.
>> > +Copyright (c) 2004 - 2016, Intel Corporation. All rights reserved.
>> > Portions Copyright (c) 2011 - 2013, ARM Ltd. All rights reserved.
>> > 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 >> >