From 09c45da250ec6013abfcc8bb5d10ae7c9c9f38f2 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 23 Sep 2021 09:45:13 -0700 Subject: [PATCH] Big-endian fixes: PDB creation by ilasm (#59484) * Fix byte order of debug directory fields * Fix byte order of PDB stream data (PdbHeap::SetData) Co-authored-by: Ulrich Weigand --- src/coreclr/ilasm/writer.cpp | 18 ++++++++++-------- src/coreclr/md/enc/pdbheap.cpp | 18 ++++++++++++++++++ 2 files changed, 28 insertions(+), 8 deletions(-) diff --git a/src/coreclr/ilasm/writer.cpp b/src/coreclr/ilasm/writer.cpp index c7bc6d56..7b5dd8a 100644 --- a/src/coreclr/ilasm/writer.cpp +++ b/src/coreclr/ilasm/writer.cpp @@ -212,26 +212,28 @@ HRESULT Assembler::CreateDebugDirectory() param.debugDirData = NULL; // get module ID - DWORD rsds = 0x53445352; - DWORD pdbAge = 0x1; + DWORD rsds = VAL32(0x53445352); + DWORD pdbAge = VAL32(0x1); + GUID pdbGuid = *m_pPortablePdbWriter->GetGuid(); + SwapGuid(&pdbGuid); DWORD len = sizeof(rsds) + sizeof(GUID) + sizeof(pdbAge) + (DWORD)strlen(m_szPdbFileName) + 1; BYTE* dbgDirData = new BYTE[len]; DWORD offset = 0; memcpy_s(dbgDirData + offset, len, &rsds, sizeof(rsds)); // RSDS offset += sizeof(rsds); - memcpy_s(dbgDirData + offset, len, m_pPortablePdbWriter->GetGuid(), sizeof(GUID)); // PDB GUID + memcpy_s(dbgDirData + offset, len, &pdbGuid, sizeof(GUID)); // PDB GUID offset += sizeof(GUID); memcpy_s(dbgDirData + offset, len, &pdbAge, sizeof(pdbAge)); // PDB AGE offset += sizeof(pdbAge); memcpy_s(dbgDirData + offset, len, m_szPdbFileName, strlen(m_szPdbFileName) + 1); // PDB PATH debugDirIDD.Characteristics = 0; - debugDirIDD.TimeDateStamp = m_pPortablePdbWriter->GetTimestamp(); - debugDirIDD.MajorVersion = 0x100; - debugDirIDD.MinorVersion = 0x504d; - debugDirIDD.Type = IMAGE_DEBUG_TYPE_CODEVIEW; - debugDirIDD.SizeOfData = len; + debugDirIDD.TimeDateStamp = VAL32(m_pPortablePdbWriter->GetTimestamp()); + debugDirIDD.MajorVersion = VAL16(0x100); + debugDirIDD.MinorVersion = VAL16(0x504d); + debugDirIDD.Type = VAL32(IMAGE_DEBUG_TYPE_CODEVIEW); + debugDirIDD.SizeOfData = VAL32(len); debugDirIDD.AddressOfRawData = 0; // will be updated bellow debugDirIDD.PointerToRawData = 0; // will be updated bellow diff --git a/src/coreclr/md/enc/pdbheap.cpp b/src/coreclr/md/enc/pdbheap.cpp index 962472a..a95cf4c 100644 --- a/src/coreclr/md/enc/pdbheap.cpp +++ b/src/coreclr/md/enc/pdbheap.cpp @@ -26,6 +26,16 @@ HRESULT PdbHeap::SetData(PORT_PDB_STREAM* data) (sizeof(ULONG) * data->typeSystemTableRowsSize); m_data = new BYTE[m_size]; +#if BIGENDIAN + PORT_PDB_STREAM swappedData = *data; + SwapGuid(&swappedData.id.pdbGuid); + swappedData.id.pdbTimeStamp = VAL32(swappedData.id.pdbTimeStamp); + swappedData.entryPoint = VAL32(swappedData.entryPoint); + swappedData.referencedTypeSystemTables = VAL64(swappedData.referencedTypeSystemTables); + // typeSystemTableRows and typeSystemTableRowsSize handled below + data = &swappedData; +#endif + ULONG offset = 0; if (memcpy_s(m_data + offset, m_size, &data->id, sizeof(data->id))) return E_FAIL; @@ -39,9 +49,17 @@ HRESULT PdbHeap::SetData(PORT_PDB_STREAM* data) return E_FAIL; offset += sizeof(data->referencedTypeSystemTables); +#if !BIGENDIAN if (memcpy_s(m_data + offset, m_size, data->typeSystemTableRows, sizeof(ULONG) * data->typeSystemTableRowsSize)) return E_FAIL; offset += sizeof(ULONG) * data->typeSystemTableRowsSize; +#else + for (int i = 0; i < data->typeSystemTableRowsSize; i++) + { + SET_UNALIGNED_VAL32(m_data + offset, data->typeSystemTableRows[i]); + offset += sizeof(ULONG); + } +#endif _ASSERTE(offset == m_size); -- 2.7.4