Sync EDKII BaseTools to BaseTools project r1928

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@10234 6f19259b-4bc3-4df7-8a09-765794883524
diff --git a/BaseTools/Bin/Win32/BootSectImage.exe b/BaseTools/Bin/Win32/BootSectImage.exe
index 9d04108..bad78df 100755
--- a/BaseTools/Bin/Win32/BootSectImage.exe
+++ b/BaseTools/Bin/Win32/BootSectImage.exe
Binary files differ
diff --git a/BaseTools/Bin/Win32/EfiLdrImage.exe b/BaseTools/Bin/Win32/EfiLdrImage.exe
index cc1bbd5..980169d 100755
--- a/BaseTools/Bin/Win32/EfiLdrImage.exe
+++ b/BaseTools/Bin/Win32/EfiLdrImage.exe
Binary files differ
diff --git a/BaseTools/Bin/Win32/EfiRom.exe b/BaseTools/Bin/Win32/EfiRom.exe
index 02a8851..039c3d5 100755
--- a/BaseTools/Bin/Win32/EfiRom.exe
+++ b/BaseTools/Bin/Win32/EfiRom.exe
Binary files differ
diff --git a/BaseTools/Bin/Win32/GenBootSector.exe b/BaseTools/Bin/Win32/GenBootSector.exe
index 1fd392f..b325488 100755
--- a/BaseTools/Bin/Win32/GenBootSector.exe
+++ b/BaseTools/Bin/Win32/GenBootSector.exe
Binary files differ
diff --git a/BaseTools/Bin/Win32/GenCrc32.exe b/BaseTools/Bin/Win32/GenCrc32.exe
index c35f3bb..4e8c346 100755
--- a/BaseTools/Bin/Win32/GenCrc32.exe
+++ b/BaseTools/Bin/Win32/GenCrc32.exe
Binary files differ
diff --git a/BaseTools/Bin/Win32/GenFds.exe b/BaseTools/Bin/Win32/GenFds.exe
index 6dcfc84..d471913 100755
--- a/BaseTools/Bin/Win32/GenFds.exe
+++ b/BaseTools/Bin/Win32/GenFds.exe
Binary files differ
diff --git a/BaseTools/Bin/Win32/GenFfs.exe b/BaseTools/Bin/Win32/GenFfs.exe
index 0b29095..13fbaef 100755
--- a/BaseTools/Bin/Win32/GenFfs.exe
+++ b/BaseTools/Bin/Win32/GenFfs.exe
Binary files differ
diff --git a/BaseTools/Bin/Win32/GenFv.exe b/BaseTools/Bin/Win32/GenFv.exe
index 897cba7..e133043 100755
--- a/BaseTools/Bin/Win32/GenFv.exe
+++ b/BaseTools/Bin/Win32/GenFv.exe
Binary files differ
diff --git a/BaseTools/Bin/Win32/GenFw.exe b/BaseTools/Bin/Win32/GenFw.exe
index 727176a..e6b1745 100755
--- a/BaseTools/Bin/Win32/GenFw.exe
+++ b/BaseTools/Bin/Win32/GenFw.exe
Binary files differ
diff --git a/BaseTools/Bin/Win32/GenPage.exe b/BaseTools/Bin/Win32/GenPage.exe
index 407eb05..9e89375 100755
--- a/BaseTools/Bin/Win32/GenPage.exe
+++ b/BaseTools/Bin/Win32/GenPage.exe
Binary files differ
diff --git a/BaseTools/Bin/Win32/GenSec.exe b/BaseTools/Bin/Win32/GenSec.exe
index e4c0407..117f7ad 100755
--- a/BaseTools/Bin/Win32/GenSec.exe
+++ b/BaseTools/Bin/Win32/GenSec.exe
Binary files differ
diff --git a/BaseTools/Bin/Win32/GenVtf.exe b/BaseTools/Bin/Win32/GenVtf.exe
index 32f7dce..5ca6bad 100755
--- a/BaseTools/Bin/Win32/GenVtf.exe
+++ b/BaseTools/Bin/Win32/GenVtf.exe
Binary files differ
diff --git a/BaseTools/Bin/Win32/LzmaCompress.exe b/BaseTools/Bin/Win32/LzmaCompress.exe
index 425fd34..f953765 100644
--- a/BaseTools/Bin/Win32/LzmaCompress.exe
+++ b/BaseTools/Bin/Win32/LzmaCompress.exe
Binary files differ
diff --git a/BaseTools/Bin/Win32/Split.exe b/BaseTools/Bin/Win32/Split.exe
index aa66468..9b3565f 100755
--- a/BaseTools/Bin/Win32/Split.exe
+++ b/BaseTools/Bin/Win32/Split.exe
Binary files differ
diff --git a/BaseTools/Bin/Win32/TianoCompress.exe b/BaseTools/Bin/Win32/TianoCompress.exe
index aa3ded3..fc09bb6 100755
--- a/BaseTools/Bin/Win32/TianoCompress.exe
+++ b/BaseTools/Bin/Win32/TianoCompress.exe
Binary files differ
diff --git a/BaseTools/Bin/Win32/VfrCompile.exe b/BaseTools/Bin/Win32/VfrCompile.exe
index 2394a00..ecefe7c 100755
--- a/BaseTools/Bin/Win32/VfrCompile.exe
+++ b/BaseTools/Bin/Win32/VfrCompile.exe
Binary files differ
diff --git a/BaseTools/Bin/Win32/VolInfo.exe b/BaseTools/Bin/Win32/VolInfo.exe
index e54096b..80dad20 100755
--- a/BaseTools/Bin/Win32/VolInfo.exe
+++ b/BaseTools/Bin/Win32/VolInfo.exe
Binary files differ
diff --git a/BaseTools/Bin/Win32/build.exe b/BaseTools/Bin/Win32/build.exe
index 0803c85..2a575fa 100755
--- a/BaseTools/Bin/Win32/build.exe
+++ b/BaseTools/Bin/Win32/build.exe
Binary files differ
diff --git a/BaseTools/Conf/build_rule.template b/BaseTools/Conf/build_rule.template
index 8a7663d..95bb5ed 100644
--- a/BaseTools/Conf/build_rule.template
+++ b/BaseTools/Conf/build_rule.template
@@ -131,6 +131,10 @@
         "$(CC)" $(CC_FLAGS) -o ${dst} $(INC) ${src}

         "$(SYMRENAME)" $(SYMRENAME_FLAGS) ${dst}

 

+    <Command.ARMGCC>

+        "$(CC)" $(CC_FLAGS) -o ${dst} $(INC) ${src}

+

+

 [C-Header-File]

     <InputFile>

         *.h, *.H

@@ -215,7 +219,7 @@
     <Command.RVCT>

         "$(SLINK)" $(SLINK_FLAGS) ${dst} --via $(OBJECT_FILES_LIST)

     

-    <Command.RVCTCYGWIN>

+    <Command.RVCTCYGWIN, Command.ARMGCC>

         # $(OBJECT_FILES_LIST) has wrong paths for cygwin

         "$(SLINK)" $(SLINK_FLAGS) ${dst} $(OBJECT_FILES)

 

@@ -239,6 +243,9 @@
         "$(DLINK)" -o ${dst} $(DLINK_FLAGS) -\( $(DLINK_SPATH) @$(STATIC_LIBRARY_FILES_LIST) -\) $(DLINK2_FLAGS)

         "$(OBJCOPY)" $(OBJCOPY_FLAGS) ${dst}

 

+    <Command.ARMGCC>

+        "$(DLINK)" -o ${dst} $(DLINK_FLAGS) -( $(DLINK_SPATH) $(STATIC_LIBRARY_FILES) -) $(DLINK2_FLAGS)

+

     <Command.RVCT>

         "$(DLINK)" $(DLINK_FLAGS) -o ${dst} $(DLINK_SPATH) --via $(STATIC_LIBRARY_FILES_LIST) $(DLINK2_FLAGS)

 

@@ -266,6 +273,9 @@
     <Command.GCC>

         "$(DLINK)" $(DLINK_FLAGS) -\( $(DLINK_SPATH) @$(STATIC_LIBRARY_FILES_LIST) -\) $(DLINK2_FLAGS)

 

+    <Command.ARMGCC>

+        "$(DLINK)" $(DLINK_FLAGS) -( $(DLINK_SPATH) $(STATIC_LIBRARY_FILES) -) $(DLINK2_FLAGS)

+

     <Command.RVCT>

         "$(DLINK)" $(DLINK_FLAGS) -o ${dst} $(DLINK_SPATH) --via $(STATIC_LIBRARY_FILES_LIST) $(DLINK2_FLAGS)

 

@@ -284,7 +294,7 @@
     <OutputFile>

         $(DEBUG_DIR)(+)$(MODULE_NAME).efi

 

-    <Command.MSFT, Command.INTEL, Command.RVCT>  

+    <Command.MSFT, Command.INTEL, Command.RVCT, Command.ARMGCC>  

         GenFw -e $(MODULE_TYPE) -o ${dst} ${src}

         $(CP) ${dst} $(OUTPUT_DIR)

         $(CP) ${dst} $(BIN_DIR)

diff --git a/BaseTools/Conf/tools_def.template b/BaseTools/Conf/tools_def.template
index 2dbc776..b53826b 100644
--- a/BaseTools/Conf/tools_def.template
+++ b/BaseTools/Conf/tools_def.template
@@ -140,8 +140,8 @@
 DEFINE RVCT31_TOOLS_PATH       = c:/Program Files/ARM/RVCT/Programs/3.1/761/win_32-pentium

 DEFINE RVCT31CYGWIN_TOOLS_PATH = /cygdrive/c/Program Files/ARM/RVCT/Programs/3.1/761/win_32-pentium

 

-# Update to the location of the gcc executables

-DEFINE ARMGCC_BIN              = /

+DEFINE SOURCERY_TOOLS        = c:/Program Files/CodeSourcery/Sourcery G++ Lite/bin

+DEFINE SOURCERY_CYGWIN_TOOLS = /cygdrive/c/Program Files/CodeSourcery/Sourcery G++ Lite/bin

 

 ####################################################################################

 #

@@ -1589,8 +1589,8 @@
 *_UNIXGCC_*_MAKE_PATH                    = make

 *_UNIXGCC_*_ASL_PATH                     = DEF(UNIX_IASL_BIN)

 

-*_UNIXGCC_IA32_DLINK_FLAGS               = DEF(GCC_IA32_X64_DLINK_FLAGS)

-*_UNIXGCC_X64_DLINK_FLAGS                = DEF(GCC_IA32_X64_DLINK_FLAGS)

+*_UNIXGCC_IA32_DLINK_FLAGS               = DEF(GCC_IA32_X64_DLINK_FLAGS) --image-base=0

+*_UNIXGCC_X64_DLINK_FLAGS                = DEF(GCC_IA32_X64_DLINK_FLAGS) --image-base=0

 *_UNIXGCC_IA32_ASLDLINK_FLAGS            = DEF(GCC_IA32_X64_ASLDLINK_FLAGS)

 *_UNIXGCC_X64_ASLDLINK_FLAGS             = DEF(GCC_IA32_X64_ASLDLINK_FLAGS)

 *_UNIXGCC_*_ASM_FLAGS                    = DEF(GCC_ASM_FLAGS)

@@ -1717,8 +1717,8 @@
 *_CYGGCC_*_MAKE_PATH             = DEF(MS_VS_BIN)\nmake.exe

 *_CYGGCC_*_ASL_PATH              = DEF(DEFAULT_WIN_ASL_BIN)

 

-*_CYGGCC_IA32_DLINK_FLAGS               = DEF(GCC_IA32_X64_DLINK_FLAGS)

-*_CYGGCC_X64_DLINK_FLAGS                = DEF(GCC_IA32_X64_DLINK_FLAGS)

+*_CYGGCC_IA32_DLINK_FLAGS               = DEF(GCC_IA32_X64_DLINK_FLAGS) --image-base=0

+*_CYGGCC_X64_DLINK_FLAGS                = DEF(GCC_IA32_X64_DLINK_FLAGS) --image-base=0

 *_CYGGCC_IA32_ASLDLINK_FLAGS            = DEF(GCC_IA32_X64_ASLDLINK_FLAGS)

 *_CYGGCC_X64_ASLDLINK_FLAGS             = DEF(GCC_IA32_X64_ASLDLINK_FLAGS)

 *_CYGGCC_*_MAKE_FLAGS                   = /nologo

@@ -1745,10 +1745,11 @@
 *_CYGGCC_IA32_ASLPP_PATH         = DEF(CYGWIN_BINIA32)gcc

 *_CYGGCC_IA32_ASLDLINK_PATH      = DEF(CYGWIN_BINIA32)ld

 *_CYGGCC_IA32_RC_PATH            = DEF(CYGWIN_BINIA32)objcopy

-*_CYGGCC_IA32_OBJECT_PATH        = DEF(CYGWIN_BINIA32)objcopy

+*_CYGGCC_IA32_OBJCOPY_PATH       = DEF(CYGWIN_BINIA32)objcopy

 

 *_CYGGCC_IA32_CC_FLAGS           = DEF(GCC_IA32_CC_FLAGS)

 *_CYGGCC_IA32_RC_FLAGS           = DEF(GCC_IA32_RC_FLAGS)

+*_CYGGCC_IA32_OBJCOPY_FLAGS      =

 

 ##################

 # X64 definitions

@@ -1764,10 +1765,11 @@
 *_CYGGCC_X64_ASLPP_PATH          = DEF(CYGWIN_BINX64)gcc

 *_CYGGCC_X64_ASLDLINK_PATH       = DEF(CYGWIN_BINX64)ld

 *_CYGGCC_X64_RC_PATH             = DEF(CYGWIN_BINX64)objcopy

-*_CYGGCC_X64_OBJECT_PATH         = DEF(CYGWIN_BINX64)objcopy

+*_CYGGCC_X64_OBJCOPY_PATH        = DEF(CYGWIN_BINX64)objcopy

 

 *_CYGGCC_X64_CC_FLAGS            = DEF(GCC_X64_CC_FLAGS)

 *_CYGGCC_X64_RC_FLAGS            = DEF(GCC_X64_RC_FLAGS)

+*_CYGGCC_X64_OBJCOPY_FLAGS       =

 

 ##################

 # IPF definitions

@@ -1784,7 +1786,6 @@
 *_CYGGCC_IPF_OBJCOPY_PATH        = DEF(CYGWIN_BINIPF)objcopy

 *_CYGGCC_IPF_SYMRENAME_PATH      = DEF(CYGWIN_BINIPF)objcopy

 *_CYGGCC_IPF_RC_PATH             = DEF(CYGWIN_BINIPF)objcopy

-*_CYGGCC_IPF_OBJECT_PATH         = DEF(CYGWIN_BINIPF)objcopy

 

 *_CYGGCC_IPF_CC_FLAGS             = DEF(GCC_IPF_CC_FLAGS)

 *_CYGGCC_IPF_DLINK_FLAGS          = DEF(GCC_IPF_DLINK_FLAGS)

@@ -2839,13 +2840,16 @@
 

 ####################################################################################

 #

-# ARM GCC (GCC 4.1.1, etc.)

+# ARM GCC (www.codesourcery.com)

 #

 ####################################################################################

 #  ARMGCC         - ARM version of the GCC cross compiler

 

 *_ARMGCC_*_*_FAMILY          = GCC

-*_ARMGCC_*_MAKE_PATH         = make

+*_ARMGCC_*_*_BUILDRULEFAMILY = ARMGCC

+

+*_ARMGCC_*_MAKE_PATH         = DEF(SOURCERY_TOOLS)/cs-make

+*_ARMGCC_*_MAKE_FLAGS        = --no-print-directory

 

 ##################

 # ASL definitions

@@ -2861,24 +2865,24 @@
 # ARM definitions

 ##################

 

-*_ARMGCC_ARM_ASLCC_PATH      = DEF(ARMGCC_BIN)/arm-elf-gcc

-*_ARMGCC_ARM_ASLDLINK_PATH   = DEF(ARMGCC_BIN)/arm-elf-ld

-*_ARMGCC_ARM_ASLPP_PATH      = DEF(ARMGCC_BIN)/arm-elf-gcc

+*_ARMGCC_ARM_ASLCC_PATH      = DEF(SOURCERY_TOOLS)/arm-none-eabi-gcc

+*_ARMGCC_ARM_ASLDLINK_PATH   = DEF(SOURCERY_TOOLS)/arm-none-eabi-ld

+*_ARMGCC_ARM_ASLPP_PATH      = DEF(SOURCERY_TOOLS)/arm-none-eabi-gcc

 

-*_ARMGCC_ARM_CC_PATH         = DEF(ARMGCC_BIN)/arm-elf-gcc

-*_ARMGCC_ARM_SLINK_PATH      = DEF(ARMGCC_BIN)/arm-elf-ar

-*_ARMGCC_ARM_DLINK_PATH      = DEF(ARMGCC_BIN)/arm-elf-ld

-*_ARMGCC_ARM_ASM_PATH        = DEF(ARMGCC_BIN)/arm-elf-as

-*_ARMGCC_ARM_PP_PATH         = DEF(ARMGCC_BIN)/arm-elf-gcc

-*_ARMGCC_ARM_VFRPP_PATH      = DEF(ARMGCC_BIN)/arm-elf-gcc

+*_ARMGCC_ARM_CC_PATH         = DEF(SOURCERY_TOOLS)/arm-none-eabi-gcc

+*_ARMGCC_ARM_SLINK_PATH      = DEF(SOURCERY_TOOLS)/arm-none-eabi-ar

+*_ARMGCC_ARM_DLINK_PATH      = DEF(SOURCERY_TOOLS)/arm-none-eabi-ld

+*_ARMGCC_ARM_ASM_PATH        = DEF(SOURCERY_TOOLS)/arm-none-eabi-as

+*_ARMGCC_ARM_PP_PATH         = DEF(SOURCERY_TOOLS)/arm-none-eabi-gcc

+*_ARMGCC_ARM_VFRPP_PATH      = DEF(SOURCERY_TOOLS)/arm-none-eabi-gcc

 

 #

 # Use default values, or override in DSC file

 #

-*_ARMGCC_ARM_ARCHCC_FLAGS    = 

-*_ARMGCC_ARM_ARCHASM_FLAGS   = 

+*_ARMGCC_ARM_ARCHCC_FLAGS    = -march=armv7-a -mthumb 

+*_ARMGCC_ARM_ARCHASM_FLAGS   = -march=armv7-a

 *_ARMGCC_ARM_ARCHDLINK_FLAGS = 

-*_ARMGCC_ARM_PLATFORM_FLAGS  =

+*_ARMGCC_ARM_PLATFORM_FLAGS  = -march=armv7-a

 

   DEBUG_ARMGCC_ARM_ASM_FLAGS   = $(ARCHASM_FLAGS) -mlittle-endian -g

 RELEASE_ARMGCC_ARM_ASM_FLAGS   = $(ARCHASM_FLAGS) -mlittle-endian

@@ -2886,11 +2890,12 @@
 *_ARMGCC_ARM_PP_FLAGS    = $(ARCHCC_FLAGS) $(PLATFORM_FLAGS)  -E -x assembler-with-cpp -include $(DEST_DIR_DEBUG)/AutoGen.h

 *_ARMGCC_ARM_VFRPP_FLAGS = $(ARCHCC_FLAGS) $(PLATFORM_FLAGS)  -x c -E -P -DVFRCOMPILE --include $(DEST_DIR_DEBUG)/$(MODULE_NAME)StrDefs.h

 

-*_ARMGCC_ARM_MAKE_PATH   = make

-

-*_ARMGCC_ARM_SLINK_FLAGS = -r

-*_ARMGCC_ARM_DLINK_FLAGS =  $(ARCHDLINK_FLAGS) --emit-relocs --oformat=elf32-littlearm -nostdlib -u $(IMAGE_ENTRY_POINT) -e $(IMAGE_ENTRY_POINT) -Map $(DEST_DIR_DEBUG)/$(BASE_NAME).map

-# --gc-sections

+*_ARMGCC_ARM_SLINK_FLAGS =  -rc

+*_ARMGCC_ARM_DLINK_FLAGS =  $(ARCHDLINK_FLAGS)  --oformat=elf32-littlearm -nostdlib -u $(IMAGE_ENTRY_POINT) -e $(IMAGE_ENTRY_POINT) -Map $(DEST_DIR_DEBUG)/$(BASE_NAME).map

+#

+# Had to remove --emit-relocs to get compile working. Images don't work correctly (linked at 0, no relocations)

+# --emit-relocs

+#

 

   DEBUG_ARMGCC_ARM_CC_FLAGS = $(ARCHCC_FLAGS) $(PLATFORM_FLAGS) -mfpu=fpa -mlittle-endian -g -O2 -mabi=aapcs -mapcs -fno-short-enums -save-temps -combine -fsigned-char -fshort-wchar -fno-strict-aliasing -ffunction-sections -fdata-sections -Wall -Werror -Wno-missing-braces -fomit-frame-pointer -c -include AutoGen.h

 RELEASE_ARMGCC_ARM_CC_FLAGS = $(ARCHCC_FLAGS) $(PLATFORM_FLAGS) -mfpu=fpa -mlittle-endian    -O2 -mabi=aapcs -mapcs -fno-short-enums -save-temps -combine -fsigned-char -fshort-wchar -fno-strict-aliasing -ffunction-sections -fdata-sections -Wall -Werror -Wno-missing-braces -fomit-frame-pointer -c -include AutoGen.h

diff --git a/BaseTools/Source/C/GenFw/GenFw.c b/BaseTools/Source/C/GenFw/GenFw.c
index d42c88e..4d60814 100644
--- a/BaseTools/Source/C/GenFw/GenFw.c
+++ b/BaseTools/Source/C/GenFw/GenFw.c
@@ -24,6 +24,8 @@
 #ifndef __GNUC__

 #include <windows.h>

 #include <io.h>

+#include <sys/types.h>

+#include <sys/stat.h>

 #endif

 #include <stdio.h>

 #include <stdlib.h>

@@ -1034,14 +1036,20 @@
               - (SecOffset - SecShdr->sh_addr);

             break;

           default:

-            Error (NULL, 0, 3000, "Invalid", "%s unhandled section type %x.", mInImageName, (unsigned) ELF_R_TYPE(Rel->r_info));

+            Error (NULL, 0, 3000, "Invalid", "%s unsupported ELF EM_386 relocation 0x%x.", mInImageName, (unsigned) ELF_R_TYPE(Rel->r_info));

           }

         } else if (Ehdr->e_machine == EM_ARM) {

           switch (ELF32_R_TYPE(Rel->r_info)) {

           case R_ARM_RBASE:   // No relocation - no action required

-          case R_ARM_PC24:    // PC-relative relocations don't require modification

-          case R_ARM_XPC25:   // PC-relative relocations don't require modification

+          

+          // Thease are all PC-relative relocations and don't require modification

+          case R_ARM_PC24:    

+          case R_ARM_XPC25:   

+          case R_ARM_THM_PC22:

+          case R_ARM_THM_JUMP19:

+          case R_ARM_CALL:

             break;

+

           case R_ARM_ABS32:

           case R_ARM_RABS32:

             //

@@ -1050,7 +1058,7 @@
             *(UINT32 *)Targ = *(UINT32 *)Targ - SymShdr->sh_addr + CoffSectionsOffset[Sym->st_shndx];

             break;

           default:

-            Error (NULL, 0, 3000, "Invalid", "%s unhandled section type %x.", mInImageName, (unsigned) ELF32_R_TYPE(Rel->r_info));

+            Error (NULL, 0, 3000, "Invalid", "WriteSections (): %s unsupported ELF EM_ARM relocation 0x%x.", mInImageName, (unsigned) ELF32_R_TYPE(Rel->r_info));

           }

         }

       }

@@ -1124,7 +1132,7 @@
 

 

 VOID

-WriteRelocations(

+WriteRelocations (

   VOID

   )

 {

@@ -1164,13 +1172,18 @@
               EFI_IMAGE_REL_BASED_HIGHLOW);

               break;

             default:

-              Error (NULL, 0, 3000, "Invalid", "%s unhandled section type %x.", mInImageName, (unsigned) ELF_R_TYPE(Rel->r_info));

+              Error (NULL, 0, 3000, "Invalid", "%s unsupported ELF EM_386 relocation 0x%x.", mInImageName, (unsigned) ELF_R_TYPE(Rel->r_info));

             }

           } else if (Ehdr->e_machine == EM_ARM) {

             switch (ELF32_R_TYPE(Rel->r_info)) {

-            case R_ARM_RBASE:

+            case R_ARM_RBASE: // No relocation - no action required

+          

+            // Thease are all PC-relative relocations and don't require modification

             case R_ARM_PC24:

             case R_ARM_XPC25:

+            case R_ARM_THM_PC22:

+            case R_ARM_THM_JUMP19:

+            case R_ARM_CALL:

               break;

             case R_ARM_ABS32:

             case R_ARM_RABS32:

@@ -1180,8 +1193,9 @@
                 EFI_IMAGE_REL_BASED_HIGHLOW

                 );

               break;

-            default:

-              Error (NULL, 0, 3000, "Invalid", "%s unhandled section type %x.", mInImageName, (unsigned) ELF32_R_TYPE(Rel->r_info));

+

+           default:

+              Error (NULL, 0, 3000, "Invalid", "WriteRelocations(): %s unsupported ELF EM_ARM relocation 0x%x.", mInImageName, (unsigned) ELF32_R_TYPE(Rel->r_info));

             }

           } else {

             Error (NULL, 0, 3000, "Not Supported", "This tool does not support relocations for ELF with e_machine %u (processor type).", (unsigned) Ehdr->e_machine);

@@ -1217,6 +1231,9 @@
             case  DT_RELENT:

               RelElementSize = Dyn->d_un.d_val;

               break;

+

+            default:

+              break;

           }

           Dyn++;

         }

@@ -1226,7 +1243,13 @@
 

         for (K = 0; K < RelSize; K += RelElementSize) {

 

-          Rel = (Elf32_Rel *) ((UINT8 *) Ehdr + DynamicSegment->p_offset + RelOffset + K);

+          if (DynamicSegment->p_paddr == 0) {

+            // This seems to be how it works on armcc???? Have the email in to find out?

+            Rel = (Elf32_Rel *) ((UINT8 *) Ehdr + DynamicSegment->p_offset + RelOffset + K);

+          } else {

+            // This is how it reads in the ELF specification

+            Rel = (Elf32_Rel *) ((UINT8 *) Ehdr + RelOffset + K);

+          }

 

           switch (ELF32_R_TYPE (Rel->r_info)) {

           case  R_ARM_RBASE:

@@ -1242,7 +1265,8 @@
             CoffAddFixup (CoffSectionsOffset[ELF32_R_SYM (Rel->r_info)] + (Rel->r_offset - TargetSegment->p_vaddr), EFI_IMAGE_REL_BASED_HIGHLOW);

             break;

           default:

-            Error (NULL, 0, 3000, "Invalid", "%s bad ARM dynamic relocations, unkown type.", mInImageName);

+            Error (NULL, 0, 3000, "Invalid", "%s bad ARM dynamic relocations, unkown type %d.", mInImageName, ELF32_R_TYPE (Rel->r_info));

+            break;

           }

         }

         break;

@@ -1993,6 +2017,9 @@
   FILE                             *ReportFile;

   CHAR8                            *ReportFileName;

   UINTN                            FileLen;

+  time_t                           InputFileTime;

+  time_t                           OutputFileTime;

+  struct stat                      Stat_Buf;

 

   SetUtilityName (UTILITY_NAME);

 

@@ -2038,6 +2065,8 @@
   HiiSectionHeader       = NULL;

   NewBaseAddress         = 0;

   NegativeAddr           = FALSE;

+  InputFileTime          = 0;

+  OutputFileTime         = 0;

 

   if (argc == 1) {

     Error (NULL, 0, 1001, "Missing options", "No input options.");

@@ -2434,6 +2463,14 @@
   if (OutImageName != NULL) {

     fpOut = fopen (OutImageName, "rb");

     if (fpOut != NULL) {

+      //

+      // Get Output file time stamp

+      //

+      fstat(fileno (fpOut), &Stat_Buf);

+      OutputFileTime = Stat_Buf.st_mtime;

+      //

+      // Get Output file data

+      //

       OutputFileLength = _filelength (fileno (fpOut));

       OutputFileBuffer = malloc (OutputFileLength);

       if (OutputFileBuffer == NULL) {

@@ -2460,6 +2497,14 @@
     Error (NULL, 0, 0001, "Error opening file", mInImageName);

     goto Finish;

   }

+  //

+  // Get Iutput file time stamp

+  //

+  fstat(fileno (fpIn), &Stat_Buf);

+  InputFileTime = Stat_Buf.st_mtime;

+  //

+  // Get Input file data

+  //

   InputFileLength = _filelength (fileno (fpIn));

   InputFileBuffer = malloc (InputFileLength);

   if (InputFileBuffer == NULL) {

@@ -3467,6 +3512,27 @@
     FileLength = FileLength + sizeof (EFI_TE_IMAGE_HEADER);

     memcpy (FileBuffer, &TEImageHeader, sizeof (EFI_TE_IMAGE_HEADER));

     VerboseMsg ("the size of output file is %u bytes", (unsigned) (FileLength));

+  } else {

+

+    //

+    // Following codes are to fix the objcopy's issue:

+    // objcopy in binutil 2.50.18 will set PE image's charactices to "RELOC_STRIPPED" if image has no ".reloc" section

+    // It cause issue for EFI image which has no ".reloc" sections.

+    // Following codes will be removed when objcopy in binutil fix this problem for PE image.

+    //

+    if ((PeHdr->Pe32.FileHeader.Characteristics & EFI_IMAGE_FILE_RELOCS_STRIPPED) != 0) {

+      if (PeHdr->Pe32.OptionalHeader.Magic == EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC) {

+        Optional32 = (EFI_IMAGE_OPTIONAL_HEADER32 *)&PeHdr->Pe32.OptionalHeader;

+        if (Optional32->ImageBase == 0) {

+          PeHdr->Pe32.FileHeader.Characteristics &= ~EFI_IMAGE_FILE_RELOCS_STRIPPED;

+        }

+      } else if (PeHdr->Pe32.OptionalHeader.Magic == EFI_IMAGE_NT_OPTIONAL_HDR64_MAGIC) {

+        Optional64 = (EFI_IMAGE_OPTIONAL_HEADER64 *)&PeHdr->Pe32.OptionalHeader;

+        if (Optional64->ImageBase == 0) {

+          PeHdr->Pe32.FileHeader.Characteristics &= ~EFI_IMAGE_FILE_RELOCS_STRIPPED;

+        }

+      }

+    }

   }

 

 WriteFile:

@@ -3487,7 +3553,10 @@
       VerboseMsg ("the size of output file is %u bytes", (unsigned) FileLength);

     }

   } else {

-    if ((FileLength != OutputFileLength) || (memcmp (FileBuffer, OutputFileBuffer, FileLength) != 0)) {

+    if ((OutputFileTime < InputFileTime) || (FileLength != OutputFileLength) || (memcmp (FileBuffer, OutputFileBuffer, FileLength) != 0)) {

+      //

+      // Update File when File is changed or File is old.

+      //

       fpOut = fopen (OutImageName, "wb");

       if (fpOut == NULL) {

         Error (NULL, 0, 0001, "Error opening output file", OutImageName);

diff --git a/BaseTools/Source/C/GenFw/elf_common.h b/BaseTools/Source/C/GenFw/elf_common.h
index 1cd3f53..3798c95 100644
--- a/BaseTools/Source/C/GenFw/elf_common.h
+++ b/BaseTools/Source/C/GenFw/elf_common.h
@@ -597,6 +597,8 @@
 #define	R_ARM_GOTPC		25	/* Add PC-relative GOT table address. */
 #define	R_ARM_GOT32		26	/* Add PC-relative GOT offset. */
 #define	R_ARM_PLT32		27	/* Add PC-relative PLT offset. */
+#define R_ARM_CALL          28
+#define R_ARM_THM_JUMP19    51
 #define	R_ARM_GNU_VTENTRY	100
 #define	R_ARM_GNU_VTINHERIT	101
 #define	R_ARM_RSBREL32		250
diff --git a/BaseTools/Source/Python/AutoGen/GenMake.py b/BaseTools/Source/Python/AutoGen/GenMake.py
index c5d8991..b58d0c6 100644
--- a/BaseTools/Source/Python/AutoGen/GenMake.py
+++ b/BaseTools/Source/Python/AutoGen/GenMake.py
@@ -1,7 +1,7 @@
 ## @file
 # Create makefile for MS nmake and GNU make
 #
-# Copyright (c) 2007, Intel Corporation
+# Copyright (c) 2007 - 2010, Intel Corporation
 # All rights reserved. This program and the accompanying materials
 # are licensed and made available under the terms and conditions of the BSD License
 # which accompanies this distribution.  The full text of the license may be found at
@@ -26,7 +26,7 @@
 import Common.GlobalData as GlobalData
 
 ## Regular expression for finding header file inclusions
-gIncludePattern = re.compile(r"^[ \t]*#[ \t]*include(?:[ \t]*(?:\\(?:\r\n|\r|\n))*[ \t]*)*(?:[\"<][ \t]*)([\w.\\/]+)(?:[ \t]*[\">])", re.MULTILINE|re.UNICODE)
+gIncludePattern = re.compile(r"^[ \t]*#?[ \t]*include(?:[ \t]*(?:\\(?:\r\n|\r|\n))*[ \t]*)*(?:[\"<]?[ \t]*)([\w.\\/]+)(?:[ \t]*[\">]?)", re.MULTILINE|re.UNICODE)
 
 ## Regular expression for matching macro used in header file inclusion
 gMacroPattern = re.compile("([_A-Z][_A-Z0-9]*)[ \t]*\((.+)\)", re.UNICODE)
diff --git a/BaseTools/Source/Python/Common/DscClassObject.py b/BaseTools/Source/Python/Common/DscClassObject.py
index 50b6cc5..c25580a 100644
--- a/BaseTools/Source/Python/Common/DscClassObject.py
+++ b/BaseTools/Source/Python/Common/DscClassObject.py
@@ -1,7 +1,7 @@
 ## @file

 # This file is used to define each component of DSC file

 #

-# Copyright (c) 2007 ~ 2008, Intel Corporation

+# Copyright (c) 2007 - 2010, Intel Corporation

 # All rights reserved. This program and the accompanying materials

 # are licensed and made available under the terms and conditions of the BSD License

 # which accompanies this distribution.  The full text of the license may be found at

@@ -989,10 +989,14 @@
             #

             elif PreviousIf[2] in (MODEL_META_DATA_CONDITIONAL_STATEMENT_IF, Model):

                 List = PreviousIf[0].split(' ')

-                Value1 = List[0]

-                Value2 = List[1]

-                Value3 = List[2]

-                Value3 = SplitString(Value3)

+                Value1, Value2, Value3 = '', '==', '0'

+                if len(List) == 3:

+                    Value1 = List[0]

+                    Value2 = List[1]

+                    Value3 = List[2]

+                    Value3 = SplitString(Value3)

+                if len(List) == 1:

+                    Value1 = List[0]

                 Model = PreviousIf[2]

                 self.TblDsc.Insert(Model, Value1, Value2, Value3, ArchList, BelongsToItem, self.FileID, PreviousIf[1], StartColumn, EndLine, EndColumn, Enabled)

             #

diff --git a/BaseTools/Source/Python/Common/FdfParserLite.py b/BaseTools/Source/Python/Common/FdfParserLite.py
index eb7b0d7..b181e65 100644
--- a/BaseTools/Source/Python/Common/FdfParserLite.py
+++ b/BaseTools/Source/Python/Common/FdfParserLite.py
@@ -1760,8 +1760,8 @@
         if not self.__GetNextHexNumber():

             raise Warning("expected Hex byte At Line ", self.FileName, self.CurrentLineNumber)

         

-        if len(self.__Token) > 4:

-            raise Warning("Hex byte(must be 2 digits) too long At Line ", self.FileName, self.CurrentLineNumber)

+        if len(self.__Token) > 18:

+            raise Warning("Hex string can't be converted to a valid UINT64 value", self.FileName, self.CurrentLineNumber)

         

         DataString = self.__Token

         DataString += ","

@@ -1792,8 +1792,8 @@
             if not self.__GetNextHexNumber():

                 raise Warning("expected Hex byte At Line ", self.FileName, self.CurrentLineNumber)

         

-            if len(self.__Token) > 4:

-                raise Warning("Hex byte(must be 2 digits) too long At Line ", self.FileName, self.CurrentLineNumber)

+            if len(self.__Token) > 18:

+                raise Warning("Hex string can't be converted to a valid UINT64 value", self.FileName, self.CurrentLineNumber)

         

             DataString = self.__Token

             DataString += ","

diff --git a/BaseTools/Source/Python/Common/Parsing.py b/BaseTools/Source/Python/Common/Parsing.py
index 6ab91fb..3884b05 100644
--- a/BaseTools/Source/Python/Common/Parsing.py
+++ b/BaseTools/Source/Python/Common/Parsing.py
@@ -291,17 +291,17 @@
 # @retval truple() A truple structure as (Family, ToolChain, Flag)

 #

 def GetBuildOption(String, File, LineNo = -1):

+    (Family, ToolChain, Flag) = ('', '', '')

     if String.find(TAB_EQUAL_SPLIT) < 0:

         RaiseParserError(String, 'BuildOptions', File, '[<Family>:]<ToolFlag>=Flag', LineNo)

-    (Family, ToolChain, Flag) = ('', '', '')

-    List = GetSplitValueList(String, TAB_EQUAL_SPLIT, MaxSplit = 1)

-    if List[0].find(':') > -1:

-        Family = List[0][ : List[0].find(':')].strip()

-        ToolChain = List[0][List[0].find(':') + 1 : ].strip()

     else:

-        ToolChain = List[0].strip()

-    Flag = List[1].strip()

-

+        List = GetSplitValueList(String, TAB_EQUAL_SPLIT, MaxSplit = 1)

+        if List[0].find(':') > -1:

+            Family = List[0][ : List[0].find(':')].strip()

+            ToolChain = List[0][List[0].find(':') + 1 : ].strip()

+        else:

+            ToolChain = List[0].strip()

+        Flag = List[1].strip()

     return (Family, ToolChain, Flag)

 

 ## Get Library Class

diff --git a/BaseTools/Source/Python/GenFds/FdfParser.py b/BaseTools/Source/Python/GenFds/FdfParser.py
index 92d6ab6..1e87eb4 100644
--- a/BaseTools/Source/Python/GenFds/FdfParser.py
+++ b/BaseTools/Source/Python/GenFds/FdfParser.py
@@ -1787,19 +1787,27 @@
         if not self.__GetNextHexNumber():

             raise Warning("expected Hex byte", self.FileName, self.CurrentLineNumber)

 

-        if len(self.__Token) > 4:

-            raise Warning("Hex byte(must be 2 digits) too long", self.FileName, self.CurrentLineNumber)

+        if len(self.__Token) > 18:

+            raise Warning("Hex string can't be converted to a valid UINT64 value", self.FileName, self.CurrentLineNumber)

 

-        DataString = self.__Token

-        DataString += ","

+        # convert hex string value to byte hex string array

+        AllString = self.__Token

+        AllStrLen = len (AllString)

+        DataString = ""

+        while AllStrLen > 4:

+            DataString = DataString + "0x" + AllString[AllStrLen - 2: AllStrLen] + ","

+            AllStrLen  = AllStrLen - 2

+        DataString = DataString + AllString[:AllStrLen] + ","

 

-        while self.__IsToken(","):

-            if not self.__GetNextHexNumber():

-                raise Warning("Invalid Hex number", self.FileName, self.CurrentLineNumber)

-            if len(self.__Token) > 4:

-                raise Warning("Hex byte(must be 2 digits) too long", self.FileName, self.CurrentLineNumber)

-            DataString += self.__Token

-            DataString += ","

+        # byte value array

+        if len (self.__Token) <= 4:

+            while self.__IsToken(","):

+                if not self.__GetNextHexNumber():

+                    raise Warning("Invalid Hex number", self.FileName, self.CurrentLineNumber)

+                if len(self.__Token) > 4:

+                    raise Warning("Hex byte(must be 2 digits) too long", self.FileName, self.CurrentLineNumber)

+                DataString += self.__Token

+                DataString += ","

 

         if not self.__IsToken( "}"):

             raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)

@@ -1819,18 +1827,27 @@
             if not self.__GetNextHexNumber():

                 raise Warning("expected Hex byte", self.FileName, self.CurrentLineNumber)

 

-            if len(self.__Token) > 4:

-                raise Warning("Hex byte(must be 2 digits) too long", self.FileName, self.CurrentLineNumber)

+            if len(self.__Token) > 18:

+                raise Warning("Hex string can't be converted to a valid UINT64 value", self.FileName, self.CurrentLineNumber)

 

-            DataString = self.__Token

-            DataString += ","

+            # convert hex string value to byte hex string array

+            AllString = self.__Token

+            AllStrLen = len (AllString)

+            DataString = ""

+            while AllStrLen > 4:

+                DataString = DataString + "0x" + AllString[AllStrLen - 2: AllStrLen] + ","

+                AllStrLen  = AllStrLen - 2

+            DataString = DataString + AllString[:AllStrLen] + ","

 

-            while self.__IsToken(","):

-                self.__GetNextHexNumber()

-                if len(self.__Token) > 4:

-                    raise Warning("Hex byte(must be 2 digits) too long", self.FileName, self.CurrentLineNumber)

-                DataString += self.__Token

-                DataString += ","

+            # byte value array

+            if len (self.__Token) <= 4:

+                while self.__IsToken(","):

+                    if not self.__GetNextHexNumber():

+                        raise Warning("Invalid Hex number", self.FileName, self.CurrentLineNumber)

+                    if len(self.__Token) > 4:

+                        raise Warning("Hex byte(must be 2 digits) too long", self.FileName, self.CurrentLineNumber)

+                    DataString += self.__Token

+                    DataString += ","

 

             if not self.__IsToken( "}"):

                 raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)

diff --git a/BaseTools/Source/Python/build/BuildReport.py b/BaseTools/Source/Python/build/BuildReport.py
index eac21d1..f805aae 100644
--- a/BaseTools/Source/Python/build/BuildReport.py
+++ b/BaseTools/Source/Python/build/BuildReport.py
@@ -221,7 +221,7 @@
                         EdkIILibInfo += " C = " + LibConstructor

                     LibDestructor = " ".join(LibraryItem[3])

                     if LibDestructor:

-                        EdkIILibInfo += " D = " + LibConstructor

+                        EdkIILibInfo += " D = " + LibDestructor

                     LibDepex = " ".join(LibraryItem[4])

                     if LibDepex:

                         EdkIILibInfo += " Depex = " + LibDepex

@@ -255,7 +255,8 @@
         ModuleType = M.ModuleType

         if not ModuleType:

             ModuleType = gComponentType2ModuleType.get(M.ComponentType, "")

-        if ModuleType in ["SEC", "PEI_CORE", "DXE_CORE"]:

+

+        if ModuleType in ["SEC", "PEI_CORE", "DXE_CORE", "SMM_CORE", "UEFI_APPLICATION"]:

             return

       

         for Source in M.SourceFileList:

@@ -404,17 +405,18 @@
         self.Size = 0

         self.BuildTimeStamp = None

         self.DriverType = ""

-        ModuleType = M.ModuleType

-        if not ModuleType:

-            ModuleType = gComponentType2ModuleType.get(M.ComponentType, "")

-        #

-        # If a module complies to PI 1.1, promote Module type to "SMM_DRIVER"

-        #

-        if ModuleType == "DXE_SMM_DRIVER":

-            PiSpec =  M.Module.Specification.get("PI_SPECIFICATION_VERSION", "0x00010000")

-            if int(PiSpec, 0) >= 0x0001000A:

-                ModuleType = "SMM_DRIVER"

-        self.DriverType = gDriverTypeMap.get(ModuleType, "")

+        if not M.IsLibrary:

+            ModuleType = M.ModuleType

+            if not ModuleType:

+                ModuleType = gComponentType2ModuleType.get(M.ComponentType, "")

+            #

+            # If a module complies to PI 1.1, promote Module type to "SMM_DRIVER"

+            #

+            if ModuleType == "DXE_SMM_DRIVER":

+                PiSpec =  M.Module.Specification.get("PI_SPECIFICATION_VERSION", "0x00010000")

+                if int(PiSpec, 0) >= 0x0001000A:

+                    ModuleType = "SMM_DRIVER"

+            self.DriverType = gDriverTypeMap.get(ModuleType, "0x2 (FREE_FORM)")

         self.UefiSpecVersion = M.Module.Specification.get("UEFI_SPECIFICATION_VERSION", "")

         self.PiSpecVersion = M.Module.Specification.get("PI_SPECIFICATION_VERSION", "")

         self.PciDeviceId = M.Module.Defines.get("PCI_DEVICE_ID", "")

@@ -1310,9 +1312,11 @@
 

         self.ModuleReportList = []

         if MaList != None:

+            self._IsModuleBuild = True

             for Ma in MaList:

                 self.ModuleReportList.append(ModuleReport(Ma, ReportType))

         else:

+            self._IsModuleBuild = False

             for Pa in Wa.AutoGenObjectList:

                 for ModuleKey in Pa.Platform.Modules:

                     self.ModuleReportList.append(ModuleReport(Pa.Platform.Modules[ModuleKey].M, ReportType))

@@ -1343,18 +1347,20 @@
         FileWrite(File, "Build Duration:       %s" % BuildDuration)

         FileWrite(File, "Report Content:       %s" % ", ".join(ReportType))

 

-        if "PCD" in ReportType:

-            self.PcdReport.GenerateReport(File, None)

-

-        if "FLASH" in ReportType:

-            for FdReportListItem in self.FdReportList:

-                FdReportListItem.GenerateReport(File)

+        if not self._IsModuleBuild:

+            if "PCD" in ReportType:

+                self.PcdReport.GenerateReport(File, None)

+    

+            if "FLASH" in ReportType:

+                for FdReportListItem in self.FdReportList:

+                    FdReportListItem.GenerateReport(File)

 

         for ModuleReportItem in self.ModuleReportList:

             ModuleReportItem.GenerateReport(File, self.PcdReport, self.PredictionReport, ReportType)

 

-        if "EXECUTION_ORDER" in ReportType:

-            self.PredictionReport.GenerateReport(File, None)

+        if not self._IsModuleBuild:

+            if "EXECUTION_ORDER" in ReportType:

+                self.PredictionReport.GenerateReport(File, None)

 

 ## BuildReport class

 #

@@ -1422,7 +1428,7 @@
                 EdkLogger.error("BuildReport", CODE_ERROR, "Unknown fatal error when generating build report", ExtraData=self.ReportFile, RaiseError=False)

                 EdkLogger.quiet("(Python %s on %s\n%s)" % (platform.python_version(), sys.platform, traceback.format_exc()))

             File.close()

-

+            

 # This acts like the main() function for the script, unless it is 'import'ed into another script.

 if __name__ == '__main__':

     pass

diff --git a/BaseTools/Source/Python/build/build.py b/BaseTools/Source/Python/build/build.py
index e3a3dd9..6129308 100644
--- a/BaseTools/Source/Python/build/build.py
+++ b/BaseTools/Source/Python/build/build.py
@@ -1090,9 +1090,10 @@
 

     ## Collect MAP information of all FVs

     #

-    def _CollectFvMapBuffer (self, MapBuffer, Wa):

+    def _CollectFvMapBuffer (self, MapBuffer, Wa, ModuleList):

         if self.Fdf != '':

             # First get the XIP base address for FV map file.

+            GuidPattern = re.compile("[-a-fA-F0-9]+")

             for FvName in Wa.FdfProfile.FvDict.keys():

                 FvMapBuffer = os.path.join(Wa.FvDir, FvName + '.Fv.map')

                 if not os.path.exists(FvMapBuffer):

@@ -1103,7 +1104,16 @@
                 FvMap.readline()

                 FvMap.readline()

                 FvMap.readline()

-                MapBuffer.write(FvMap.read())

+                for Line in FvMap:

+                    MatchGuid = GuidPattern.match(Line)

+                    if MatchGuid != None:

+                        #

+                        # Replace GUID with module name

+                        #

+                        GuidString = MatchGuid.group()

+                        if GuidString.upper() in ModuleList:

+                            Line = Line.replace(GuidString, ModuleList[GuidString.upper()].Name)

+                    MapBuffer.write('%s' % (Line))

                 FvMap.close()

 

     ## Collect MAP information of all modules

@@ -1124,7 +1134,8 @@
         IsIpfPlatform = False

         if 'IPF' in self.ArchList:

             IsIpfPlatform = True

-        for Module in ModuleList:

+        for ModuleGuid in ModuleList:

+            Module = ModuleList[ModuleGuid]

             GlobalData.gProcessingFile = "%s [%s, %s, %s]" % (Module.MetaFile, Module.Arch, Module.ToolChain, Module.BuildTarget)

             

             OutputImageFile = ''

@@ -1259,7 +1270,8 @@
         #

         SaveFileOnChange(MapFilePath, MapBuffer.getvalue(), False)

         MapBuffer.close()

-        sys.stdout.write ("\nLoad Module At Fix Address Map file saved to %s\n" %(MapFilePath))
+        if self.LoadFixAddress != 0:
+            sys.stdout.write ("\nLoad Module At Fix Address Map file saved to %s\n" %(MapFilePath))
         sys.stdout.flush()
 

     ## Build active platform for different build targets and different tool chains

@@ -1286,7 +1298,7 @@
                 self._Build(self.Target, Wa)

                 

                 # Create MAP file when Load Fix Address is enabled.

-                if self.Target in ["", "all", "fds"] and self.LoadFixAddress != 0:

+                if self.Target in ["", "all", "fds"]:

                     for Arch in self.ArchList:

                         #

                         # Check whether the set fix address is above 4G for 32bit image.

@@ -1296,19 +1308,20 @@
                     #

                     # Get Module List

                     #

-                    ModuleList = []

+                    ModuleList = {}

                     for Pa in Wa.AutoGenObjectList:

                         for Ma in Pa.ModuleAutoGenList:

                             if Ma == None:

                                 continue

                             if not Ma.IsLibrary:

-                                ModuleList.append (Ma)

+                                ModuleList[Ma.Guid.upper()] = Ma

 

                     MapBuffer = StringIO('')

-                    #

-                    # Rebase module to the preferred memory address before GenFds

-                    #

-                    self._CollectModuleMapBuffer(MapBuffer, ModuleList)

+                    if self.LoadFixAddress != 0:

+                        #

+                        # Rebase module to the preferred memory address before GenFds

+                        #

+                        self._CollectModuleMapBuffer(MapBuffer, ModuleList)

                     if self.Fdf != '':

                         #

                         # create FDS again for the updated EFI image

@@ -1317,7 +1330,7 @@
                         #

                         # Create MAP file for all platform FVs after GenFds.

                         #

-                        self._CollectFvMapBuffer(MapBuffer, Wa)

+                        self._CollectFvMapBuffer(MapBuffer, Wa, ModuleList)

                     #

                     # Save MAP buffer into MAP file.

                     #

@@ -1367,7 +1380,7 @@
                                 ExtraData=self.ModuleFile

                                 )

                 # Create MAP file when Load Fix Address is enabled.

-                if self.LoadFixAddress != 0 and self.Target == "fds" and self.Fdf != '':

+                if self.Target == "fds" and self.Fdf != '':

                     for Arch in self.ArchList:

                         #

                         # Check whether the set fix address is above 4G for 32bit image.

@@ -1377,27 +1390,28 @@
                     #

                     # Get Module List

                     #

-                    ModuleList = []

+                    ModuleList = {}

                     for Pa in Wa.AutoGenObjectList:

                         for Ma in Pa.ModuleAutoGenList:

                             if Ma == None:

                                 continue

                             if not Ma.IsLibrary:

-                                ModuleList.append (Ma)

+                                ModuleList[Ma.Guid.upper()] = Ma

 

                     MapBuffer = StringIO('')

-                    #

-                    # Rebase module to the preferred memory address before GenFds

-                    #

-                    self._CollectModuleMapBuffer(MapBuffer, ModuleList)

-                    #

-                    # create FDS again for the updated EFI image

-                    #

-                    self._Build("fds", Wa)

+                    if self.LoadFixAddress != 0:

+                        #

+                        # Rebase module to the preferred memory address before GenFds

+                        #

+                        self._CollectModuleMapBuffer(MapBuffer, ModuleList)

+                        #

+                        # create FDS again for the updated EFI image

+                        #

+                        self._Build("fds", Wa)

                     #

                     # Create MAP file for all platform FVs after GenFds.

                     #

-                    self._CollectFvMapBuffer(MapBuffer, Wa)

+                    self._CollectFvMapBuffer(MapBuffer, Wa, ModuleList)

                     #

                     # Save MAP buffer into MAP file.

                     #

@@ -1483,7 +1497,7 @@
                     EdkLogger.error("build", BUILD_ERROR, "Failed to build module", ExtraData=GlobalData.gBuildingModule)

 

                 # Create MAP file when Load Fix Address is enabled.

-                if self.Target in ["", "all", "fds"] and self.LoadFixAddress != 0:

+                if self.Target in ["", "all", "fds"]:

                     for Arch in self.ArchList:

                         #

                         # Check whether the set fix address is above 4G for 32bit image.

@@ -1493,30 +1507,31 @@
                     #

                     # Get Module List

                     #

-                    ModuleList = []

+                    ModuleList = {}

                     for Pa in Wa.AutoGenObjectList:

                         for Ma in Pa.ModuleAutoGenList:

                             if Ma == None:

                                 continue

                             if not Ma.IsLibrary:

-                                ModuleList.append (Ma)

+                                ModuleList[Ma.Guid.upper()] = Ma

                     #

                     # Rebase module to the preferred memory address before GenFds

                     #

                     MapBuffer = StringIO('')

-                    self._CollectModuleMapBuffer(MapBuffer, ModuleList)

+                    if self.LoadFixAddress != 0:

+                        self._CollectModuleMapBuffer(MapBuffer, ModuleList)

 

                 # Generate FD image if there's a FDF file found

                 if self.Fdf != '' and self.Target in ["", "all", "fds"]:

                     LaunchCommand(Wa.BuildCommand + ["fds"], Wa.MakeFileDir)

 

                 # Create MAP file for all platform FV after GenFds

-                if self.Target in ["", "all", "fds"] and self.LoadFixAddress != 0:

+                if self.Target in ["", "all", "fds"]:

                     if self.Fdf != '':

                         #

                         # Create MAP file for all platform FVs after GenFds.

                         #

-                        self._CollectFvMapBuffer(MapBuffer, Wa)

+                        self._CollectFvMapBuffer(MapBuffer, Wa, ModuleList)

                     #

                     # Save MAP buffer into MAP file.

                     #