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