public ImageSymbol CreateImageSymbol(ElfSymbol sym, bool isExecutable) { if (!isExecutable && sym.SectionIndex > 0 && sym.SectionIndex >= Sections.Count) { return(null); } SymbolType?st = GetSymbolType(sym); if (st == null || st.Value == SymbolType.Unknown) { return(null); } // If this is a relocatable file, the symbol value is // an offset from the section's virtual address. // If this is an executable file, the symbol value is // the virtual address. var addr = isExecutable ? platform.MakeAddressFromLinear(sym.Value, true) : Sections[(int)sym.SectionIndex].Address + sym.Value; var dt = GetSymbolDataType(sym); var imgSym = ImageSymbol.Create( st.Value, this.Architecture, addr, sym.Name, dt); imgSym.ProcessorState = Architecture.CreateProcessorState(); return(imgSym); }
public override Address ComputeBaseAddress(IPlatform platform) { ulong uBaseAddr = Segments .Where(ph => ph.p_vaddr > 0 && ph.p_filesz > 0) .Min(ph => ph.p_vaddr); return(platform.MakeAddressFromLinear(uBaseAddr, true)); }
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); }
public override SegmentMap LoadImageBytes(IPlatform platform, byte[] rawImage, Address addrPreferred) { var segMap = AllocateMemoryAreas( ProgramHeaders64 .Where(p => IsLoadable(p.p_vaddr, p.p_type)) .Select(p => Tuple.Create( platform.MakeAddressFromLinear(p.p_vaddr), (uint)p.p_pmemsz))); foreach (var ph in ProgramHeaders64) { Debug.Print("ph: addr {0:X8} filesize {0:X8} memsize {0:X8}", ph.p_vaddr, ph.p_filesz, ph.p_pmemsz); if (!IsLoadable(ph.p_vaddr, ph.p_type)) continue; var vaddr = platform.MakeAddressFromLinear(ph.p_vaddr); MemoryArea mem; segMap.TryGetLowerBound(vaddr, out 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); foreach (var section in Sections) { if (section.Name == null || section.Address == null) continue; MemoryArea mem; if (segMap.TryGetLowerBound(section.Address, out mem) && section.Address < mem.EndAddress) { 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 } } segmentMap.DumpSections(); return segmentMap; }
public override Address ComputeBaseAddress(IPlatform platform) { ulong uBaseAddr = ProgramHeaders64 .Where(ph => ph.p_vaddr > 0 && ph.p_filesz > 0) .Min(ph => ph.p_vaddr); return platform.MakeAddressFromLinear(uBaseAddr); }