public override SegmentMap LoadImageBytes(IPlatform platform, byte[] rawImage, Address addrPreferred) { var segMap = AllocateMemoryAreas( Segments .Where(p => IsLoadable(p.p_pmemsz, p.p_type)) .OrderBy(p => p.p_vaddr) .Select(p => ( platform.MakeAddressFromLinear(p.p_vaddr, false), (uint)p.p_pmemsz))); foreach (var ph in Segments) { ElfImageLoader.trace.Inform("ph: addr {0:X8} filesize {0:X8} memsize {0:X8}", ph.p_vaddr, ph.p_filesz, ph.p_pmemsz); if (!IsLoadable(ph.p_pmemsz, ph.p_type)) { continue; } var vaddr = platform.MakeAddressFromLinear(ph.p_vaddr, false); segMap.TryGetLowerBound(vaddr, out var mem); if (ph.p_filesz > 0) { Array.Copy( rawImage, (long)ph.p_offset, mem.Bytes, vaddr - mem.BaseAddress, (long)ph.p_filesz); } } var segmentMap = new SegmentMap(addrPreferred); if (Sections.Count > 0) { foreach (var section in Sections) { if (section.Name == null || section.Address == null) { continue; } if (segMap.TryGetLowerBound(section.Address, out var mem) && mem.IsValidAddress(section.Address)) { AccessMode mode = AccessModeOf(section.Flags); var seg = segmentMap.AddSegment(new ImageSegment( section.Name, section.Address, mem, mode) { Size = (uint)section.Size }); seg.Designer = CreateRenderer64(section); } else { //$TODO: warn } } } else { // There are stripped ELF binaries with 0 sections. If we have one // create a pseudo-section from the segMap. foreach (var segment in segMap) { var imgSegment = new ImageSegment( segment.Value.BaseAddress.GenerateName("seg", ""), segment.Value, AccessMode.ReadExecute) //$TODO: writeable segments. { Size = (uint)segment.Value.Length, }; segmentMap.AddSegment(imgSegment); } } segmentMap.DumpSections(); return(segmentMap); }