/// <summary> /// Constructor initializes the various control structures and combines the section list. /// </summary> /// <param name="target">Target environment specifier</param> /// <param name="peHeaderBuilder">PE file header builder</param> /// <param name="getRuntimeFunctionsTable">Callback to retrieve the runtime functions table</param> public R2RPEBuilder( TargetDetails target, PEHeaderBuilder peHeaderBuilder, ISymbolNode r2rHeaderExportSymbol, string outputFileSimpleName, Func <RuntimeFunctionsTableNode> getRuntimeFunctionsTable, int customPESectionAlignment, Func <IEnumerable <Blob>, BlobContentId> deterministicIdProvider) : base(peHeaderBuilder, deterministicIdProvider: deterministicIdProvider) { _target = target; _getRuntimeFunctionsTable = getRuntimeFunctionsTable; _sectionRvaDeltas = new List <SectionRVADelta>(); _sectionBuilder = new SectionBuilder(target); _textSectionIndex = _sectionBuilder.AddSection(TextSectionName, SectionCharacteristics.ContainsCode | SectionCharacteristics.MemExecute | SectionCharacteristics.MemRead, 512); _dataSectionIndex = _sectionBuilder.AddSection(DataSectionName, SectionCharacteristics.ContainsInitializedData | SectionCharacteristics.MemWrite | SectionCharacteristics.MemRead, 512); _customPESectionAlignment = customPESectionAlignment; if (r2rHeaderExportSymbol != null) { _sectionBuilder.AddSection(R2RPEBuilder.ExportDataSectionName, SectionCharacteristics.ContainsInitializedData | SectionCharacteristics.MemRead, 512); _sectionBuilder.AddExportSymbol("RTR_HEADER", 1, r2rHeaderExportSymbol); _sectionBuilder.SetDllNameForExportDirectoryTable(outputFileSimpleName); } if (_sectionBuilder.FindSection(R2RPEBuilder.RelocSectionName) == null) { // Always inject the relocation section to the end of section list _sectionBuilder.AddSection( R2RPEBuilder.RelocSectionName, SectionCharacteristics.ContainsInitializedData | SectionCharacteristics.MemRead | SectionCharacteristics.MemDiscardable, PEHeaderConstants.SectionAlignment); } ImmutableArray <Section> .Builder sectionListBuilder = ImmutableArray.CreateBuilder <Section>(); foreach (SectionInfo sectionInfo in _sectionBuilder.GetSections()) { ILCompiler.PEWriter.Section builderSection = _sectionBuilder.FindSection(sectionInfo.SectionName); Debug.Assert(builderSection != null); sectionListBuilder.Add(new Section(builderSection.Name, builderSection.Characteristics)); } _sections = sectionListBuilder.ToImmutableArray(); _sectionRVAs = new int[_sections.Length]; _sectionPointerToRawData = new int[_sections.Length]; _sectionRawSizes = new int[_sections.Length]; }