Got your point. I agree with this change. We will include it in the patch and 
add you in Signed-off-by list. 

-----Original Message-----
From: Ard Biesheuvel [mailto:ard.biesheu...@linaro.org] 
Sent: Wednesday, June 24, 2015 4:19 PM
To: edk2-devel@lists.sourceforge.net
Subject: Re: [edk2] [Patch 2/3] BaseTools: Update GenFw to support 4K alignment.

On 24 June 2015 at 10:15, Gao, Liming <liming....@intel.com> wrote:
> Ard:
>   Good suggestion. How about go through every Shdr and choose the max 
> Shdr->sh_addralign?  The alignment should be power of 2.
>

Indeed. Something like this seems to work fine:

"""
diff --git a/BaseTools/Source/C/GenFw/Elf64Convert.c
b/BaseTools/Source/C/GenFw/Elf64Convert.c
index 2266e487cec7..4025191e868e 100644
--- a/BaseTools/Source/C/GenFw/Elf64Convert.c
+++ b/BaseTools/Source/C/GenFw/Elf64Convert.c
@@ -97,7 +97,7 @@ STATIC Elf_Phdr *mPhdrBase;  //  // Coff information  // 
-STATIC const UINT32 mCoffAlignment = 0x20;
+STATIC UINT32 mCoffAlignment = 0x20;

 //
 // PE section alignment.
@@ -286,6 +286,20 @@ ScanSections64 (
   mCoffOffset += mCoffNbrSections * sizeof(EFI_IMAGE_SECTION_HEADER);

   //
+  // Set mCoffAlignment to the maximum alignment of the input sections  
+ // we care about  //  for (i = 0; i < mEhdr->e_shnum; i++) {
+    Elf_Shdr *shdr = GetShdrByIndex(i);
+    if (shdr->sh_addralign <= mCoffAlignment) {
+      continue;
+    }
+    if (IsTextShdr(shdr) || IsDataShdr(shdr) || IsHiiRsrcShdr(shdr)) {
+      mCoffAlignment = shdr->sh_addralign;
+    }
+  }
+
+  //
   // First text sections.
   //
   mCoffOffset = CoffAlign(mCoffOffset); """

Note that we may want to use 64 KB instead of 4 KB on AArch64, since the OS may 
use 64 KB pages. So we should avoid hardcoding 4 KB values for section 
alignment.

--
Ard.


> Thanks
> Liming
> -----Original Message-----
> From: Ard Biesheuvel [mailto:ard.biesheu...@linaro.org]
> Sent: Tuesday, June 23, 2015 5:14 PM
> To: edk2-devel@lists.sourceforge.net
> Subject: Re: [edk2] [Patch 2/3] BaseTools: Update GenFw to support 4K 
> alignment.
>
> On 23 June 2015 at 10:19, Yingke Liu <yingke.d....@intel.com> wrote:
>> If current ELF file is 4K aligned, the converted PE should also be 4K 
>> aligned.
>>
>> Contributed-under: TianoCore Contribution Agreement 1.0
>> Signed-off-by: Yingke Liu <yingke.d....@intel.com>
>> ---
>>  BaseTools/Source/C/GenFw/Elf32Convert.c | 8 ++++++--
>> BaseTools/Source/C/GenFw/Elf64Convert.c | 6 +++++-
>>  2 files changed, 11 insertions(+), 3 deletions(-)
>>
>> diff --git a/BaseTools/Source/C/GenFw/Elf32Convert.c
>> b/BaseTools/Source/C/GenFw/Elf32Convert.c
>> index 5c7b689..9245851 100644
>> --- a/BaseTools/Source/C/GenFw/Elf32Convert.c
>> +++ b/BaseTools/Source/C/GenFw/Elf32Convert.c
>> @@ -96,7 +96,7 @@ STATIC Elf_Phdr *mPhdrBase;  //  // Coff information
>> // -STATIC const UINT32 mCoffAlignment = 0x20;
>> +STATIC UINT32 mCoffAlignment = 0x20;
>>
>>  //
>>  // PE section alignment.
>> @@ -154,7 +154,11 @@ InitializeElf32 (
>>      Error (NULL, 0, 3000, "Unsupported", "ELF e_version (%u) not EV_CURRENT 
>> (%d)", (unsigned) mEhdr->e_version, EV_CURRENT);
>>      return FALSE;
>>    }
>> -
>> +
>> +  if ((mEhdr->e_entry & 0xFFF) == 0) {
>> +    mCoffAlignment = 0x1000;
>> +  }
>> +
>
> Can you explain why you are using the alignment of the entry point here? 
> Wouldn't it be much better if mCoffAlignment is simply the max() of the 
> alignments of all the sections?
>
>>    //
>>    // Update section header pointers
>>    //
>> diff --git a/BaseTools/Source/C/GenFw/Elf64Convert.c
>> b/BaseTools/Source/C/GenFw/Elf64Convert.c
>> index 25b90e2..8737e30 100644
>> --- a/BaseTools/Source/C/GenFw/Elf64Convert.c
>> +++ b/BaseTools/Source/C/GenFw/Elf64Convert.c
>> @@ -97,7 +97,7 @@ STATIC Elf_Phdr *mPhdrBase;  //  // Coff information
>> // -STATIC const UINT32 mCoffAlignment = 0x20;
>> +STATIC UINT32 mCoffAlignment = 0x20;
>>
>>  //
>>  // PE section alignment.
>> @@ -158,6 +158,10 @@ InitializeElf64 (
>>      return FALSE;
>>    }
>>
>> +  if ((mEhdr->e_entry & 0xFFF) == 0) {
>> +    mCoffAlignment = 0x1000;
>> +  }
>> +
>>    //
>>    // Update section header pointers
>>    //
>> --
>> 1.9.5.msysgit.0
>>
>>
>> ----------------------------------------------------------------------
>> -------- Monitor 25 network devices or servers for free with
>> OpManager!
>> OpManager is web-based network management software that monitors
>> network devices and physical & virtual servers, alerts via email & sms
>> for fault. Monitor 25 devices for free with no restriction. Download
>> now http://ad.doubleclick.net/ddm/clk/292181274;119417398;o
>> _______________________________________________
>> edk2-devel mailing list
>> edk2-devel@lists.sourceforge.net
>> https://lists.sourceforge.net/lists/listinfo/edk2-devel
>
> ------------------------------------------------------------------------------
> Monitor 25 network devices or servers for free with OpManager!
> OpManager is web-based network management software that monitors network 
> devices and physical & virtual servers, alerts via email & sms for fault. 
> Monitor 25 devices for free with no restriction. Download now 
> http://ad.doubleclick.net/ddm/clk/292181274;119417398;o
> _______________________________________________
> edk2-devel mailing list
> edk2-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/edk2-devel
>
> ------------------------------------------------------------------------------
> Monitor 25 network devices or servers for free with OpManager!
> OpManager is web-based network management software that monitors
> network devices and physical & virtual servers, alerts via email & sms
> for fault. Monitor 25 devices for free with no restriction. Download now
> http://ad.doubleclick.net/ddm/clk/292181274;119417398;o
> _______________________________________________
> edk2-devel mailing list
> edk2-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/edk2-devel

------------------------------------------------------------------------------
Monitor 25 network devices or servers for free with OpManager!
OpManager is web-based network management software that monitors 
network devices and physical & virtual servers, alerts via email & sms 
for fault. Monitor 25 devices for free with no restriction. Download now
http://ad.doubleclick.net/ddm/clk/292181274;119417398;o
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/edk2-devel

------------------------------------------------------------------------------
Monitor 25 network devices or servers for free with OpManager!
OpManager is web-based network management software that monitors 
network devices and physical & virtual servers, alerts via email & sms 
for fault. Monitor 25 devices for free with no restriction. Download now
http://ad.doubleclick.net/ddm/clk/292181274;119417398;o
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/edk2-devel

Reply via email to