// internal for testing internal static byte[] SerializeCustomDebugMetadata(ArrayBuilder <BlobWriter> recordWriters) { if (recordWriters.Count == 0) { return(null); } BlobWriter cmw = BlobWriter.GetInstance(); cmw.WriteByte(CDI.CdiVersion); cmw.WriteByte((byte)recordWriters.Count); // count cmw.Align(4); foreach (BlobWriter recordWriter in recordWriters) { recordWriter.WriteTo(cmw); } var result = cmw.ToArray(); cmw.Free(); return(result); }
private void WriteDebugTable(Stream peStream, ContentId nativePdbContentId, MetadataSizes metadataSizes) { if (!EmitPdb) { return; } var writer = new BlobWriter(); // characteristics: writer.WriteUint(0); // PDB stamp writer.WriteBytes(nativePdbContentId.Stamp); // version writer.WriteUint(0); // type: const int ImageDebugTypeCodeView = 2; writer.WriteUint(ImageDebugTypeCodeView); // size of data: writer.WriteUint((uint)ComputeSizeOfDebugDirectoryData()); uint dataOffset = (uint)ComputeOffsetToDebugTable(metadataSizes) + ImageDebugDirectoryBaseSize; // PointerToRawData (RVA of the data): writer.WriteUint(_textSection.RelativeVirtualAddress + dataOffset); // AddressOfRawData (position of the data in the PE stream): writer.WriteUint(_textSection.PointerToRawData + dataOffset); writer.WriteByte((byte)'R'); writer.WriteByte((byte)'S'); writer.WriteByte((byte)'D'); writer.WriteByte((byte)'S'); // PDB id: writer.WriteBytes(nativePdbContentId.Guid); // age writer.WriteUint(PdbWriter.Age); // UTF-8 encoded zero-terminated path to PDB writer.WriteUTF8(_pdbPathOpt); writer.WriteByte(0); writer.WriteTo(peStream); writer.Free(); }