public Program ParseLoadCommands(mach_header_64 hdr, Address addrLoad) { var imageMap = new SegmentMap(addrLoad); Debug.Print("Parsing {0} load commands.", hdr.ncmds); for (uint i = 0; i < hdr.ncmds; ++i) { var pos = rdr.Offset; if (!rdr.TryReadUInt32(out uint cmd) || !rdr.TryReadUInt32(out uint cmdsize)) { throw new BadImageFormatException(string.Format( "Unable to read Mach-O command ({0:X}).", rdr.Offset)); } Debug.Print("{0,2}: Read MachO load command 0x{1:X} {2} of size {3}.", i, cmd, (Command)cmd, cmdsize); switch ((Command)(cmd & ~(uint)LC_REQ_DYLD)) { case LC_SEGMENT: ParseSegmentCommand32(imageMap); break; case LC_SEGMENT_64: ParseSegmentCommand64(imageMap); break; case LC_SYMTAB: ParseSymtabCommand(specific.Architecture); break; case LC_DYSYMTAB: ParseDysymtabCommand(); break; case LC_FUNCTION_STARTS: ParseFunctionStarts(rdr.Clone()); break; case LC_UNIXTHREAD: ParseUnixThread(hdr.cputype); break; case LC_VERSION_MIN_MACOSX: platformName = "macOsX"; break; } rdr.Offset = pos + cmdsize; } ldr.program.Architecture = specific.Architecture; ldr.program.SegmentMap = imageMap; if (!string.IsNullOrEmpty(platformName)) { var env = cfgSvc.GetEnvironment(platformName); ldr.program.Platform = env.Load(ldr.Services, specific.Architecture); } else { ldr.program.Platform = new DefaultPlatform(ldr.Services, specific.Architecture); } return(ldr.program); }
public override IEnumerable <RtlInstructionCluster> CreateRewriter(EndianImageReader rdr, ProcessorState state, IStorageBinder binder, IRewriterHost host) { return(new Rewriter(this, rdr.Clone(), state, binder, host)); }