コード例 #1
0
        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();
            }
        }
コード例 #2
0
        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);
        }
コード例 #3
0
ファイル: HunkFileParser.cs プロジェクト: gitter-badger/reko
        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();
            }
        }
コード例 #4
0
ファイル: HunkShow.cs プロジェクト: relaxar/reko
 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));
             }
         }
     }
 }
コード例 #5
0
ファイル: HunkFileParser.cs プロジェクト: gitter-badger/reko
 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;
 }