public void ParseRelocShort(Action <Hunk> h) { var hunk = new RelocHunk(); h(hunk); var num_relocs = 1; var reloc = new Dictionary <int, List <uint> >(); hunk.reloc = reloc; var total_words = 0; while (num_relocs != 0) { num_relocs = this.read_word(f); if (num_relocs < 0) { throw new BadImageFormatException(string.Format("{0} has invalid number of relocations.", hunk.HunkType)); } else if (num_relocs == 0) { // last relocation found ++total_words; break; } // build reloc map var hunkNo = this.read_word(f); if (hunkNo < 0) { throw new BadImageFormatException(string.Format("{0} has invalid hunk num.", hunk.HunkType)); } var offsets = new List <uint>(); var count = num_relocs & 0xFFFF; total_words += count + 2; for (var a = 0; a < count; ++a) { var offset = f.ReadBeInt16(); if (offset < 0) { throw new BadImageFormatException(string.Format( "{0} has invalid relocation #{1} offset {2} (num_relocs={3} hunkNo={4}, offset={5}).", hunk.HunkType, a, offset, num_relocs, hunkNo, f.Offset)); } offsets.Add((uint)offset); } reloc[hunkNo] = offsets; // padding } if ((total_words & 1) == 1) { f.ReadBeInt16(); } }
public RelocHunk ParseReloc(Action <Hunk> fn) { var hunk = new RelocHunk(); fn(hunk); var num_relocs = 1; var reloc = new Dictionary <int, List <uint> >(); hunk.reloc = reloc; while (num_relocs != 0) { num_relocs = this.read_long(); if (num_relocs < 0) { throw new BadImageFormatException(string.Format("{0} has invalid number of relocations.", hunk.HunkType)); } else if (num_relocs == 0) { // last relocation found break; } // build reloc map var hunkNo = this.read_long(); if (hunkNo < 0) { throw new BadImageFormatException(string.Format("{0} has invalid hunk num.", hunk.HunkType)); } Debug.WriteLineIf(trace.TraceVerbose, string.Format(" hunk: {0}, relocs: {1}", hunkNo, num_relocs)); var offsets = new List <uint>(); num_relocs &= 0xFFFF; for (var a = 0; a < num_relocs; ++a) { var offset = this.read_long(); if (offset < 0) { throw new BadImageFormatException( string.Format( "{0} has invalid relocation #{1} offset {2} (num_relocs={3} hunkNo={4}, offset={5})", hunk.HunkType, a, offset, num_relocs, hunkNo, f.Offset)); } offsets.Add((uint)offset); } reloc[hunkNo] = offsets; } return(hunk); }
public void ParseRelocShort(Action<Hunk> h) { var hunk = new RelocHunk(); h(hunk); var num_relocs = 1; var reloc = new Dictionary<int, List<uint>>(); hunk.reloc = reloc; var total_words = 0; while (num_relocs != 0) { num_relocs = this.read_word(f); if (num_relocs < 0) throw new BadImageFormatException(string.Format("{0} has invalid number of relocations.", hunk.HunkType)); else if (num_relocs == 0) { // last relocation found ++total_words; break; } // build reloc map var hunkNo = this.read_word(f); if (hunkNo < 0) throw new BadImageFormatException(string.Format("{0} has invalid hunk num.", hunk.HunkType)); var offsets = new List<uint>(); var count = num_relocs & 0xFFFF; total_words += count + 2; for (var a = 0; a < count; ++a) { var offset = f.ReadBeInt16(); if (offset < 0) throw new BadImageFormatException(string.Format( "{0} has invalid relocation #{1} offset {2} (num_relocs={3} hunkNo={4}, offset={5}).", hunk.HunkType, a, offset, num_relocs, hunkNo, f.Offset)); offsets.Add((uint) offset); } reloc[hunkNo] = offsets; // padding } if ((total_words & 1) == 1) { f.ReadBeInt16(); } }
public virtual void show_reloc_hunk(RelocHunk hunk) { var reloc = hunk.reloc; foreach (var hunk_num in reloc.Keys) { var offsets = reloc[hunk_num]; if (this.show_relocs) { foreach (var offset in offsets) { this.print_symbol(offset, string.Format("Segment #{0}", hunk_num), ""); } } else { this.print_extra_sub(String.Format("To Segment #{0}: {1,4} entries", hunk_num, offsets.Count)); foreach (var off in offsets) { this.print_extra_sub(string.Format("\t{0:X8}", off)); } } } }
public RelocHunk ParseReloc(Action<Hunk> fn) { var hunk = new RelocHunk(); fn(hunk); var num_relocs = 1; var reloc = new Dictionary<int, List<uint>>(); hunk.reloc = reloc; while (num_relocs != 0) { num_relocs = this.read_long(); if (num_relocs < 0) throw new BadImageFormatException(string.Format("{0} has invalid number of relocations.", hunk.HunkType)); else if (num_relocs == 0) { // last relocation found break; } // build reloc map var hunkNo = this.read_long(); if (hunkNo < 0) throw new BadImageFormatException(string.Format("{0} has invalid hunk num.", hunk.HunkType)); Debug.WriteLineIf(trace.TraceVerbose, string.Format(" hunk: {0}, relocs: {1}", hunkNo, num_relocs)); var offsets = new List<uint>(); num_relocs &= 0xFFFF; for (var a = 0; a < num_relocs; ++a) { var offset = this.read_long(); if (offset < 0) throw new BadImageFormatException( string.Format( "{0} has invalid relocation #{1} offset {2} (num_relocs={3} hunkNo={4}, offset={5})", hunk.HunkType, a, offset, num_relocs, hunkNo, f.Offset)); offsets.Add((uint) offset); } reloc[hunkNo] = offsets; } return hunk; }