Author: tkreuzer Date: Fri May 1 03:26:02 2009 New Revision: 40757
URL: http://svn.reactos.org/svn/reactos?rev=40757&view=rev Log: merge 37282 from amd64-branch: Give rsym it's own directory (Timo Kreuzer)
Added: trunk/reactos/tools/rsym/ (props changed) - copied from r37282, branches/ros-amd64-bringup/reactos/tools/rsym/ Removed: trunk/reactos/tools/rsym.c trunk/reactos/tools/rsym.h trunk/reactos/tools/rsym.mak trunk/reactos/tools/rsym_common.c Modified: trunk/reactos/tools/rsym/rsym.c trunk/reactos/tools/tools.mak
Propchange: trunk/reactos/tools/rsym/ ------------------------------------------------------------------------------ --- bugtraq:logregex (added) +++ bugtraq:logregex Fri May 1 03:26:02 2009 @@ -1,0 +1,2 @@ +([Ii]ssue|[Bb]ug)s? #?(\d+)(,? ?#?(\d+))*(,? ?(and |or )?#?(\d+))? +(\d+)
Propchange: trunk/reactos/tools/rsym/ ------------------------------------------------------------------------------ bugtraq:message = See issue #%BUGID% for more details.
Propchange: trunk/reactos/tools/rsym/ ------------------------------------------------------------------------------ bugtraq:url = http://www.reactos.org/bugzilla/show_bug.cgi?id=%BUGID%
Propchange: trunk/reactos/tools/rsym/ ------------------------------------------------------------------------------ tsvn:logminsize = 10
Removed: trunk/reactos/tools/rsym.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/tools/rsym.c?rev=40756&... ============================================================================== --- trunk/reactos/tools/rsym.c [iso-8859-1] (original) +++ trunk/reactos/tools/rsym.c (removed) @@ -1,985 +1,0 @@ -/* - * Usage: rsym input-file output-file - * - * There are two sources of information: the .stab/.stabstr - * sections of the executable and the COFF symbol table. Most - * of the information is in the .stab/.stabstr sections. - * However, most of our asm files don't contain .stab directives, - * so routines implemented in assembler won't show up in the - * .stab section. They are present in the COFF symbol table. - * So, we mostly use the .stab/.stabstr sections, but we augment - * the info there with info from the COFF symbol table when - * possible. - * - * This is a tool and is compiled using the host compiler, - * i.e. on Linux gcc and not mingw-gcc (cross-compiler). - * Therefore we can't include SDK headers and we have to - * duplicate some definitions here. - * Also note that the internal functions are "old C-style", - * returning an int, where a return of 0 means success and - * non-zero is failure. - */ - -#include <stdio.h> -#include <string.h> -#include <stdlib.h> -#include <assert.h> - -#include "rsym.h" - -static int -CompareSymEntry(const PROSSYM_ENTRY SymEntry1, const PROSSYM_ENTRY SymEntry2) -{ - if (SymEntry1->Address < SymEntry2->Address) - { - return -1; - } - - if (SymEntry2->Address < SymEntry1->Address) - { - return +1; - } - - return 0; -} - -static int -GetStabInfo(void *FileData, PIMAGE_FILE_HEADER PEFileHeader, - PIMAGE_SECTION_HEADER PESectionHeaders, - ULONG *StabSymbolsLength, void **StabSymbolsBase, - ULONG *StabStringsLength, void **StabStringsBase) -{ - ULONG Idx; - - /* Load .stab and .stabstr sections if available */ - *StabSymbolsBase = NULL; - *StabSymbolsLength = 0; - *StabStringsBase = NULL; - *StabStringsLength = 0; - - for (Idx = 0; Idx < PEFileHeader->NumberOfSections; Idx++) - { - /* printf("section: '%.08s'\n", PESectionHeaders[Idx].Name); */ - if ((strncmp((char*)PESectionHeaders[Idx].Name, ".stab", 5) == 0) - && (PESectionHeaders[Idx].Name[5] == 0)) - { - /* printf(".stab section found. Size %d\n", - PESectionHeaders[Idx].SizeOfRawData); */ - - *StabSymbolsLength = PESectionHeaders[Idx].SizeOfRawData; - *StabSymbolsBase = (void *)((char *) FileData + PESectionHeaders[Idx].PointerToRawData); - } - - if (strncmp((char*)PESectionHeaders[Idx].Name, ".stabstr", 8) == 0) - { - /* printf(".stabstr section found. Size %d\n", - PESectionHeaders[Idx].SizeOfRawData); */ - - *StabStringsLength = PESectionHeaders[Idx].SizeOfRawData; - *StabStringsBase = (void *)((char *) FileData + PESectionHeaders[Idx].PointerToRawData); - } - } - - return 0; -} - -static int -GetCoffInfo(void *FileData, PIMAGE_FILE_HEADER PEFileHeader, - PIMAGE_SECTION_HEADER PESectionHeaders, - ULONG *CoffSymbolsLength, void **CoffSymbolsBase, - ULONG *CoffStringsLength, void **CoffStringsBase) -{ - - if (0 == PEFileHeader->PointerToSymbolTable || 0 == PEFileHeader->NumberOfSymbols) - { - /* No COFF symbol table */ - *CoffSymbolsLength = 0; - *CoffStringsLength = 0; - } - else - { - *CoffSymbolsLength = PEFileHeader->NumberOfSymbols * sizeof(COFF_SYMENT); - *CoffSymbolsBase = (void *)((char *) FileData + PEFileHeader->PointerToSymbolTable); - *CoffStringsLength = *((ULONG *) ((char *) *CoffSymbolsBase + *CoffSymbolsLength)); - *CoffStringsBase = (void *)((char *) *CoffSymbolsBase + *CoffSymbolsLength); - } - - return 0; -} - -static ULONG -FindOrAddString(char *StringToFind, ULONG *StringsLength, void *StringsBase) -{ - char *Search, *End; - - Search = (char *) StringsBase; - End = Search + *StringsLength; - - while (Search < End) - { - if (0 == strcmp(Search, StringToFind)) - { - return Search - (char *) StringsBase; - } - Search += strlen(Search) + 1; - } - - strcpy(Search, StringToFind); - *StringsLength += strlen(StringToFind) + 1; - - return Search - (char *) StringsBase; -} - -static int -ConvertStabs(ULONG *SymbolsCount, PROSSYM_ENTRY *SymbolsBase, - ULONG *StringsLength, void *StringsBase, - ULONG StabSymbolsLength, void *StabSymbolsBase, - ULONG StabStringsLength, void *StabStringsBase, - ULONG_PTR ImageBase, PIMAGE_FILE_HEADER PEFileHeader, - PIMAGE_SECTION_HEADER PESectionHeaders) -{ - PSTAB_ENTRY StabEntry; - ULONG Count, i; - ULONG_PTR Address, LastFunctionAddress; - int First = 1; - char *Name; - ULONG NameLen; - char FuncName[256]; - PROSSYM_ENTRY Current; - - 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; - } - Current = *SymbolsBase; - memset ( Current, 0, sizeof(*Current) ); - - LastFunctionAddress = 0; - for (i = 0; i < Count; i++) - { - if ( 0 == LastFunctionAddress ) - { - Address = StabEntry[i].n_value - ImageBase; - } - else - { - Address = LastFunctionAddress + StabEntry[i].n_value; - } - switch (StabEntry[i].n_type) - { - case N_SO: - case N_SOL: - case N_BINCL: - Name = (char *) StabStringsBase + StabEntry[i].n_strx; - if (StabStringsLength < StabEntry[i].n_strx - ||'\0' == *Name || '/' == Name[strlen(Name) - 1] - || '\' == Name[strlen(Name) - 1] - || StabEntry[i].n_value < ImageBase) - { - continue; - } - if ( First || Address != Current->Address ) - { - if ( !First ) - { - memset ( ++Current, 0, sizeof(*Current) ); - Current->FunctionOffset = Current[-1].FunctionOffset; - } - else - First = 0; - Current->Address = Address; - } - Current->FileOffset = FindOrAddString((char *)StabStringsBase - + StabEntry[i].n_strx, - StringsLength, - StringsBase); - break; - case N_FUN: - if (0 == StabEntry[i].n_desc || StabEntry[i].n_value < ImageBase) - { - LastFunctionAddress = 0; /* line # 0 = end of function */ - continue; - } - if ( First || Address != Current->Address ) - { - if ( !First ) - memset ( ++Current, 0, sizeof(*Current) ); - else - First = 0; - Current->Address = Address; - Current->FileOffset = Current[-1].FileOffset; - } - Name = (char *) StabStringsBase + StabEntry[i].n_strx; - NameLen = strcspn(Name, ":"); - if (sizeof(FuncName) <= NameLen) - { - free(*SymbolsBase); - fprintf(stderr, "Function name too long\n"); - return 1; - } - memcpy(FuncName, Name, NameLen); - FuncName[NameLen] = '\0'; - Current->FunctionOffset = FindOrAddString(FuncName, - StringsLength, - StringsBase); - Current->SourceLine = 0; - LastFunctionAddress = Address; - break; - case N_SLINE: - if ( First || Address != Current->Address ) - { - if ( !First ) - { - memset ( ++Current, 0, sizeof(*Current) ); - Current->FileOffset = Current[-1].FileOffset; - Current->FunctionOffset = Current[-1].FunctionOffset; - } - else - First = 0; - Current->Address = Address; - } - Current->SourceLine = StabEntry[i].n_desc; - break; - default: - continue; - } - } - *SymbolsCount = (Current - *SymbolsBase + 1); - - qsort(*SymbolsBase, *SymbolsCount, sizeof(ROSSYM_ENTRY), (int (*)(const void *, const void *)) CompareSymEntry); - - return 0; -} - -static int -ConvertCoffs(ULONG *SymbolsCount, PROSSYM_ENTRY *SymbolsBase, - ULONG *StringsLength, void *StringsBase, - ULONG CoffSymbolsLength, void *CoffSymbolsBase, - ULONG CoffStringsLength, void *CoffStringsBase, - ULONG_PTR ImageBase, PIMAGE_FILE_HEADER PEFileHeader, - PIMAGE_SECTION_HEADER PESectionHeaders) -{ - ULONG Count, i; - PCOFF_SYMENT CoffEntry; - char FuncName[256]; - char *p; - PROSSYM_ENTRY Current; - - CoffEntry = (PCOFF_SYMENT) CoffSymbolsBase; - Count = CoffSymbolsLength / sizeof(COFF_SYMENT); - *SymbolsBase = malloc(Count * sizeof(ROSSYM_ENTRY)); - if (NULL == *SymbolsBase) - { - fprintf(stderr, "Unable to allocate memory for converted COFF symbols\n"); - return 1; - } - *SymbolsCount = 0; - Current = *SymbolsBase; - - for (i = 0; i < Count; i++) - { - if (ISFCN(CoffEntry[i].e_type) || C_EXT == CoffEntry[i].e_sclass) - { - Current->Address = CoffEntry[i].e_value; - if (0 < CoffEntry[i].e_scnum) - { - if (PEFileHeader->NumberOfSections < CoffEntry[i].e_scnum) - { - free(*SymbolsBase); - fprintf(stderr, "Invalid section number %d in COFF symbols (only %d sections present)\n", - CoffEntry[i].e_scnum, PEFileHeader->NumberOfSections); - return 1; - } - Current->Address += PESectionHeaders[CoffEntry[i].e_scnum - 1].VirtualAddress; - } - Current->FileOffset = 0; - if (0 == CoffEntry[i].e.e.e_zeroes) - { - if (sizeof(FuncName) <= strlen((char *) CoffStringsBase + CoffEntry[i].e.e.e_offset)) - { - free(*SymbolsBase); - fprintf(stderr, "Function name too long\n"); - return 1; - } - strcpy(FuncName, (char *) CoffStringsBase + CoffEntry[i].e.e.e_offset); - } - else - { - memcpy(FuncName, CoffEntry[i].e.e_name, E_SYMNMLEN); - FuncName[E_SYMNMLEN] = '\0'; - } - - /* Name demangling: stdcall */ - p = strrchr(FuncName, '@'); - if (NULL != p) - { - *p = '\0'; - } - p = ('_' == FuncName[0] || '@' == FuncName[0] ? FuncName + 1 : FuncName); - Current->FunctionOffset = FindOrAddString(p, - StringsLength, - StringsBase); - Current->SourceLine = 0; - memset ( ++Current, 0, sizeof(*Current) ); - } - i += CoffEntry[i].e_numaux; - } - - *SymbolsCount = (Current - *SymbolsBase + 1); - qsort(*SymbolsBase, *SymbolsCount, sizeof(ROSSYM_ENTRY), (int (*)(const void *, const void *)) CompareSymEntry); - - return 0; -} - -static int -MergeStabsAndCoffs(ULONG *MergedSymbolCount, PROSSYM_ENTRY *MergedSymbols, - ULONG StabSymbolsCount, PROSSYM_ENTRY StabSymbols, - ULONG CoffSymbolsCount, PROSSYM_ENTRY CoffSymbols) -{ - ULONG StabIndex, j; - ULONG CoffIndex; - 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; - } - - StabFunctionStartAddress = 0; - StabFunctionStringOffset = 0; - CoffIndex = 0; - for (StabIndex = 0; StabIndex < StabSymbolsCount; StabIndex++) - { - (*MergedSymbols)[*MergedSymbolCount] = StabSymbols[StabIndex]; - for (j = StabIndex + 1; - j < StabSymbolsCount && StabSymbols[j].Address == StabSymbols[StabIndex].Address; - j++) - { - if (0 != StabSymbols[j].FileOffset && 0 == (*MergedSymbols)[*MergedSymbolCount].FileOffset) - { - (*MergedSymbols)[*MergedSymbolCount].FileOffset = StabSymbols[j].FileOffset; - } - if (0 != StabSymbols[j].FunctionOffset && 0 == (*MergedSymbols)[*MergedSymbolCount].FunctionOffset) - { - (*MergedSymbols)[*MergedSymbolCount].FunctionOffset = StabSymbols[j].FunctionOffset; - } - if (0 != StabSymbols[j].SourceLine && 0 == (*MergedSymbols)[*MergedSymbolCount].SourceLine) - { - (*MergedSymbols)[*MergedSymbolCount].SourceLine = StabSymbols[j].SourceLine; - } - } - StabIndex = j - 1; - while (CoffIndex < CoffSymbolsCount - && CoffSymbols[CoffIndex + 1].Address <= (*MergedSymbols)[*MergedSymbolCount].Address) - { - CoffIndex++; - } - NewStabFunctionStringOffset = (*MergedSymbols)[*MergedSymbolCount].FunctionOffset; - if (CoffSymbolsCount > 0 && - CoffSymbols[CoffIndex].Address < (*MergedSymbols)[*MergedSymbolCount].Address - && StabFunctionStartAddress < CoffSymbols[CoffIndex].Address - && 0 != CoffSymbols[CoffIndex].FunctionOffset) - { - (*MergedSymbols)[*MergedSymbolCount].FunctionOffset = CoffSymbols[CoffIndex].FunctionOffset; - } - if (StabFunctionStringOffset != NewStabFunctionStringOffset) - { - StabFunctionStartAddress = (*MergedSymbols)[*MergedSymbolCount].Address; - } - StabFunctionStringOffset = NewStabFunctionStringOffset; - (*MergedSymbolCount)++; - } - - return 0; -} - -static PIMAGE_SECTION_HEADER -FindSectionForRVA(DWORD RVA, unsigned NumberOfSections, PIMAGE_SECTION_HEADER SectionHeaders) -{ - unsigned Section; - - for (Section = 0; Section < NumberOfSections; Section++) - { - if (SectionHeaders[Section].VirtualAddress <= RVA && - RVA < SectionHeaders[Section].VirtualAddress + SectionHeaders[Section].Misc.VirtualSize) - { - return SectionHeaders + Section; - } - } - - return NULL; -} - -static int -IncludeRelocationsForSection(PIMAGE_SECTION_HEADER SectionHeader) -{ - static char *BlacklistedSections[] = - { - ".edata", - ".idata", - ".reloc" - }; - char SectionName[IMAGE_SIZEOF_SHORT_NAME]; - unsigned i; - - if (0 != (SectionHeader->Characteristics & IMAGE_SCN_LNK_REMOVE)) - { - return 0; - } - - for (i = 0; i < sizeof(BlacklistedSections) / sizeof(BlacklistedSections[0]); i++) - { - strncpy(SectionName, BlacklistedSections[i], IMAGE_SIZEOF_SHORT_NAME); - if (0 == memcmp(SectionName, SectionHeader->Name, IMAGE_SIZEOF_SHORT_NAME)) - { - return 0; - } - } - - return 1; -} - -static int -ProcessRelocations(ULONG *ProcessedRelocsLength, void **ProcessedRelocs, - void *RawData, PIMAGE_OPTIONAL_HEADER OptHeader, - unsigned NumberOfSections, PIMAGE_SECTION_HEADER SectionHeaders) -{ - PIMAGE_SECTION_HEADER RelocSectionHeader, TargetSectionHeader; - PIMAGE_BASE_RELOCATION BaseReloc, End, AcceptedRelocs; - int Found; - - if (OptHeader->NumberOfRvaAndSizes < IMAGE_DIRECTORY_ENTRY_BASERELOC - || 0 == OptHeader->DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress) - { - /* No relocation entries */ - *ProcessedRelocsLength = 0; - *ProcessedRelocs = NULL; - return 0; - } - - RelocSectionHeader = FindSectionForRVA(OptHeader->DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress, - NumberOfSections, SectionHeaders); - if (NULL == RelocSectionHeader) - { - fprintf(stderr, "Can't find section header for relocation data\n"); - return 1; - } - - *ProcessedRelocs = malloc(RelocSectionHeader->SizeOfRawData); - if (NULL == *ProcessedRelocs) - { - fprintf(stderr, "Failed to allocate %u bytes for relocations\n", (unsigned int)RelocSectionHeader->SizeOfRawData); - return 1; - } - *ProcessedRelocsLength = 0; - - BaseReloc = (PIMAGE_BASE_RELOCATION) ((char *) RawData - + RelocSectionHeader->PointerToRawData - + (OptHeader->DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress - - RelocSectionHeader->VirtualAddress)); - End = (PIMAGE_BASE_RELOCATION) ((char *) BaseReloc - + OptHeader->DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].Size); - - while (BaseReloc < End && 0 < BaseReloc->SizeOfBlock) - { - TargetSectionHeader = FindSectionForRVA(BaseReloc->VirtualAddress, NumberOfSections, - SectionHeaders); - if (NULL != TargetSectionHeader && IncludeRelocationsForSection(TargetSectionHeader)) - { - AcceptedRelocs = *ProcessedRelocs; - Found = 0; - while (AcceptedRelocs < (PIMAGE_BASE_RELOCATION) ((char *) *ProcessedRelocs + - *ProcessedRelocsLength) - && ! Found) - { - Found = BaseReloc->SizeOfBlock == AcceptedRelocs->SizeOfBlock - && 0 == memcmp(BaseReloc, AcceptedRelocs, AcceptedRelocs->SizeOfBlock); - AcceptedRelocs= (PIMAGE_BASE_RELOCATION) ((char *) AcceptedRelocs + - AcceptedRelocs->SizeOfBlock); - } - if (! Found) - { - memcpy((char *) *ProcessedRelocs + *ProcessedRelocsLength, - BaseReloc, BaseReloc->SizeOfBlock); - *ProcessedRelocsLength += BaseReloc->SizeOfBlock; - } - } - BaseReloc = (PIMAGE_BASE_RELOCATION)((char *) BaseReloc + BaseReloc->SizeOfBlock); - } - - return 0; -} - -static int -CreateOutputFile(FILE *OutFile, void *InData, - PIMAGE_DOS_HEADER InDosHeader, PIMAGE_FILE_HEADER InFileHeader, - PIMAGE_OPTIONAL_HEADER InOptHeader, PIMAGE_SECTION_HEADER InSectionHeaders, - ULONG RosSymLength, void *RosSymSection) -{ - ULONG StartOfRawData; - unsigned Section; - void *OutHeader, *ProcessedRelocs, *PaddedRosSym, *Data; - PIMAGE_DOS_HEADER OutDosHeader; - PIMAGE_FILE_HEADER OutFileHeader; - PIMAGE_OPTIONAL_HEADER OutOptHeader; - PIMAGE_SECTION_HEADER OutSectionHeaders, CurrentSectionHeader; - DWORD CheckSum; - ULONG Length, i; - ULONG ProcessedRelocsLength; - ULONG RosSymOffset, RosSymFileLength; - int InRelocSectionIndex; - PIMAGE_SECTION_HEADER OutRelocSection; - - StartOfRawData = 0; - for (Section = 0; Section < InFileHeader->NumberOfSections; Section++) - { - if ((0 == StartOfRawData - || InSectionHeaders[Section].PointerToRawData < StartOfRawData) - && 0 != InSectionHeaders[Section].PointerToRawData - && 0 == (InSectionHeaders[Section].Characteristics & IMAGE_SCN_LNK_REMOVE)) - { - StartOfRawData = InSectionHeaders[Section].PointerToRawData; - } - } - OutHeader = malloc(StartOfRawData); - if (NULL == OutHeader) - { - fprintf(stderr, "Failed to allocate %u bytes for output file header\n", (unsigned int)StartOfRawData); - return 1; - } - memset(OutHeader, '\0', StartOfRawData); - - OutDosHeader = (PIMAGE_DOS_HEADER) OutHeader; - memcpy(OutDosHeader, InDosHeader, InDosHeader->e_lfanew + sizeof(ULONG)); - - OutFileHeader = (PIMAGE_FILE_HEADER)((char *) OutHeader + OutDosHeader->e_lfanew + sizeof(ULONG)); - memcpy(OutFileHeader, InFileHeader, sizeof(IMAGE_FILE_HEADER)); - OutFileHeader->PointerToSymbolTable = 0; - OutFileHeader->NumberOfSymbols = 0; - OutFileHeader->Characteristics &= ~(IMAGE_FILE_LINE_NUMS_STRIPPED | IMAGE_FILE_LOCAL_SYMS_STRIPPED | - IMAGE_FILE_DEBUG_STRIPPED); - - OutOptHeader = (PIMAGE_OPTIONAL_HEADER)(OutFileHeader + 1); - memcpy(OutOptHeader, InOptHeader, sizeof(IMAGE_OPTIONAL_HEADER)); - OutOptHeader->CheckSum = 0; - - OutSectionHeaders = (PIMAGE_SECTION_HEADER)((char *) OutOptHeader + OutFileHeader->SizeOfOptionalHeader); - - if (ProcessRelocations(&ProcessedRelocsLength, &ProcessedRelocs, InData, InOptHeader, - InFileHeader->NumberOfSections, InSectionHeaders)) - { - return 1; - } - if (InOptHeader->NumberOfRvaAndSizes < IMAGE_DIRECTORY_ENTRY_BASERELOC - || 0 == InOptHeader->DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress) - { - InRelocSectionIndex = -1; - } - else - { - InRelocSectionIndex = FindSectionForRVA(InOptHeader->DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress, - InFileHeader->NumberOfSections, InSectionHeaders) - InSectionHeaders; - } - - OutFileHeader->NumberOfSections = 0; - CurrentSectionHeader = OutSectionHeaders; - OutOptHeader->SizeOfImage = 0; - RosSymOffset = 0; - OutRelocSection = NULL; - for (Section = 0; Section < InFileHeader->NumberOfSections; Section++) - { - if (0 == (InSectionHeaders[Section].Characteristics & IMAGE_SCN_LNK_REMOVE)) - { - *CurrentSectionHeader = InSectionHeaders[Section]; - CurrentSectionHeader->PointerToLinenumbers = 0; - CurrentSectionHeader->NumberOfLinenumbers = 0; - if (OutOptHeader->SizeOfImage < CurrentSectionHeader->VirtualAddress + - CurrentSectionHeader->Misc.VirtualSize) - { - OutOptHeader->SizeOfImage = ROUND_UP(CurrentSectionHeader->VirtualAddress + - CurrentSectionHeader->Misc.VirtualSize, - OutOptHeader->SectionAlignment); - } - if (RosSymOffset < CurrentSectionHeader->PointerToRawData + CurrentSectionHeader->SizeOfRawData) - { - RosSymOffset = CurrentSectionHeader->PointerToRawData + CurrentSectionHeader->SizeOfRawData; - } - if (Section == (ULONG)InRelocSectionIndex) - { - OutRelocSection = CurrentSectionHeader; - } - (OutFileHeader->NumberOfSections) ++; - CurrentSectionHeader++; - } - } - - if (OutRelocSection == CurrentSectionHeader - 1) - { - OutOptHeader->DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].Size = ProcessedRelocsLength; - if (OutOptHeader->SizeOfImage == OutRelocSection->VirtualAddress + - ROUND_UP(OutRelocSection->Misc.VirtualSize, - OutOptHeader->SectionAlignment)) - { - OutOptHeader->SizeOfImage = OutRelocSection->VirtualAddress + - ROUND_UP(ProcessedRelocsLength, - OutOptHeader->SectionAlignment); - } - OutRelocSection->Misc.VirtualSize = ProcessedRelocsLength; - if (RosSymOffset == OutRelocSection->PointerToRawData - + OutRelocSection->SizeOfRawData) - { - RosSymOffset = OutRelocSection->PointerToRawData + - ROUND_UP(ProcessedRelocsLength, OutOptHeader->FileAlignment); - } - OutRelocSection->SizeOfRawData = ROUND_UP(ProcessedRelocsLength, - 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; - 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)++; - - PaddedRosSym = malloc(RosSymFileLength); - if (NULL == PaddedRosSym) - { - fprintf(stderr, "Failed to allocate %u bytes for padded .rossym\n", (unsigned int)RosSymFileLength); - return 1; - } - memcpy(PaddedRosSym, RosSymSection, RosSymLength); - memset((char *) PaddedRosSym + RosSymLength, '\0', RosSymFileLength - RosSymLength); - } - else - { - PaddedRosSym = NULL; - } - CheckSum = 0; - for (i = 0; i < StartOfRawData / 2; i++) - { - CheckSum += ((unsigned short*) OutHeader)[i]; - CheckSum = 0xffff & (CheckSum + (CheckSum >> 16)); - } - 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 < SizeOfRawData / 2; i++) - { - CheckSum += ((unsigned short*) Data)[i]; - CheckSum = 0xffff & (CheckSum + (CheckSum >> 16)); - } - Length += OutSectionHeaders[Section].SizeOfRawData; - } - CheckSum += Length; - OutOptHeader->CheckSum = CheckSum; - - if (fwrite(OutHeader, 1, StartOfRawData, OutFile) != StartOfRawData) - { - perror("Error writing output header\n"); - free(OutHeader); - return 1; - } - - for (Section = 0; Section < OutFileHeader->NumberOfSections; Section++) - { - 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, SizeOfRawData, OutFile) != SizeOfRawData) - { - perror("Error writing section data\n"); - free(PaddedRosSym); - free(OutHeader); - return 1; - } - } - } - - if (PaddedRosSym) - { - free(PaddedRosSym); - } - free(OutHeader); - - return 0; -} - -int main(int argc, char* argv[]) -{ - PSYMBOLFILE_HEADER SymbolFileHeader; - PIMAGE_DOS_HEADER PEDosHeader; - PIMAGE_FILE_HEADER PEFileHeader; - PIMAGE_OPTIONAL_HEADER PEOptHeader; - PIMAGE_SECTION_HEADER PESectionHeaders; - ULONG ImageBase; - void *StabBase; - ULONG StabsLength; - void *StabStringBase; - ULONG StabStringsLength; - void *CoffBase = NULL; - ULONG CoffsLength; - void *CoffStringBase = NULL; - ULONG CoffStringsLength; - char* path1; - char* path2; - FILE* out; - void *StringBase; - ULONG StringsLength; - ULONG StabSymbolsCount; - PROSSYM_ENTRY StabSymbols; - ULONG CoffSymbolsCount; - PROSSYM_ENTRY CoffSymbols; - ULONG MergedSymbolsCount; - PROSSYM_ENTRY MergedSymbols; - size_t FileSize; - void *FileData; - ULONG RosSymLength; - void *RosSymSection; - char elfhdr[4] = { '\177', 'E', 'L', 'F' }; - - if (3 != argc) - { - fprintf(stderr, "Usage: rsym <exefile> <symfile>\n"); - exit(1); - } - - path1 = convert_path(argv[1]); - path2 = convert_path(argv[2]); - - FileData = load_file ( path1, &FileSize ); - if ( !FileData ) - { - fprintf ( stderr, "An error occured loading '%s'\n", path1 ); - exit(1); - } - - /* Check if MZ header exists */ - PEDosHeader = (PIMAGE_DOS_HEADER) FileData; - if (PEDosHeader->e_magic != IMAGE_DOS_MAGIC || PEDosHeader->e_lfanew == 0L) - { - /* Ignore elf */ - if (!memcmp(PEDosHeader, elfhdr, sizeof(elfhdr))) - exit(0); - perror("Input file is not a PE image.\n"); - free(FileData); - exit(1); - } - - /* Locate PE file header */ - /* sizeof(ULONG) = sizeof(MAGIC) */ - PEFileHeader = (PIMAGE_FILE_HEADER)((char *) FileData + PEDosHeader->e_lfanew + sizeof(ULONG)); - - /* Locate optional header */ - assert(sizeof(ULONG) == 4); - PEOptHeader = (PIMAGE_OPTIONAL_HEADER)(PEFileHeader + 1); - ImageBase = PEOptHeader->ImageBase; - - /* Locate PE section headers */ - PESectionHeaders = (PIMAGE_SECTION_HEADER)((char *) PEOptHeader + PEFileHeader->SizeOfOptionalHeader); - - if (GetStabInfo(FileData, PEFileHeader, PESectionHeaders, &StabsLength, &StabBase, - &StabStringsLength, &StabStringBase)) - { - free(FileData); - exit(1); - } - - if (GetCoffInfo(FileData, PEFileHeader, PESectionHeaders, &CoffsLength, &CoffBase, - &CoffStringsLength, &CoffStringBase)) - { - free(FileData); - exit(1); - } - - StringBase = malloc(1 + StabStringsLength + CoffStringsLength + - (CoffsLength / sizeof(ROSSYM_ENTRY)) * (E_SYMNMLEN + 1)); - if (NULL == StringBase) - { - free(FileData); - fprintf(stderr, "Failed to allocate memory for strings table\n"); - exit(1); - } - /* Make offset 0 into an empty string */ - *((char *) StringBase) = '\0'; - StringsLength = 1; - - if (ConvertStabs(&StabSymbolsCount, &StabSymbols, &StringsLength, StringBase, - StabsLength, StabBase, StabStringsLength, StabStringBase, - ImageBase, PEFileHeader, PESectionHeaders)) - { - free(StringBase); - free(FileData); - fprintf(stderr, "Failed to allocate memory for strings table\n"); - exit(1); - } - - if (ConvertCoffs(&CoffSymbolsCount, &CoffSymbols, &StringsLength, StringBase, - CoffsLength, CoffBase, CoffStringsLength, CoffStringBase, - ImageBase, PEFileHeader, PESectionHeaders)) - { - if (StabSymbols) - { - free(StabSymbols); - } - free(StringBase); - free(FileData); - exit(1); - } - - 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); - 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; - - memcpy((char *) RosSymSection + SymbolFileHeader->SymbolsOffset, MergedSymbols, - SymbolFileHeader->SymbolsLength); - memcpy((char *) RosSymSection + SymbolFileHeader->StringsOffset, StringBase, - SymbolFileHeader->StringsLength); - - free(MergedSymbols); - } - free(StringBase); - out = fopen(path2, "wb"); - if (out == NULL) - { - perror("Cannot open output file"); - free(RosSymSection); - free(FileData); - exit(1); - } - - if (CreateOutputFile(out, FileData, PEDosHeader, PEFileHeader, PEOptHeader, - PESectionHeaders, RosSymLength, RosSymSection)) - { - fclose(out); - if (RosSymSection) - { - free(RosSymSection); - } - free(FileData); - exit(1); - } - - fclose(out); - if (RosSymSection) - { - free(RosSymSection); - } - free(FileData); - - return 0; -} - -/* EOF */
Removed: trunk/reactos/tools/rsym.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/tools/rsym.h?rev=40756&... ============================================================================== --- trunk/reactos/tools/rsym.h [iso-8859-1] (original) +++ trunk/reactos/tools/rsym.h (removed) @@ -1,354 +1,0 @@ -/* rsym.h */ - -#ifndef RSYM_H -#define RSYM_H - -#define IMAGE_DOS_MAGIC 0x5a4d -#define IMAGE_PE_MAGIC 0x00004550 -#define IMAGE_SIZEOF_SHORT_NAME 8 -#define IMAGE_NT_OPTIONAL_HDR32_MAGIC 0x10b -#define IMAGE_NT_OPTIONAL_HDR64_MAGIC 0x20b - -#define IMAGE_FILE_LINE_NUMS_STRIPPED 0x0004 -#define IMAGE_FILE_LOCAL_SYMS_STRIPPED 0x0008 -#define IMAGE_FILE_DEBUG_STRIPPED 0x0200 - -#define IMAGE_DIRECTORY_ENTRY_BASERELOC 5 - -#define IMAGE_SCN_TYPE_NOLOAD 0x00000002 -#define IMAGE_SCN_LNK_REMOVE 0x00000800 -#define IMAGE_SCN_MEM_READ 0x40000000 -#define IMAGE_SCN_MEM_DISCARDABLE 0x02000000 - -#define IMAGE_NUMBEROF_DIRECTORY_ENTRIES 16 - -typedef unsigned char BYTE; -typedef unsigned char UCHAR; -typedef unsigned short WORD; -typedef unsigned short USHORT; -typedef unsigned long long ULONGLONG; -#if defined(__x86_64__) && defined(unix) -typedef signed int LONG; -typedef unsigned int ULONG; -typedef unsigned int DWORD; -#else -typedef signed long LONG; -typedef unsigned long ULONG; -typedef unsigned long DWORD; -#endif -#if defined(_WIN64) -typedef unsigned __int64 ULONG_PTR; -#else -#if defined(__x86_64__) && defined(unix) -typedef unsigned int ULONG_PTR; -#else -typedef unsigned long ULONG_PTR; -#endif -#endif - -#pragma pack(push,2) -typedef struct _IMAGE_DOS_HEADER { - WORD e_magic; - WORD e_cblp; - WORD e_cp; - WORD e_crlc; - WORD e_cparhdr; - WORD e_minalloc; - WORD e_maxalloc; - WORD e_ss; - WORD e_sp; - WORD e_csum; - WORD e_ip; - WORD e_cs; - WORD e_lfarlc; - WORD e_ovno; - WORD e_res[4]; - WORD e_oemid; - WORD e_oeminfo; - WORD e_res2[10]; - LONG e_lfanew; -} IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER; -#pragma pack(pop) - -#pragma pack(push,4) -typedef struct _IMAGE_FILE_HEADER { - WORD Machine; - WORD NumberOfSections; - DWORD TimeDateStamp; - DWORD PointerToSymbolTable; - DWORD NumberOfSymbols; - WORD SizeOfOptionalHeader; - WORD Characteristics; -} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER; -#pragma pack(pop) - -typedef struct _IMAGE_DATA_DIRECTORY { - DWORD VirtualAddress; - DWORD Size; -} IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY; - -typedef struct _IMAGE_OPTIONAL_HEADER32 { - WORD Magic; - BYTE MajorLinkerVersion; - BYTE MinorLinkerVersion; - DWORD SizeOfCode; - DWORD SizeOfInitializedData; - DWORD SizeOfUninitializedData; - DWORD AddressOfEntryPoint; - DWORD BaseOfCode; - DWORD BaseOfData; - DWORD ImageBase; - DWORD SectionAlignment; - DWORD FileAlignment; - WORD MajorOperatingSystemVersion; - WORD MinorOperatingSystemVersion; - WORD MajorImageVersion; - WORD MinorImageVersion; - WORD MajorSubsystemVersion; - WORD MinorSubsystemVersion; - DWORD Win32VersionValue; - DWORD SizeOfImage; - DWORD SizeOfHeaders; - DWORD CheckSum; - WORD Subsystem; - WORD DllCharacteristics; - DWORD SizeOfStackReserve; - DWORD SizeOfStackCommit; - DWORD SizeOfHeapReserve; - DWORD SizeOfHeapCommit; - DWORD LoaderFlags; - DWORD NumberOfRvaAndSizes; - IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES]; -} IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32; - -typedef struct _IMAGE_OPTIONAL_HEADER64 { - WORD Magic; - BYTE MajorLinkerVersion; - BYTE MinorLinkerVersion; - DWORD SizeOfCode; - DWORD SizeOfInitializedData; - DWORD SizeOfUninitializedData; - DWORD AddressOfEntryPoint; - DWORD BaseOfCode; - ULONGLONG ImageBase; - DWORD SectionAlignment; - DWORD FileAlignment; - WORD MajorOperatingSystemVersion; - WORD MinorOperatingSystemVersion; - WORD MajorImageVersion; - WORD MinorImageVersion; - WORD MajorSubsystemVersion; - WORD MinorSubsystemVersion; - DWORD Win32VersionValue; - DWORD SizeOfImage; - DWORD SizeOfHeaders; - DWORD CheckSum; - WORD Subsystem; - WORD DllCharacteristics; - ULONGLONG SizeOfStackReserve; - ULONGLONG SizeOfStackCommit; - ULONGLONG SizeOfHeapReserve; - ULONGLONG SizeOfHeapCommit; - DWORD LoaderFlags; - DWORD NumberOfRvaAndSizes; - IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES]; -} IMAGE_OPTIONAL_HEADER64, *PIMAGE_OPTIONAL_HEADER64; - -#ifdef _TARGET_PE64 -typedef IMAGE_OPTIONAL_HEADER64 IMAGE_OPTIONAL_HEADER; -typedef PIMAGE_OPTIONAL_HEADER64 PIMAGE_OPTIONAL_HEADER; -#else -typedef IMAGE_OPTIONAL_HEADER32 IMAGE_OPTIONAL_HEADER; -typedef PIMAGE_OPTIONAL_HEADER32 PIMAGE_OPTIONAL_HEADER; -#endif - -typedef struct _IMAGE_SECTION_HEADER { - BYTE Name[IMAGE_SIZEOF_SHORT_NAME]; - union { - DWORD PhysicalAddress; - DWORD VirtualSize; - } Misc; - DWORD VirtualAddress; - DWORD SizeOfRawData; - DWORD PointerToRawData; - DWORD PointerToRelocations; - DWORD PointerToLinenumbers; - WORD NumberOfRelocations; - WORD NumberOfLinenumbers; - DWORD Characteristics; -} IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER; - -#pragma pack(push,4) -typedef struct _IMAGE_BASE_RELOCATION { - DWORD VirtualAddress; - DWORD SizeOfBlock; - WORD TypeOffset[1]; -} IMAGE_BASE_RELOCATION, *PIMAGE_BASE_RELOCATION; -#pragma pack(pop) - -typedef struct { - USHORT f_magic; /* magic number */ - USHORT f_nscns; /* number of sections */ - ULONG f_timdat; /* time & date stamp */ - ULONG f_symptr; /* file pointer to symtab */ - ULONG f_nsyms; /* number of symtab entries */ - USHORT f_opthdr; /* sizeof(optional hdr) */ - USHORT f_flags; /* flags */ -} FILHDR; - -typedef struct { - char s_name[8]; /* section name */ - ULONG s_paddr; /* physical address, aliased s_nlib */ - ULONG s_vaddr; /* virtual address */ - ULONG s_size; /* section size */ - ULONG s_scnptr; /* file ptr to raw data for section */ - ULONG s_relptr; /* file ptr to relocation */ - ULONG s_lnnoptr; /* file ptr to line numbers */ - USHORT s_nreloc; /* number of relocation entries */ - USHORT s_nlnno; /* number of line number entries */ - ULONG s_flags; /* flags */ -} SCNHDR; -#pragma pack(4) - -typedef struct _SYMBOLFILE_HEADER { - ULONG SymbolsOffset; - ULONG SymbolsLength; - ULONG StringsOffset; - ULONG StringsLength; -} SYMBOLFILE_HEADER, *PSYMBOLFILE_HEADER; - -typedef struct _STAB_ENTRY { - ULONG n_strx; /* index into string table of name */ - UCHAR n_type; /* type of symbol */ - UCHAR n_other; /* misc info (usually empty) */ - USHORT n_desc; /* description field */ - ULONG n_value; /* value of symbol */ -} STAB_ENTRY, *PSTAB_ENTRY; - -/* http://www.math.utah.edu/docs/info/stabs_12.html */ - -#define N_GYSM 0x20 -#define N_FNAME 0x22 -#define N_FUN 0x24 -#define N_STSYM 0x26 -#define N_LCSYM 0x28 -#define N_MAIN 0x2A -#define N_PC 0x30 -#define N_NSYMS 0x32 -#define N_NOMAP 0x34 -#define N_RSYM 0x40 -#define N_M2C 0x42 -#define N_SLINE 0x44 -#define N_DSLINE 0x46 -#define N_BSLINE 0x48 -#define N_BROWS 0x48 -#define N_DEFD 0x4A -#define N_EHDECL 0x50 -#define N_MOD2 0x50 -#define N_CATCH 0x54 -#define N_SSYM 0x60 -#define N_SO 0x64 -#define N_LSYM 0x80 -#define N_BINCL 0x82 -#define N_SOL 0x84 -#define N_PSYM 0xA0 -#define N_EINCL 0xA2 -#define N_ENTRY 0xA4 -#define N_LBRAC 0xC0 -#define N_EXCL 0xC2 -#define N_SCOPE 0xC4 -#define N_RBRAC 0xE0 -#define N_BCOMM 0xE2 -#define N_ECOMM 0xE4 -#define N_ECOML 0xE8 -#define N_LENG 0xFE - -/* COFF symbol table */ - -#define E_SYMNMLEN 8 /* # characters in a symbol name */ -#define E_FILNMLEN 14 /* # characters in a file name */ -#define E_DIMNUM 4 /* # array dimensions in auxiliary entry */ - -#define N_BTMASK (0xf) -#define N_TMASK (0x30) -#define N_BTSHFT (4) -#define N_TSHIFT (2) - -/* derived types, in e_type */ - -#define DT_NON (0) /* no derived type */ -#define DT_PTR (1) /* pointer */ -#define DT_FCN (2) /* function */ -#define DT_ARY (3) /* array */ - -#define BTYPE(x) ((x) & N_BTMASK) - -#define ISPTR(x) (((x) & N_TMASK) == (DT_PTR << N_BTSHFT)) -#define ISFCN(x) (((x) & N_TMASK) == (DT_FCN << N_BTSHFT)) -#define ISARY(x) (((x) & N_TMASK) == (DT_ARY << N_BTSHFT)) -#define ISTAG(x) ((x) == C_STRTAG || (x) == C_UNTAG || (x) == C_ENTAG) -#define DECREF(x) ((((x) >> N_TSHIFT) & ~N_BTMASK) | ((x) & N_BTMASK)) - -#define C_EFCN 0xff /* physical end of function */ -#define C_NULL 0 -#define C_AUTO 1 /* automatic variable */ -#define C_EXT 2 /* external symbol */ -#define C_STAT 3 /* static */ -#define C_REG 4 /* register variable */ -#define C_EXTDEF 5 /* external definition */ -#define C_LABEL 6 /* label */ -#define C_ULABEL 7 /* undefined label */ -#define C_MOS 8 /* member of structure */ -#define C_ARG 9 /* function argument */ -#define C_STRTAG 10 /* structure tag */ -#define C_MOU 11 /* member of union */ -#define C_UNTAG 12 /* union tag */ -#define C_TPDEF 13 /* type definition */ -#define C_USTATIC 14 /* undefined static */ -#define C_ENTAG 15 /* enumeration tag */ -#define C_MOE 16 /* member of enumeration */ -#define C_REGPARM 17 /* register parameter */ -#define C_FIELD 18 /* bit field */ -#define C_AUTOARG 19 /* auto argument */ -#define C_LASTENT 20 /* dummy entry (end of block) */ -#define C_BLOCK 100 /* ".bb" or ".eb" */ -#define C_FCN 101 /* ".bf" or ".ef" */ -#define C_EOS 102 /* end of structure */ -#define C_FILE 103 /* file name */ -#define C_LINE 104 /* line# reformatted as symbol table entry */ -#define C_ALIAS 105 /* duplicate tag */ -#define C_HIDDEN 106 /* ext symbol in dmert public lib */ - -#pragma pack(1) -typedef struct _COFF_SYMENT { - union { - char e_name[E_SYMNMLEN]; - struct { - ULONG e_zeroes; - ULONG e_offset; - } e; - } e; - ULONG e_value; - short e_scnum; - USHORT e_type; - UCHAR e_sclass; - UCHAR e_numaux; -} COFF_SYMENT, *PCOFF_SYMENT; -#pragma pack(4) - -typedef struct _ROSSYM_ENTRY { - ULONG_PTR Address; - ULONG FunctionOffset; - ULONG FileOffset; - ULONG SourceLine; -} ROSSYM_ENTRY, *PROSSYM_ENTRY; - -#define ROUND_UP(N, S) (((N) + (S) - 1) & ~((S) - 1)) - -extern char * -convert_path(const char *origpath); - -extern void * -load_file(const char *file_name, size_t *file_size); - -#endif /* RSYM_H */
Removed: trunk/reactos/tools/rsym.mak URL: http://svn.reactos.org/svn/reactos/trunk/reactos/tools/rsym.mak?rev=40756&am... ============================================================================== --- trunk/reactos/tools/rsym.mak [iso-8859-1] (original) +++ trunk/reactos/tools/rsym.mak (removed) @@ -1,45 +1,0 @@ -RSYM_BASE = $(TOOLS_BASE) -RSYM_BASE_ = $(RSYM_BASE)$(SEP) - -RSYM_INT = $(INTERMEDIATE_)$(RSYM_BASE) -RSYM_INT_ = $(RSYM_INT)$(SEP) -RSYM_OUT = $(OUTPUT_)$(RSYM_BASE) -RSYM_OUT_ = $(RSYM_OUT)$(SEP) - -RSYM_TARGET = \ - $(RSYM_OUT_)rsym$(EXEPOSTFIX) - -RSYM_SOURCES = \ - $(RSYM_BASE_)rsym.c \ - $(RSYM_BASE_)rsym_common.c - -RSYM_OBJECTS = \ - $(addprefix $(INTERMEDIATE_), $(RSYM_SOURCES:.c=.o)) - -ifeq ($(ARCH),amd64) -RSYM_HOST_CFLAGS = $(TOOLS_CFLAGS) -D_TARGET_PE64 -else -RSYM_HOST_CFLAGS = $(TOOLS_CFLAGS) -endif - -RSYM_HOST_LFLAGS = $(TOOLS_LFLAGS) - -.PHONY: rsym -rsym: $(RSYM_TARGET) - -$(RSYM_TARGET): $(RSYM_OBJECTS) | $(RSYM_OUT) - $(ECHO_HOSTLD) - ${host_gcc} $(RSYM_OBJECTS) $(RSYM_HOST_LFLAGS) -o $@ - -$(RSYM_INT_)rsym.o: $(RSYM_BASE_)rsym.c | $(RSYM_INT) - $(ECHO_HOSTCC) - ${host_gcc} $(RSYM_HOST_CFLAGS) -c $< -o $@ - -$(RSYM_INT_)rsym_common.o: $(RSYM_BASE_)rsym_common.c | $(RSYM_INT) - $(ECHO_HOSTCC) - ${host_gcc} $(RSYM_HOST_CFLAGS) -c $< -o $@ - -.PHONY: rsym_clean -rsym_clean: - -@$(rm) $(RSYM_TARGET) $(RSYM_OBJECTS) 2>$(NUL) -clean: rsym_clean
Modified: trunk/reactos/tools/rsym/rsym.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/tools/rsym/rsym.c?rev=40757... ============================================================================== --- trunk/reactos/tools/rsym/rsym.c [iso-8859-1] (original) +++ trunk/reactos/tools/rsym/rsym.c [iso-8859-1] Fri May 1 03:26:02 2009 @@ -489,7 +489,7 @@ *ProcessedRelocs = malloc(RelocSectionHeader->SizeOfRawData); if (NULL == *ProcessedRelocs) { - fprintf(stderr, "Failed to allocate %lu bytes for relocations\n", RelocSectionHeader->SizeOfRawData); + fprintf(stderr, "Failed to allocate %u bytes for relocations\n", (unsigned int)RelocSectionHeader->SizeOfRawData); return 1; } *ProcessedRelocsLength = 0; @@ -565,7 +565,7 @@ OutHeader = malloc(StartOfRawData); if (NULL == OutHeader) { - fprintf(stderr, "Failed to allocate %lu bytes for output file header\n", StartOfRawData); + fprintf(stderr, "Failed to allocate %u bytes for output file header\n", (unsigned int)StartOfRawData); return 1; } memset(OutHeader, '\0', StartOfRawData); @@ -678,7 +678,7 @@ PaddedRosSym = malloc(RosSymFileLength); if (NULL == PaddedRosSym) { - fprintf(stderr, "Failed to allocate %lu bytes for padded .rossym\n", RosSymFileLength); + fprintf(stderr, "Failed to allocate %u bytes for padded .rossym\n", (unsigned int)RosSymFileLength); return 1; } memcpy(PaddedRosSym, RosSymSection, RosSymLength); @@ -697,19 +697,23 @@ 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); - } - for (i = 0; i < OutSectionHeaders[Section].SizeOfRawData / 2; i++) + SizeOfRawData = OutSectionHeaders[Section].SizeOfRawData; + } + for (i = 0; i < SizeOfRawData / 2; i++) { CheckSum += ((unsigned short*) Data)[i]; CheckSum = 0xffff & (CheckSum + (CheckSum >> 16)); @@ -730,21 +734,24 @@ { 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); - } - if (fwrite(Data, 1, OutSectionHeaders[Section].SizeOfRawData, OutFile) != - OutSectionHeaders[Section].SizeOfRawData) + SizeOfRawData = OutSectionHeaders[Section].SizeOfRawData; + } + if (fwrite(Data, 1, SizeOfRawData, OutFile) != SizeOfRawData) { perror("Error writing section data\n"); free(PaddedRosSym);
Removed: trunk/reactos/tools/rsym_common.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/tools/rsym_common.c?rev=407... ============================================================================== --- trunk/reactos/tools/rsym_common.c [iso-8859-1] (original) +++ trunk/reactos/tools/rsym_common.c (removed) @@ -1,62 +1,0 @@ -/* rsym_common.c */ - -#include <stdio.h> -#include <string.h> -#include <stdlib.h> - -#include "rsym.h" - -char* -convert_path ( const char* origpath ) -{ - char* newpath; - int i; - - newpath = strdup(origpath); - - i = 0; - while (newpath[i] != 0) - { -#ifdef UNIX_PATHS - if (newpath[i] == '\') - { - newpath[i] = '/'; - } -#else -#ifdef DOS_PATHS - if (newpath[i] == '/') - { - newpath[i] = '\'; - } -#endif -#endif - i++; - } - return(newpath); -} - -void* -load_file ( const char* file_name, size_t* file_size ) -{ - FILE* f; - void* FileData = NULL; - - f = fopen ( file_name, "rb" ); - if (f != NULL) - { - fseek(f, 0L, SEEK_END); - *file_size = ftell(f); - fseek(f, 0L, SEEK_SET); - FileData = malloc(*file_size); - if (FileData != NULL) - { - if ( *file_size != fread(FileData, 1, *file_size, f) ) - { - free(FileData); - FileData = NULL; - } - } - fclose(f); - } - return FileData; -}
Modified: trunk/reactos/tools/tools.mak URL: http://svn.reactos.org/svn/reactos/trunk/reactos/tools/tools.mak?rev=40757&a... ============================================================================== --- trunk/reactos/tools/tools.mak [iso-8859-1] (original) +++ trunk/reactos/tools/tools.mak [iso-8859-1] Fri May 1 03:26:02 2009 @@ -51,4 +51,4 @@ include tools/pefixup.mak include tools/raddr2line.mak include tools/rbuild/rbuild.mak -include tools/rsym.mak +include tools/rsym/rsym.mak