public ElfRunner(string filename) { // todo: hack up this baby to take Streams _elf = ELFReader.Load <long>(filename); var loadsegs = _elf.Segments.Where(s => s.Type == SegmentType.Load); long orig_start = loadsegs.Min(s => s.Address); orig_start &= ~(Environment.SystemPageSize - 1); long orig_end = loadsegs.Max(s => s.Address + s.Size); _base = new MemoryBlock(0, (ulong)(orig_end - orig_start)); _loadoffset = (long)_base.Start - orig_start; try { _base.Set(_base.Start, _base.Size, MemoryBlock.Protection.RW); foreach (var seg in loadsegs) { var data = seg.GetContents(); Marshal.Copy(data, 0, Z.SS(seg.Address + _loadoffset), data.Length); } RegisterSymbols(); ProcessRelocations(); _base.Set(_base.Start, _base.Size, MemoryBlock.Protection.R); foreach (var sec in _elf.Sections.Where(s => s.Flags.HasFlag(SectionFlags.Allocatable))) { if (sec.Flags.HasFlag(SectionFlags.Executable)) { _base.Set((ulong)(sec.LoadAddress + _loadoffset), (ulong)sec.Size, MemoryBlock.Protection.RX); } else if (sec.Flags.HasFlag(SectionFlags.Writable)) { _base.Set((ulong)(sec.LoadAddress + _loadoffset), (ulong)sec.Size, MemoryBlock.Protection.RW); } } //FixupGOT(); ConnectAllClibPatches(); Console.WriteLine("Loaded {0}@{1:X16}", filename, _base.Start); } catch { _base.Dispose(); throw; } }
public ElfRunner(string filename) { // todo: hack up this baby to take Streams _elf = ELFReader.Load<long>(filename); var loadsegs = _elf.Segments.Where(s => s.Type == SegmentType.Load); long orig_start = loadsegs.Min(s => s.Address); orig_start &= ~(Environment.SystemPageSize - 1); long orig_end = loadsegs.Max(s => s.Address + s.Size); _base = new MemoryBlock(UIntPtr.Zero, orig_end - orig_start); _loadoffset = (long)_base.Start - orig_start; try { _base.Set(_base.Start, _base.Size, MemoryBlock.Protection.RW); foreach (var seg in loadsegs) { var data = seg.GetContents(); Marshal.Copy(data, 0, (IntPtr)(seg.Address + _loadoffset), data.Length); } RegisterSymbols(); ProcessRelocations(); _base.Set(_base.Start, _base.Size, MemoryBlock.Protection.R); foreach (var sec in _elf.Sections.Where(s => s.Flags.HasFlag(SectionFlags.Allocatable))) { if (sec.Flags.HasFlag(SectionFlags.Executable)) _base.Set((UIntPtr)(sec.LoadAddress + _loadoffset), sec.Size, MemoryBlock.Protection.RX); else if (sec.Flags.HasFlag(SectionFlags.Writable)) _base.Set((UIntPtr)(sec.LoadAddress + _loadoffset), sec.Size, MemoryBlock.Protection.RW); } //FixupGOT(); ConnectAllClibPatches(); Console.WriteLine("Loaded {0}@{1:X16}", filename, (long)_base.Start); } catch { _base.Dispose(); throw; } }
private IntPtr AllocMem(IntPtr size) { var block = new MemoryBlock((long)size); var p = (IntPtr)(long)block.Start; _heaps[p] = block; block.Set(block.Start, block.Size, MemoryBlock.Protection.RW); Console.WriteLine("AllocMem: {0:X8}@{1:X16}", (long)size, (long)block.Start); return(p); }
private IntPtr AllocMem(IntPtr size) { var block = new MemoryBlock((long)size); var p = (IntPtr)(long)block.Start; _heaps[p] = block; block.Set(block.Start, block.Size, MemoryBlock.Protection.RW); Console.WriteLine("AllocMem: {0:X8}@{1:X16}", (long)size, (long)block.Start); return p; }