Add support to Zero .xdata exception section to increase compression ratio.
authorlgao4 <lgao4@7335b38e-4728-0410-8992-fb3ffe349368>
Wed, 21 Jan 2009 08:42:14 +0000 (08:42 +0000)
committerlgao4 <lgao4@7335b38e-4728-0410-8992-fb3ffe349368>
Wed, 21 Jan 2009 08:42:14 +0000 (08:42 +0000)
git-svn-id: https://buildtools.tianocore.org/svn/buildtools/trunk/BaseTools@1456 7335b38e-4728-0410-8992-fb3ffe349368

Source/C/GenFw/GenFw.c

index b029a11..509df54 100644 (file)
@@ -973,6 +973,139 @@ ConvertElf (
 }\r
 #endif // HAVE_ELF\r
 \r
+void\r
+ZeroXdataSection (\r
+ IN     CHAR8                 *ImageName,\r
+ IN OUT UINT8                 *FileBuffer,\r
+ IN EFI_IMAGE_SECTION_HEADER  *SectionHeader,\r
+ IN     UINT32                 SectionTotalNumber\r
+  )\r
+{\r
+  FILE   *fpMapFile;\r
+  CHAR8  MapFileName[_MAX_PATH];\r
+  CHAR8  Line [MAX_LINE_LEN];\r
+  CHAR8  KeyWord [MAX_LINE_LEN];\r
+  CHAR8  SectionName [MAX_LINE_LEN];\r
+  UINT32 FunctionType = 0;  \r
+  UINT32 SectionOffset;\r
+  UINT32 SectionLength;\r
+  UINT32 SectionNumber;\r
+  CHAR8  *PdbPointer;\r
+  INT32  Index = 0;\r
+  \r
+  for (Index = 0; Index < SectionTotalNumber; Index ++) {\r
+    if (stricmp (SectionHeader[Index].Name, ".zdata") == 0) {\r
+      //\r
+      // try to zero the customized .zdata section, which is mapped to .xdata\r
+      //\r
+      memset (FileBuffer + SectionHeader[Index].PointerToRawData, 0, SectionHeader[Index].SizeOfRawData);\r
+      DebugMsg (NULL, 0, 9, NULL, "Zero the .xdata section for PE image at Offset 0x%x and Length 0x%x", SectionHeader[Index].PointerToRawData, SectionHeader[Index].SizeOfRawData);\r
+      return;\r
+    }\r
+  }\r
+  //\r
+  // Try to get PDB file name\r
+  //\r
+  PdbPointer = (CHAR8  *) PeCoffLoaderGetPdbPointer (FileBuffer);\r
+  if (PdbPointer != NULL) {\r
+    strcpy (MapFileName, PdbPointer);\r
+  } else {\r
+    strcpy (MapFileName, ImageName);\r
+  }\r
+\r
+  //\r
+  // Construct map file name\r
+  //\r
+  Index = strlen (MapFileName) - 1;\r
+  while (Index >= 0 && MapFileName[Index] != '.') {\r
+    Index --;\r
+  }\r
+  if (Index < 0) {\r
+    //\r
+    // don't know how to costruct map file\r
+    //\r
+    return;\r
+  }\r
+\r
+  //\r
+  // fill map file postfix\r
+  //\r
+  MapFileName[Index + 1] = 'm';\r
+  MapFileName[Index + 2] = 'a';\r
+  MapFileName[Index + 3] = 'p';\r
+  MapFileName[Index + 4] = '\0';\r
+  \r
+  //\r
+  // try opening Map File\r
+  //\r
+  fpMapFile = fopen (MapFileName, "r");\r
+  if (fpMapFile == NULL) {\r
+    //\r
+    // Can't open Map file. Maybe it doesn't exist.\r
+    //\r
+    return;\r
+  }\r
+  \r
+  //\r
+  // Output Functions information into Fv Map file\r
+  //\r
+  while (fgets (Line, MAX_LINE_LEN, fpMapFile) != NULL) {  \r
+    //\r
+    // Skip blank line\r
+    //\r
+    if (Line[0] == 0x0a) {\r
+      if (FunctionType != 0) {\r
+        //\r
+        // read all section table data\r
+        //\r
+        FunctionType = 0;\r
+        break;\r
+      }\r
+      FunctionType = 0;\r
+      continue;\r
+    }\r
+\r
+    //\r
+    // By Start keyword\r
+    //\r
+    if (FunctionType == 0) {\r
+      sscanf (Line, "%s", KeyWord);\r
+      if (stricmp (KeyWord, "Start") == 0) {\r
+        //\r
+        // function list\r
+        //\r
+        FunctionType = 1;\r
+      }\r
+      continue;\r
+    }\r
+    //\r
+    // Printf Function Information\r
+    //\r
+    if (FunctionType == 1) {\r
+      sscanf (Line, "%x:%x %xH %s", &SectionNumber, &SectionOffset, &SectionLength, SectionName);\r
+      if (stricmp (SectionName, ".xdata") == 0) {\r
+        break;\r
+      }\r
+    }\r
+  }\r
+  \r
+  if (FunctionType == 0) {\r
+    //\r
+    // no .xdata section is found\r
+    //\r
+    fclose (fpMapFile);\r
+    return;\r
+  }\r
+\r
+  //\r
+  // Zero .xdata Section data\r
+  //\r
+  memset (FileBuffer + SectionHeader[SectionNumber-1].PointerToRawData + SectionOffset, 0, SectionLength);\r
+  DebugMsg (NULL, 0, 9, NULL, "Zero the .xdata section for PE image at Offset 0x%x and Length 0x%x", SectionHeader[SectionNumber-1].PointerToRawData + SectionOffset, SectionLength);\r
+  fclose (fpMapFile);\r
+  return;\r
+}\r
+\r
 int\r
 main (\r
   int  argc,\r
@@ -2038,7 +2171,6 @@ Returns:
       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
-        //if (Optional64->NumberOfRvaAndSizes <= EFI_IMAGE_DIRECTORY_ENTRY_DEBUG || (Optional64->NumberOfRvaAndSizes > EFI_IMAGE_DIRECTORY_ENTRY_DEBUG && Optional64->DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_DEBUG].Size == 0)) {\r
         SectionHeader = (EFI_IMAGE_SECTION_HEADER *)(FileBuffer + DosHdr->e_lfanew + sizeof(UINT32) + sizeof (EFI_IMAGE_FILE_HEADER) + PeHdr->FileHeader.SizeOfOptionalHeader);\r
         for (Index = 0; Index < PeHdr->FileHeader.NumberOfSections; Index++, SectionHeader++) {\r
           if (SectionHeader->VirtualAddress == Optional64->DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_EXCEPTION].VirtualAddress) {\r
@@ -2112,6 +2244,11 @@ Returns:
     Error (NULL, 0, 3000, "Invalid", "Magic 0x%x of PeImage %s is unknown.", PeHdr->OptionalHeader.Magic, mInImageName);\r
     goto Finish;\r
   }\r
+  \r
+  if (!KeepExceptionTableFlag) {\r
+    SectionHeader = (EFI_IMAGE_SECTION_HEADER *)(FileBuffer + DosHdr->e_lfanew + sizeof(UINT32) + sizeof (EFI_IMAGE_FILE_HEADER) + PeHdr->FileHeader.SizeOfOptionalHeader);\r
+    ZeroXdataSection(mInImageName, FileBuffer, SectionHeader, PeHdr->FileHeader.NumberOfSections);\r
+  }\r
 \r
   if (OutImageType == FW_TE_IMAGE) {\r
     if ((PeHdr->FileHeader.NumberOfSections &~0xFF) || (Type &~0xFF)) {\r