- Create always the output file. If no debug section exist, do not create a rossym...
authorHartmut Birr <osexpert@googlemail.com>
Fri, 20 May 2005 18:15:44 +0000 (18:15 +0000)
committerHartmut Birr <osexpert@googlemail.com>
Fri, 20 May 2005 18:15:44 +0000 (18:15 +0000)
svn path=/trunk/; revision=15436

reactos/tools/rsym.c

index 4c8e57a..9fc2c89 100644 (file)
@@ -146,13 +146,20 @@ ConvertStabs(ULONG *SymbolsCount, PROSSYM_ENTRY *SymbolsBase,
 
   StabEntry = StabSymbolsBase;
   Count = StabSymbolsLength / sizeof(STAB_ENTRY);
+  *SymbolsCount = 0;
+  if (Count == 0)
+    {
+      /* No symbol info */
+      *SymbolsBase = NULL;
+      return 0;
+    }
+
   *SymbolsBase = malloc(Count * sizeof(ROSSYM_ENTRY));
   if (NULL == *SymbolsBase)
     {
       fprintf(stderr, "Failed to allocate memory for converted .stab symbols\n");
       return 1;
     }
-  *SymbolsCount = 0;
 
   LastFunctionAddress = 0;
   First = 1;
@@ -330,13 +337,18 @@ MergeStabsAndCoffs(ULONG *MergedSymbolCount, PROSSYM_ENTRY *MergedSymbols,
   ULONG_PTR StabFunctionStartAddress;
   ULONG StabFunctionStringOffset, NewStabFunctionStringOffset;
 
+  *MergedSymbolCount = 0;
+  if (StabSymbolsCount == 0)
+    {
+      *MergedSymbols = NULL;
+      return 0;
+    }
   *MergedSymbols = malloc(StabSymbolsCount * sizeof(ROSSYM_ENTRY));
   if (NULL == *MergedSymbols)
     {
       fprintf(stderr, "Unable to allocate memory for merged symbols\n");
       return 1;
     }
-  *MergedSymbolCount = 0;
 
   StabFunctionStartAddress = 0;
   StabFunctionStringOffset = 0;
@@ -627,32 +639,38 @@ CreateOutputFile(FILE *OutFile, void *InData,
                                                 OutOptHeader->FileAlignment);
     }
 
-  RosSymFileLength = ROUND_UP(RosSymLength, OutOptHeader->FileAlignment);
-  memcpy(CurrentSectionHeader->Name, ".rossym", 8); /* We're lucky: string is exactly 8 bytes long */
-  CurrentSectionHeader->Misc.VirtualSize = RosSymLength;
-  CurrentSectionHeader->VirtualAddress = OutOptHeader->SizeOfImage;
-  CurrentSectionHeader->SizeOfRawData = RosSymFileLength;
-  CurrentSectionHeader->PointerToRawData = RosSymOffset;
-  CurrentSectionHeader->PointerToRelocations = 0;
-  CurrentSectionHeader->PointerToLinenumbers = 0;
-  CurrentSectionHeader->NumberOfRelocations = 0;
-  CurrentSectionHeader->NumberOfLinenumbers = 0;
-  CurrentSectionHeader->Characteristics = IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_DISCARDABLE
-                                          | IMAGE_SCN_LNK_REMOVE | IMAGE_SCN_TYPE_NOLOAD;
-  OutOptHeader->SizeOfImage = ROUND_UP(CurrentSectionHeader->VirtualAddress +
-                                       CurrentSectionHeader->Misc.VirtualSize,
+  if (RosSymLength > 0)
+    {
+      RosSymFileLength = ROUND_UP(RosSymLength, OutOptHeader->FileAlignment);
+      memcpy(CurrentSectionHeader->Name, ".rossym", 8); /* We're lucky: string is exactly 8 bytes long */
+      CurrentSectionHeader->Misc.VirtualSize = RosSymLength;
+      CurrentSectionHeader->VirtualAddress = OutOptHeader->SizeOfImage;
+      CurrentSectionHeader->SizeOfRawData = RosSymFileLength;
+      CurrentSectionHeader->PointerToRawData = RosSymOffset;
+      CurrentSectionHeader->PointerToRelocations = 0;
+      CurrentSectionHeader->PointerToLinenumbers = 0;
+      CurrentSectionHeader->NumberOfRelocations = 0;
+      CurrentSectionHeader->NumberOfLinenumbers = 0;
+      CurrentSectionHeader->Characteristics = IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_DISCARDABLE
+                                              | IMAGE_SCN_LNK_REMOVE | IMAGE_SCN_TYPE_NOLOAD;
+      OutOptHeader->SizeOfImage = ROUND_UP(CurrentSectionHeader->VirtualAddress +
+                                           CurrentSectionHeader->Misc.VirtualSize,
                                        OutOptHeader->SectionAlignment);
-  (OutFileHeader->NumberOfSections)++;
+      (OutFileHeader->NumberOfSections)++;
 
-  PaddedRosSym = malloc(RosSymFileLength);
-  if (NULL == PaddedRosSym)
+      PaddedRosSym = malloc(RosSymFileLength);
+      if (NULL == PaddedRosSym)
+        {
+          fprintf(stderr, "Failed to allocate %lu bytes for padded .rossym\n", RosSymFileLength);
+          return 1;
+        }
+      memcpy(PaddedRosSym, RosSymSection, RosSymLength);
+      memset((char *) PaddedRosSym + RosSymLength, '\0', RosSymFileLength - RosSymLength);
+    }
+  else
     {
-      fprintf(stderr, "Failed to allocate %lu bytes for padded .rossym\n", RosSymFileLength);
-      return 1;
+      PaddedRosSym = NULL;
     }
-  memcpy(PaddedRosSym, RosSymSection, RosSymLength);
-  memset((char *) PaddedRosSym + RosSymLength, '\0', RosSymFileLength - RosSymLength);
-
   CheckSum = 0;
   for (i = 0; i < StartOfRawData / 2; i++)
    {
@@ -666,7 +684,7 @@ CreateOutputFile(FILE *OutFile, void *InData,
         {
           Data = (void *) ProcessedRelocs;
         }
-      else if (Section + 1 == OutFileHeader->NumberOfSections)
+      else if (RosSymLength > 0 && Section + 1 == OutFileHeader->NumberOfSections)
         {
           Data = (void *) PaddedRosSym;
         }
@@ -700,7 +718,7 @@ CreateOutputFile(FILE *OutFile, void *InData,
             {
               Data = (void *) ProcessedRelocs;
             }
-          else if (Section + 1 == OutFileHeader->NumberOfSections)
+          else if (RosSymLength > 0 && Section + 1 == OutFileHeader->NumberOfSections)
             {
               Data = (void *) PaddedRosSym;
             }
@@ -719,7 +737,10 @@ CreateOutputFile(FILE *OutFile, void *InData,
         }
    }
 
-  free(PaddedRosSym);
+  if (PaddedRosSym)
+    {
+      free(PaddedRosSym);
+    }
   free(OutHeader);
 
   return 0;
@@ -800,13 +821,6 @@ int main(int argc, char* argv[])
       exit(1);
     }
 
-  if (StabsLength == 0 || StabStringsLength == 0)
-    {
-      /* no symbol info */
-      free(FileData);
-      return 0;
-    }
-
   if (GetCoffInfo(FileData, PEFileHeader, PESectionHeaders, &CoffsLength, &CoffBase,
                   &CoffStringsLength, &CoffStringBase))
     {
@@ -840,7 +854,10 @@ int main(int argc, char* argv[])
                    CoffsLength, CoffBase, CoffStringsLength, CoffStringBase,
                    ImageBase, PEFileHeader, PESectionHeaders))
     {
-      free(StabSymbols);
+      if (StabSymbols)
+        {
+          free(StabSymbols);
+        }
       free(StringBase);
       free(FileData);
       exit(1);
@@ -850,43 +867,61 @@ int main(int argc, char* argv[])
                          StabSymbolsCount, StabSymbols,
                          CoffSymbolsCount, CoffSymbols))
     {
-      free(CoffSymbols);
-      free(StabSymbols);
+      if (CoffSymbols)
+        {
+         free(CoffSymbols);
+        }
+      if (StabSymbols)
+        {
+          free(StabSymbols);
+        }
       free(StringBase);
       free(FileData);
       exit(1);
     }
 
-  free(CoffSymbols);
-  free(StabSymbols);
-
-  RosSymLength = sizeof(SYMBOLFILE_HEADER) + MergedSymbolsCount * sizeof(ROSSYM_ENTRY)
-                 + StringsLength;
-  RosSymSection = malloc(RosSymLength);
-  if (NULL == RosSymSection)
+  if (CoffSymbols)
     {
-      free(MergedSymbols);
-      free(StringBase);
-      free(FileData);
-      fprintf(stderr, "Unable to allocate memory for .rossym section\n");
-      exit(1);
+      free(CoffSymbols);
+    }
+  if (StabSymbols)
+    {
+      free(StabSymbols);
+    }
+  if (MergedSymbolsCount == 0)
+    {
+      RosSymLength = 0;
+      RosSymSection = NULL;
     }
-  memset(RosSymSection, '\0', RosSymLength);
+  else
+    {
+      RosSymLength = sizeof(SYMBOLFILE_HEADER) + MergedSymbolsCount * sizeof(ROSSYM_ENTRY)
+                            + StringsLength;
+      RosSymSection = malloc(RosSymLength);
+      if (NULL == RosSymSection)
+        {
+          free(MergedSymbols);
+          free(StringBase);
+          free(FileData);
+          fprintf(stderr, "Unable to allocate memory for .rossym section\n");
+          exit(1);
+        }
+      memset(RosSymSection, '\0', RosSymLength);
 
-  SymbolFileHeader = (PSYMBOLFILE_HEADER) RosSymSection;
-  SymbolFileHeader->SymbolsOffset = sizeof(SYMBOLFILE_HEADER);
-  SymbolFileHeader->SymbolsLength = MergedSymbolsCount * sizeof(ROSSYM_ENTRY);
-  SymbolFileHeader->StringsOffset = SymbolFileHeader->SymbolsOffset + SymbolFileHeader->SymbolsLength;
-  SymbolFileHeader->StringsLength = StringsLength;
+      SymbolFileHeader = (PSYMBOLFILE_HEADER) RosSymSection;
+      SymbolFileHeader->SymbolsOffset = sizeof(SYMBOLFILE_HEADER);
+      SymbolFileHeader->SymbolsLength = MergedSymbolsCount * sizeof(ROSSYM_ENTRY);
+      SymbolFileHeader->StringsOffset = SymbolFileHeader->SymbolsOffset + SymbolFileHeader->SymbolsLength;
+      SymbolFileHeader->StringsLength = StringsLength;
 
-  memcpy((char *) RosSymSection + SymbolFileHeader->SymbolsOffset, MergedSymbols,
-         SymbolFileHeader->SymbolsLength);
-  memcpy((char *) RosSymSection + SymbolFileHeader->StringsOffset, StringBase,
-         SymbolFileHeader->StringsLength);
+      memcpy((char *) RosSymSection + SymbolFileHeader->SymbolsOffset, MergedSymbols,
+             SymbolFileHeader->SymbolsLength);
+      memcpy((char *) RosSymSection + SymbolFileHeader->StringsOffset, StringBase,
+             SymbolFileHeader->StringsLength);
 
-  free(MergedSymbols);
+      free(MergedSymbols);
+    }
   free(StringBase);
-
   out = fopen(path2, "wb");
   if (out == NULL)
     {
@@ -900,13 +935,19 @@ int main(int argc, char* argv[])
                        PESectionHeaders, RosSymLength, RosSymSection))
     {
       fclose(out);
-      free(RosSymSection);
+      if (RosSymSection)
+        {
+          free(RosSymSection);
+        }
       free(FileData);
       exit(1);
     }
 
   fclose(out);
-  free(RosSymSection);
+  if (RosSymSection)
+    {
+      free(RosSymSection);
+    }
   free(FileData);
 
   return 0;