예제 #1
0
        private void ReadMod0(byte[] dcmpTextData, SegmentMap map)
        {
            var f    = new LeImageReader(dcmpTextData);
            var mod0 = f.ReadStruct <Mod0>();

            if (!map.TryFindSegment(mod0.DynamicOffset, out var dynseg))
            {
                return;
            }

            var offset = mod0.DynamicOffset - dynseg.MemoryArea.BaseAddress.ToLinear();

            offset += mod0.MagicOffset;
            var rdr    = dynseg.MemoryArea.CreateLeReader((int)offset);
            var elfHdr = new Elf32_EHdr {
                e_machine = (ushort)ElfMachine.EM_ARM
            };
            var elfLoader = new ElfLoader32(Services, elfHdr, 0, EndianServices.Little, RawImage);

            var(deps, entries) = elfLoader.LoadDynamicSegment(rdr);

            var dynEntries = entries.ToDictionary(e => e.Tag, e => e.UValue);
            var syms       = LoadSymbols(map, dynEntries);

            LoadRelocations(map, dynEntries, syms);
        }