]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/C/GenFw/GenFw.c
BaseTools: Remove unused logic from C tools
[mirror_edk2.git] / BaseTools / Source / C / GenFw / GenFw.c
index 9ddd18e294a0503523bd8aaa5ee8ac5f44c0057b..37278bbc68eedbf47524030d8c908438ee624732 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
 Converts a pe32+ image to an FW, Te image type, or other specific image.\r
 \r
-Copyright (c) 2004 - 2015, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>\r
 This program and the accompanying materials\r
 are licensed and made available under the terms and conditions of the BSD License\r
 which accompanies this distribution.  The full text of the license may be found at\r
@@ -92,6 +92,7 @@ CHAR8  *mInImageName;
 UINT32 mImageTimeStamp = 0;\r
 UINT32 mImageSize = 0;\r
 UINT32 mOutImageType = FW_DUMMY_IMAGE;\r
+BOOLEAN mIsConvertXip = FALSE;\r
 \r
 \r
 STATIC\r
@@ -168,7 +169,7 @@ Returns:
   //\r
   // Copyright declaration\r
   //\r
-  fprintf (stdout, "Copyright (c) 2007 - 2015, Intel Corporation. All rights reserved.\n\n");\r
+  fprintf (stdout, "Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.\n\n");\r
 \r
   //\r
   // Details Option\r
@@ -181,6 +182,7 @@ Returns:
                         PEI_CORE, PEIM, DXE_CORE, DXE_DRIVER, UEFI_APPLICATION,\n\\r
                         SEC, DXE_SAL_DRIVER, UEFI_DRIVER, DXE_RUNTIME_DRIVER,\n\\r
                         DXE_SMM_DRIVER, SECURITY_CORE, COMBINED_PEIM_DRIVER,\n\\r
+                        MM_STANDALONE, MM_CORE_STANDALONE,\n\\r
                         PIC_PEIM, RELOCATABLE_PEIM, BS_DRIVER, RT_DRIVER,\n\\r
                         APPLICATION, SAL_RT_DRIVER to support all module types\n\\r
                         It can only be used together with --keepexceptiontable,\n\\r
@@ -240,7 +242,7 @@ Returns:
                         If it is combined with other action options, the later\n\\r
                         input action option will override the previous one.\n");\r
   fprintf (stdout, "  -a NUM, --align NUM   NUM is one HEX or DEC format alignment value.\n\\r
-                        This option is only used together with -j option.\n");  \r
+                        This option is only used together with -j option.\n");\r
   fprintf (stdout, "  -p NUM, --pad NUM     NUM is one HEX or DEC format padding value.\n\\r
                         This option is only used together with -j option.\n");\r
   fprintf (stdout, "  --keepexceptiontable  Don't clear exception table.\n\\r
@@ -488,7 +490,7 @@ SetHiiResourceHeader (
         }\r
 \r
         //\r
-        // Now it ought to be resource Data and update its OffsetToData value \r
+        // Now it ought to be resource Data and update its OffsetToData value\r
         //\r
         if (!ResourceDirectoryEntry->u2.s.DataIsDirectory) {\r
           ResourceDataEntry = (EFI_IMAGE_RESOURCE_DATA_ENTRY *) (HiiBinData + ResourceDirectoryEntry->u2.OffsetToData);\r
@@ -499,7 +501,7 @@ SetHiiResourceHeader (
     }\r
     ResourceDirectoryEntry++;\r
   }\r
-  \r
+\r
   return;\r
 }\r
 \r
@@ -528,7 +530,7 @@ GetPeCoffHeader (
       return NULL;\r
     }\r
   }\r
-  \r
+\r
   return PeHdr;\r
 }\r
 \r
@@ -553,7 +555,7 @@ PeCoffConvertImageToXip (
   if (PeHdr == NULL) {\r
     return;\r
   }\r
-  \r
+\r
   if (PeHdr->Pe32.OptionalHeader.SectionAlignment != PeHdr->Pe32.OptionalHeader.FileAlignment) {\r
     //\r
     // The only reason to expand zero fill sections is to make them compatible with XIP images.\r
@@ -625,6 +627,10 @@ PeCoffConvertImageToXip (
   // Allocate the extra space that we need to grow the image\r
   //\r
   XipFile = malloc (XipLength);\r
+  if (XipFile == NULL) {\r
+    Error (NULL, 0, 4001, "Resource", "memory cannot be allocated!");\r
+    return;\r
+  }\r
   memset (XipFile, 0, XipLength);\r
 \r
   //\r
@@ -660,11 +666,13 @@ PeCoffConvertImageToXip (
   free (*FileBuffer);\r
   *FileLength = XipLength;\r
   *FileBuffer = XipFile;\r
+\r
+  mIsConvertXip = TRUE;\r
 }\r
 \r
 UINT8 *\r
 CreateHiiResouceSectionHeader (\r
-  UINT32 *pSectionHeaderSize, \r
+  UINT32 *pSectionHeaderSize,\r
   UINT32 HiiDataSize\r
   )\r
 /*++\r
@@ -697,15 +705,19 @@ Returns:
   // Calculate the total size for the resource header (include Type, Name and Language)\r
   // then allocate memory for the resource header.\r
   //\r
-  HiiSectionHeaderSize = 3 * (sizeof (EFI_IMAGE_RESOURCE_DIRECTORY) + sizeof (EFI_IMAGE_RESOURCE_DIRECTORY_ENTRY)) \r
-                          + 3 * (sizeof (UINT16) + 3 * sizeof (CHAR16)) \r
+  HiiSectionHeaderSize = 3 * (sizeof (EFI_IMAGE_RESOURCE_DIRECTORY) + sizeof (EFI_IMAGE_RESOURCE_DIRECTORY_ENTRY))\r
+                          + 3 * (sizeof (UINT16) + 3 * sizeof (CHAR16))\r
                           + sizeof (EFI_IMAGE_RESOURCE_DATA_ENTRY);\r
   HiiSectionHeader = malloc (HiiSectionHeaderSize);\r
+  if (HiiSectionHeader == NULL) {\r
+    Error (NULL, 0, 4001, "Resource", "memory cannot be allocated!");\r
+    return NULL;\r
+  }\r
   memset (HiiSectionHeader, 0, HiiSectionHeaderSize);\r
 \r
   HiiSectionOffset = 0;\r
   //\r
-  // Create Type entry \r
+  // Create Type entry\r
   //\r
   ResourceDirectory = (EFI_IMAGE_RESOURCE_DIRECTORY *) (HiiSectionHeader + HiiSectionOffset);\r
   HiiSectionOffset += sizeof (EFI_IMAGE_RESOURCE_DIRECTORY);\r
@@ -865,7 +877,7 @@ Returns:
 \r
   if (ImageContext.RelocationsStripped) {\r
     Error (NULL, 0, 3000, "Invalid", "The input PeImage %s has no relocation to be fixed up", FileName);\r
-    return Status;    \r
+    return Status;\r
   }\r
 \r
   //\r
@@ -878,8 +890,8 @@ Returns:
   //\r
   SectionHeader = (EFI_IMAGE_SECTION_HEADER *) (\r
     (UINTN) ImgHdr +\r
-    sizeof (UINT32) + \r
-    sizeof (EFI_IMAGE_FILE_HEADER) +  \r
+    sizeof (UINT32) +\r
+    sizeof (EFI_IMAGE_FILE_HEADER) +\r
     ImgHdr->Pe32.FileHeader.SizeOfOptionalHeader\r
     );\r
 \r
@@ -893,13 +905,6 @@ Returns:
     }\r
   }\r
 \r
-  //\r
-  // No available section header is found.\r
-  //\r
-  if (Index == ImgHdr->Pe32.FileHeader.NumberOfSections) {\r
-    return EFI_NOT_FOUND;\r
-  }\r
-  \r
   //\r
   // BaseAddress is set to section header.\r
   //\r
@@ -952,7 +957,7 @@ Returns:
 \r
   if (ImageContext.RelocationsStripped) {\r
     Error (NULL, 0, 3000, "Invalid", "The input PeImage %s has no relocation to be fixed up", FileName);\r
-    return Status;    \r
+    return Status;\r
   }\r
 \r
   //\r
@@ -991,15 +996,15 @@ Returns:
   //\r
   SectionHeader = (EFI_IMAGE_SECTION_HEADER *) (\r
     (UINTN) ImgHdr +\r
-    sizeof (UINT32) + \r
-    sizeof (EFI_IMAGE_FILE_HEADER) +  \r
+    sizeof (UINT32) +\r
+    sizeof (EFI_IMAGE_FILE_HEADER) +\r
     ImgHdr->Pe32.FileHeader.SizeOfOptionalHeader\r
     );\r
 \r
   for (Index = 0; Index < ImgHdr->Pe32.FileHeader.NumberOfSections; Index ++, SectionHeader ++) {\r
     CopyMem (\r
-      FileBuffer + SectionHeader->PointerToRawData, \r
-      (VOID*) (UINTN) (ImageContext.ImageAddress + SectionHeader->VirtualAddress), \r
+      FileBuffer + SectionHeader->PointerToRawData,\r
+      (VOID*) (UINTN) (ImageContext.ImageAddress + SectionHeader->VirtualAddress),\r
       SectionHeader->SizeOfRawData\r
       );\r
   }\r
@@ -1009,7 +1014,7 @@ Returns:
   //\r
   // Update Image Base Address\r
   //\r
-  if ((ImgHdr->Pe32.OptionalHeader.Magic == EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC) && (ImgHdr->Pe32.FileHeader.Machine != IMAGE_FILE_MACHINE_IA64)) {\r
+  if ((ImgHdr->Pe32.OptionalHeader.Magic == EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC)) {\r
     ImgHdr->Pe32.OptionalHeader.ImageBase = (UINT32) NewPe32BaseAddress;\r
   } else if (ImgHdr->Pe32Plus.OptionalHeader.Magic == EFI_IMAGE_NT_OPTIONAL_HDR64_MAGIC) {\r
     ImgHdr->Pe32Plus.OptionalHeader.ImageBase = NewPe32BaseAddress;\r
@@ -1100,7 +1105,7 @@ Returns:
   EFI_HII_PACKAGE_LIST_HEADER      HiiPackageListHeader;\r
   EFI_HII_PACKAGE_HEADER           HiiPackageHeader;\r
   EFI_IFR_FORM_SET                 IfrFormSet;\r
-  UINT8                            NumberOfFormPacakge;\r
+  UINT8                            NumberOfFormPackage;\r
   EFI_HII_PACKAGE_HEADER           EndPackage;\r
   UINT32                           HiiSectionHeaderSize;\r
   UINT8                            *HiiSectionHeader;\r
@@ -1147,7 +1152,7 @@ Returns:
   KeepExceptionTableFlag = FALSE;\r
   KeepOptionalHeaderFlag = FALSE;\r
   KeepZeroPendingFlag    = FALSE;\r
-  NumberOfFormPacakge    = 0;\r
+  NumberOfFormPackage    = 0;\r
   HiiPackageListBuffer   = NULL;\r
   HiiPackageDataPointer  = NULL;\r
   EndPackage.Length      = sizeof (EFI_HII_PACKAGE_HEADER);\r
@@ -1649,7 +1654,7 @@ Returns:
           fread (&IfrFormSet, 1, sizeof (IfrFormSet), fpIn);\r
           memcpy (&HiiPackageListGuid, &IfrFormSet.Guid, sizeof (EFI_GUID));\r
         }\r
-        NumberOfFormPacakge ++;\r
+        NumberOfFormPackage ++;\r
       }\r
       HiiPackageListHeader.PackageLength += FileLength;\r
       fclose (fpIn);\r
@@ -1658,7 +1663,7 @@ Returns:
     //\r
     // Check whether hii packages are valid\r
     //\r
-    if (NumberOfFormPacakge > 1) {\r
+    if (NumberOfFormPackage > 1) {\r
       Error (NULL, 0, 3000, "Invalid", "The input hii packages contains more than one hii form package");\r
       goto Finish;\r
     }\r
@@ -1700,6 +1705,10 @@ Returns:
       // Create the resource section header\r
       //\r
       HiiSectionHeader = CreateHiiResouceSectionHeader (&HiiSectionHeaderSize, HiiPackageListHeader.PackageLength);\r
+      if (HiiSectionHeader == NULL) {\r
+        free (HiiPackageListBuffer);\r
+        goto Finish;\r
+      }\r
       //\r
       // Wrtie section header and HiiData into File.\r
       //\r
@@ -2004,7 +2013,9 @@ Returns:
         stricmp (ModuleType, "DXE_DRIVER") == 0 ||\r
         stricmp (ModuleType, "DXE_SMM_DRIVER") == 0  ||\r
         stricmp (ModuleType, "UEFI_DRIVER") == 0 ||\r
-        stricmp (ModuleType, "SMM_CORE") == 0) {\r
+        stricmp (ModuleType, "SMM_CORE") == 0 ||\r
+        stricmp (ModuleType, "MM_STANDALONE") == 0 ||\r
+        stricmp (ModuleType, "MM_CORE_STANDALONE") == 0) {\r
           Type = EFI_IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER;\r
           VerboseMsg ("Efi Image subsystem type is efi boot service driver.");\r
 \r
@@ -2169,13 +2180,13 @@ Returns:
   // Set new base address into image\r
   //\r
   if (mOutImageType == FW_REBASE_IMAGE || mOutImageType == FW_SET_ADDRESS_IMAGE) {\r
-    if ((PeHdr->Pe32.OptionalHeader.Magic == EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC) && (PeHdr->Pe32.FileHeader.Machine != IMAGE_FILE_MACHINE_IA64)) {\r
+    if ((PeHdr->Pe32.OptionalHeader.Magic == EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC)) {\r
       if (NewBaseAddress >= 0x100000000ULL) {\r
         Error (NULL, 0, 3000, "Invalid", "New base address is larger than 4G for 32bit PE image");\r
         goto Finish;\r
       }\r
     }\r
-    \r
+\r
     if (NegativeAddr) {\r
       //\r
       // Set Base Address to a negative value.\r
@@ -2440,7 +2451,7 @@ Returns:
     // Zero the .pdata section for X64 machine and don't check the Debug Directory is empty\r
     // For Itaninum and X64 Image, remove .pdata section.\r
     //\r
-    if ((!KeepExceptionTableFlag && PeHdr->Pe32.FileHeader.Machine == IMAGE_FILE_MACHINE_X64) || PeHdr->Pe32.FileHeader.Machine == IMAGE_FILE_MACHINE_IA64) {\r
+    if ((!KeepExceptionTableFlag && PeHdr->Pe32.FileHeader.Machine == IMAGE_FILE_MACHINE_X64)) {\r
       if (Optional64->NumberOfRvaAndSizes > EFI_IMAGE_DIRECTORY_ENTRY_EXCEPTION &&\r
         Optional64->DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_EXCEPTION].VirtualAddress != 0 &&\r
         Optional64->DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_EXCEPTION].Size != 0) {\r
@@ -2523,7 +2534,7 @@ Returns:
     (TEImageHeader.DataDirectory[EFI_TE_IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress == 0) && \\r
     (TEImageHeader.DataDirectory[EFI_TE_IMAGE_DIRECTORY_ENTRY_BASERELOC].Size == 0)) {\r
       //\r
-      // PeImage can be loaded into memory, but it has no relocation section. \r
+      // PeImage can be loaded into memory, but it has no relocation section.\r
       // Fix TeImage Header to set VA of relocation data directory to not zero, the size is still zero.\r
       //\r
       if (Optional32 != NULL) {\r
@@ -2705,7 +2716,7 @@ Finish:
       }\r
     }\r
   }\r
-  \r
+\r
   if (InputFileBuffer != NULL) {\r
     free (InputFileBuffer);\r
   }\r
@@ -2724,7 +2735,7 @@ Finish:
     ReportFileName = (CHAR8 *) malloc (FileLen + 1);\r
     if (ReportFileName != NULL) {\r
       strcpy (ReportFileName, OutImageName);\r
-      strcpy (ReportFileName + (FileLen - 4), ".txt"); \r
+      strcpy (ReportFileName + (FileLen - 4), ".txt");\r
       ReportFile = fopen (LongFilePath (ReportFileName), "w+");\r
       if (ReportFile != NULL) {\r
         fprintf (ReportFile, "MODULE_SIZE = %u\n", (unsigned) mImageSize);\r
@@ -2765,6 +2776,7 @@ Returns:
 {\r
   UINT32                           Index;\r
   UINT32                           DebugDirectoryEntryRva;\r
+  UINT32                           DebugDirectoryEntrySize;\r
   UINT32                           DebugDirectoryEntryFileOffset;\r
   UINT32                           ExportDirectoryEntryRva;\r
   UINT32                           ExportDirectoryEntryFileOffset;\r
@@ -2776,12 +2788,14 @@ Returns:
   EFI_IMAGE_OPTIONAL_HEADER64     *Optional64Hdr;\r
   EFI_IMAGE_SECTION_HEADER        *SectionHeader;\r
   EFI_IMAGE_DEBUG_DIRECTORY_ENTRY *DebugEntry;\r
-  UINT32                          *NewTimeStamp;  \r
+  EFI_IMAGE_DEBUG_CODEVIEW_RSDS_ENTRY *RsdsEntry;\r
+  UINT32                          *NewTimeStamp;\r
 \r
   //\r
   // Init variable.\r
   //\r
   DebugDirectoryEntryRva           = 0;\r
+  DebugDirectoryEntrySize          = 0;\r
   ExportDirectoryEntryRva          = 0;\r
   ResourceDirectoryEntryRva        = 0;\r
   DebugDirectoryEntryFileOffset    = 0;\r
@@ -2803,8 +2817,9 @@ Returns:
   // Get Debug, Export and Resource EntryTable RVA address.\r
   // Resource Directory entry need to review.\r
   //\r
-  if (FileHdr->Machine == EFI_IMAGE_MACHINE_IA32) {\r
-    Optional32Hdr = (EFI_IMAGE_OPTIONAL_HEADER32 *) ((UINT8*) FileHdr + sizeof (EFI_IMAGE_FILE_HEADER));\r
+  Optional32Hdr = (EFI_IMAGE_OPTIONAL_HEADER32 *) ((UINT8*) FileHdr + sizeof (EFI_IMAGE_FILE_HEADER));\r
+  Optional64Hdr = (EFI_IMAGE_OPTIONAL_HEADER64 *) ((UINT8*) FileHdr + sizeof (EFI_IMAGE_FILE_HEADER));\r
+  if (Optional32Hdr->Magic == EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC) {\r
     SectionHeader = (EFI_IMAGE_SECTION_HEADER *) ((UINT8 *) Optional32Hdr +  FileHdr->SizeOfOptionalHeader);\r
     if (Optional32Hdr->NumberOfRvaAndSizes > EFI_IMAGE_DIRECTORY_ENTRY_EXPORT && \\r
         Optional32Hdr->DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_EXPORT].Size != 0) {\r
@@ -2817,13 +2832,13 @@ Returns:
     if (Optional32Hdr->NumberOfRvaAndSizes > EFI_IMAGE_DIRECTORY_ENTRY_DEBUG && \\r
         Optional32Hdr->DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_DEBUG].Size != 0) {\r
       DebugDirectoryEntryRva = Optional32Hdr->DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_DEBUG].VirtualAddress;\r
+      DebugDirectoryEntrySize = Optional32Hdr->DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_DEBUG].Size;\r
       if (ZeroDebugFlag) {\r
         Optional32Hdr->DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_DEBUG].Size = 0;\r
         Optional32Hdr->DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_DEBUG].VirtualAddress = 0;\r
       }\r
     }\r
   } else {\r
-    Optional64Hdr = (EFI_IMAGE_OPTIONAL_HEADER64 *) ((UINT8*) FileHdr + sizeof (EFI_IMAGE_FILE_HEADER));\r
     SectionHeader = (EFI_IMAGE_SECTION_HEADER *) ((UINT8 *) Optional64Hdr +  FileHdr->SizeOfOptionalHeader);\r
     if (Optional64Hdr->NumberOfRvaAndSizes > EFI_IMAGE_DIRECTORY_ENTRY_EXPORT && \\r
         Optional64Hdr->DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_EXPORT].Size != 0) {\r
@@ -2836,6 +2851,7 @@ Returns:
     if (Optional64Hdr->NumberOfRvaAndSizes > EFI_IMAGE_DIRECTORY_ENTRY_DEBUG && \\r
         Optional64Hdr->DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_DEBUG].Size != 0) {\r
       DebugDirectoryEntryRva = Optional64Hdr->DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_DEBUG].VirtualAddress;\r
+      DebugDirectoryEntrySize = Optional64Hdr->DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_DEBUG].Size;\r
       if (ZeroDebugFlag) {\r
         Optional64Hdr->DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_DEBUG].Size = 0;\r
         Optional64Hdr->DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_DEBUG].VirtualAddress = 0;\r
@@ -2881,11 +2897,30 @@ Returns:
 \r
   if (DebugDirectoryEntryFileOffset != 0) {\r
     DebugEntry = (EFI_IMAGE_DEBUG_DIRECTORY_ENTRY *) (FileBuffer + DebugDirectoryEntryFileOffset);\r
-    DebugEntry->TimeDateStamp = 0;\r
-    mImageTimeStamp = 0;\r
-    if (ZeroDebugFlag) {\r
-      memset (FileBuffer + DebugEntry->FileOffset, 0, DebugEntry->SizeOfData);\r
-      memset (DebugEntry, 0, sizeof (EFI_IMAGE_DEBUG_DIRECTORY_ENTRY));\r
+    Index = 0;\r
+    for (Index=0; Index < DebugDirectoryEntrySize / sizeof (EFI_IMAGE_DEBUG_DIRECTORY_ENTRY); Index ++, DebugEntry ++) {\r
+      DebugEntry->TimeDateStamp = 0;\r
+      if (mIsConvertXip) {\r
+        DebugEntry->FileOffset = DebugEntry->RVA;\r
+      }\r
+      if (ZeroDebugFlag || DebugEntry->Type != EFI_IMAGE_DEBUG_TYPE_CODEVIEW) {\r
+        memset (FileBuffer + DebugEntry->FileOffset, 0, DebugEntry->SizeOfData);\r
+        memset (DebugEntry, 0, sizeof (EFI_IMAGE_DEBUG_DIRECTORY_ENTRY));\r
+      }\r
+      if (DebugEntry->Type == EFI_IMAGE_DEBUG_TYPE_CODEVIEW) {\r
+        RsdsEntry = (EFI_IMAGE_DEBUG_CODEVIEW_RSDS_ENTRY *) (FileBuffer + DebugEntry->FileOffset);\r
+        if (RsdsEntry->Signature == CODEVIEW_SIGNATURE_MTOC) {\r
+          // MTOC sets DebugDirectoryEntrySize to size of the .debug section, so fix it.\r
+          if (!ZeroDebugFlag) {\r
+            if (Optional32Hdr->Magic == EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC) {\r
+              Optional32Hdr->DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_DEBUG].Size = sizeof (EFI_IMAGE_DEBUG_DIRECTORY_ENTRY);\r
+            } else {\r
+              Optional64Hdr->DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_DEBUG].Size = sizeof (EFI_IMAGE_DEBUG_DIRECTORY_ENTRY);\r
+            }\r
+          }\r
+          break;\r
+        }\r
+      }\r
     }\r
   }\r
 \r
@@ -2933,7 +2968,7 @@ Returns:
   EFI_IMAGE_OPTIONAL_HEADER64     *Optional64Hdr;\r
   EFI_IMAGE_SECTION_HEADER        *SectionHeader;\r
   UINT32                          *NewTimeStamp;\r
-  \r
+\r
   //\r
   // Init variable.\r
   //\r
@@ -3035,8 +3070,10 @@ Returns:
   }\r
 \r
   ptime = localtime (&newtime);\r
-  DebugMsg (NULL, 0, 9, "New Image Time Stamp", "%04d-%02d-%02d %02d:%02d:%02d",\r
-            ptime->tm_year + 1900, ptime->tm_mon + 1, ptime->tm_mday, ptime->tm_hour, ptime->tm_min, ptime->tm_sec);\r
+  if (ptime != NULL) {\r
+    DebugMsg (NULL, 0, 9, "New Image Time Stamp", "%04d-%02d-%02d %02d:%02d:%02d",\r
+              ptime->tm_year + 1900, ptime->tm_mon + 1, ptime->tm_mday, ptime->tm_hour, ptime->tm_min, ptime->tm_sec);\r
+  }\r
   //\r
   // Set new time and data into PeImage.\r
   //\r
@@ -3151,7 +3188,7 @@ Returns:
 {\r
   CHAR8  Line[MAX_LINE_LEN];\r
   CHAR8  *cptr;\r
-  unsigned ScannedData = 0;\r
+  int    ScannedData = 0;\r
 \r
   Line[MAX_LINE_LEN - 1]  = 0;\r
   while (1) {\r