- Create always the output file. If no debug section exist, do not create a rossym section.

svn path=/trunk/; revision=15436
This commit is contained in:
Hartmut Birr 2005-05-20 18:15:44 +00:00
parent 67c71ced7c
commit 750d4fd13f

View 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,6 +639,8 @@ CreateOutputFile(FILE *OutFile, void *InData,
OutOptHeader->FileAlignment);
}
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;
@ -652,7 +666,11 @@ CreateOutputFile(FILE *OutFile, void *InData,
}
memcpy(PaddedRosSym, RosSymSection, RosSymLength);
memset((char *) PaddedRosSym + RosSymLength, '\0', RosSymFileLength - RosSymLength);
}
else
{
PaddedRosSym = NULL;
}
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,
}
}
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))
{
@ -839,8 +853,11 @@ int main(int argc, char* argv[])
if (ConvertCoffs(&CoffSymbolsCount, &CoffSymbols, &StringsLength, StringBase,
CoffsLength, CoffBase, CoffStringsLength, CoffStringBase,
ImageBase, PEFileHeader, PESectionHeaders))
{
if (StabSymbols)
{
free(StabSymbols);
}
free(StringBase);
free(FileData);
exit(1);
@ -849,17 +866,35 @@ int main(int argc, char* argv[])
if (MergeStabsAndCoffs(&MergedSymbolsCount, &MergedSymbols,
StabSymbolsCount, StabSymbols,
CoffSymbolsCount, CoffSymbols))
{
if (CoffSymbols)
{
free(CoffSymbols);
}
if (StabSymbols)
{
free(StabSymbols);
}
free(StringBase);
free(FileData);
exit(1);
}
if (CoffSymbols)
{
free(CoffSymbols);
}
if (StabSymbols)
{
free(StabSymbols);
}
if (MergedSymbolsCount == 0)
{
RosSymLength = 0;
RosSymSection = NULL;
}
else
{
RosSymLength = sizeof(SYMBOLFILE_HEADER) + MergedSymbolsCount * sizeof(ROSSYM_ENTRY)
+ StringsLength;
RosSymSection = malloc(RosSymLength);
@ -885,8 +920,8 @@ int main(int argc, char* argv[])
SymbolFileHeader->StringsLength);
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);
if (RosSymSection)
{
free(RosSymSection);
}
free(FileData);
exit(1);
}
fclose(out);
if (RosSymSection)
{
free(RosSymSection);
}
free(FileData);
return 0;