modified tools/rbuild/backend/mingw/modulehandler.cpp

DWARF debugging information confuses rsym, and DWARF-2 information from internal libraries (like libgcc) results in huge executables that don't even run on Windows. Therefore, before the rsym phase, strip all DWARF-2 sections
   This is a HACK for gcc builds compiled with DWARF-2 symbols (e.g. 4.3.2-tdm-1). The real solution (to be implemented soon) is to parse DWARF-2 line numbers in rsym
   Amendment to r37851: use objcopy instead of strip because strip gets us more than we bargained for, and strips all debug information too

modified   tools/rsym.c
   Don't overrun a heap block when there are discarded relocations

svn path=/trunk/; revision=37861
This commit is contained in:
KJK::Hyperion 2008-12-04 21:13:43 +00:00
parent 599818849a
commit 31b83f59b6
2 changed files with 13 additions and 3 deletions

View file

@ -1428,6 +1428,9 @@ MingwModuleHandler::GenerateRunRsymCode () const
"ifneq ($(ROS_GENERATE_RSYM),no)\n" );
fprintf ( fMakefile,
"\t$(ECHO_RSYM)\n" );
// FIXME! workaround until rsym can extract line numbers from DWARF
fprintf ( fMakefile,
"\t$(Q)${objcopy} -R .debug_abbrev -R .debug_aranges -R .debug_frame -R .debug_info -R .debug_line -R .debug_pubnames -R .debug_macinfo -R .debug_str -R .debug_loc -R .debug_pubtypes -R .debug_ranges -R .debug_static_func -R .debug_static_vars -R .debug_types -R .debug_weaknames $@\n\n" );
fprintf ( fMakefile,
"\t$(Q)$(RSYM_TARGET) $@ $@\n\n" );
fprintf ( fMakefile,

View file

@ -697,19 +697,23 @@ CreateOutputFile(FILE *OutFile, void *InData,
Length = StartOfRawData;
for (Section = 0; Section < OutFileHeader->NumberOfSections; Section++)
{
DWORD SizeOfRawData;
if (OutRelocSection == OutSectionHeaders + Section)
{
Data = (void *) ProcessedRelocs;
SizeOfRawData = ProcessedRelocsLength;
}
else if (RosSymLength > 0 && Section + 1 == OutFileHeader->NumberOfSections)
{
Data = (void *) PaddedRosSym;
SizeOfRawData = OutSectionHeaders[Section].SizeOfRawData;
}
else
{
Data = (void *) ((char *) InData + OutSectionHeaders[Section].PointerToRawData);
SizeOfRawData = OutSectionHeaders[Section].SizeOfRawData;
}
for (i = 0; i < OutSectionHeaders[Section].SizeOfRawData / 2; i++)
for (i = 0; i < SizeOfRawData / 2; i++)
{
CheckSum += ((unsigned short*) Data)[i];
CheckSum = 0xffff & (CheckSum + (CheckSum >> 16));
@ -730,21 +734,24 @@ CreateOutputFile(FILE *OutFile, void *InData,
{
if (0 != OutSectionHeaders[Section].SizeOfRawData)
{
DWORD SizeOfRawData;
fseek(OutFile, OutSectionHeaders[Section].PointerToRawData, SEEK_SET);
if (OutRelocSection == OutSectionHeaders + Section)
{
Data = (void *) ProcessedRelocs;
SizeOfRawData = ProcessedRelocsLength;
}
else if (RosSymLength > 0 && Section + 1 == OutFileHeader->NumberOfSections)
{
Data = (void *) PaddedRosSym;
SizeOfRawData = OutSectionHeaders[Section].SizeOfRawData;
}
else
{
Data = (void *) ((char *) InData + OutSectionHeaders[Section].PointerToRawData);
SizeOfRawData = OutSectionHeaders[Section].SizeOfRawData;
}
if (fwrite(Data, 1, OutSectionHeaders[Section].SizeOfRawData, OutFile) !=
OutSectionHeaders[Section].SizeOfRawData)
if (fwrite(Data, 1, SizeOfRawData, OutFile) != SizeOfRawData)
{
perror("Error writing section data\n");
free(PaddedRosSym);