Revision: 18540
          http://sourceforge.net/p/edk2/code/18540
Author:   abiesheuvel
Date:     2015-09-24 19:35:16 +0000 (Thu, 24 Sep 2015)
Log Message:
-----------
BaseTools/GenFw: disable RVCT linker size optimization

Disable the RVCT size optimization that may put sections at an offset
that is not aligned to their own alignment, by adding the --no_legacyalign
switch to the RVCT linker command line. This is necessary since such sections
cannot be correctly converted into PE/COFF sections without padding them at
the front, which defeats the purpose of the optimization anyway.

With the optimization gone, we can also remove the special case for ARM in
GenFw that could result in corrupt PE/COFF images to be emitted. Instead,
sections whose base address is not aligned correctly are outright rejected.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Ard Biesheuvel <[email protected]>
Reviewed-by: Leif Lindholm <[email protected]>

Modified Paths:
--------------
    trunk/edk2/BaseTools/Conf/tools_def.template
    trunk/edk2/BaseTools/Source/C/GenFw/Elf32Convert.c

Modified: trunk/edk2/BaseTools/Conf/tools_def.template
===================================================================
--- trunk/edk2/BaseTools/Conf/tools_def.template        2015-09-24 19:35:10 UTC 
(rev 18539)
+++ trunk/edk2/BaseTools/Conf/tools_def.template        2015-09-24 19:35:16 UTC 
(rev 18540)
@@ -6609,7 +6609,7 @@
 
 DEFINE RVCT_ALL_ASM_FLAGS   = --diag_suppress=1786 --diag_error=warning --apcs 
/interwork
 DEFINE RVCT_ALL_CC_FLAGS    = --c90 -c --no_autoinline --asm --gnu --apcs 
/interwork --signed_chars --no_unaligned_access --split_sections --enum_is_int 
--preinclude AutoGen.h --diag_suppress=186 --diag_warning 167 
--diag_error=warning --diag_style=ide --protect_stack
-DEFINE RVCT_ALL_DLINK_FLAGS = --ro-base 0 --no_scanlib --reloc --no_exceptions 
--datacompressor off --strict --symbols --diag_style=ide
+DEFINE RVCT_ALL_DLINK_FLAGS = --ro-base 0 --no_scanlib --reloc --no_exceptions 
--datacompressor off --strict --symbols --diag_style=ide --no_legacyalign
 
 
####################################################################################
 #

Modified: trunk/edk2/BaseTools/Source/C/GenFw/Elf32Convert.c
===================================================================
--- trunk/edk2/BaseTools/Source/C/GenFw/Elf32Convert.c  2015-09-24 19:35:10 UTC 
(rev 18539)
+++ trunk/edk2/BaseTools/Source/C/GenFw/Elf32Convert.c  2015-09-24 19:35:16 UTC 
(rev 18540)
@@ -340,12 +340,8 @@
         if ((shdr->sh_addr & (shdr->sh_addralign - 1)) == 0) {
           // if the section address is aligned we must align PE/COFF
           mCoffOffset = (mCoffOffset + shdr->sh_addralign - 1) & 
~(shdr->sh_addralign - 1);
-        } else if ((shdr->sh_addr % shdr->sh_addralign) != (mCoffOffset % 
shdr->sh_addralign)) {
-          // ARM RVCT tools have behavior outside of the ELF specification to 
try
-          // and make images smaller.  If sh_addr is not aligned to 
sh_addralign
-          // then the section needs to preserve sh_addr MOD sh_addralign.
-          // Normally doing nothing here works great.
-          Error (NULL, 0, 3000, "Invalid", "Unsupported section alignment.");
+        } else {
+          Error (NULL, 0, 3000, "Invalid", "Section address not aligned to its 
own alignment.");
         }
       }
 
@@ -375,11 +371,8 @@
   }
 
   mDebugOffset = DebugRvaAlign(mCoffOffset);
+  mCoffOffset = CoffAlign(mCoffOffset);
 
-  if (mEhdr->e_machine != EM_ARM) {
-    mCoffOffset = CoffAlign(mCoffOffset);
-  }
-
   if (SectionCount > 1 && mOutImageType == FW_EFI_IMAGE) {
     Warning (NULL, 0, 0, NULL, "Mulitple sections in %s are merged into 1 text 
section. Source level debug might not work correctly.", mInImageName);
   }
@@ -398,12 +391,8 @@
         if ((shdr->sh_addr & (shdr->sh_addralign - 1)) == 0) {
           // if the section address is aligned we must align PE/COFF
           mCoffOffset = (mCoffOffset + shdr->sh_addralign - 1) & 
~(shdr->sh_addralign - 1);
-        } else if ((shdr->sh_addr % shdr->sh_addralign) != (mCoffOffset % 
shdr->sh_addralign)) {
-          // ARM RVCT tools have behavior outside of the ELF specification to 
try
-          // and make images smaller.  If sh_addr is not aligned to 
sh_addralign
-          // then the section needs to preserve sh_addr MOD sh_addralign.
-          // Normally doing nothing here works great.
-          Error (NULL, 0, 3000, "Invalid", "Unsupported section alignment.");
+        } else {
+          Error (NULL, 0, 3000, "Invalid", "Section address not aligned to its 
own alignment.");
         }
       }
 
@@ -455,12 +444,8 @@
         if ((shdr->sh_addr & (shdr->sh_addralign - 1)) == 0) {
           // if the section address is aligned we must align PE/COFF
           mCoffOffset = (mCoffOffset + shdr->sh_addralign - 1) & 
~(shdr->sh_addralign - 1);
-        } else if ((shdr->sh_addr % shdr->sh_addralign) != (mCoffOffset % 
shdr->sh_addralign)) {
-          // ARM RVCT tools have behavior outside of the ELF specification to 
try
-          // and make images smaller.  If sh_addr is not aligned to 
sh_addralign
-          // then the section needs to preserve sh_addr MOD sh_addralign.
-          // Normally doing nothing here works great.
-          Error (NULL, 0, 3000, "Invalid", "Unsupported section alignment.");
+        } else {
+          Error (NULL, 0, 3000, "Invalid", "Section address not aligned to its 
own alignment.");
         }
       }
       if (shdr->sh_size != 0) {


------------------------------------------------------------------------------
_______________________________________________
edk2-commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/edk2-commits

Reply via email to