private void LoadSymbolsFromDynamicSegment(ElfSegment dynSeg, ElfDynamicEntry symtab, ElfDynamicEntry syment, ulong offStrtab, ulong offSymtab) { // Sadly, the ELF format has no way to locate the end of the symbols in a DT_DYNAMIC segment. // We guess instead... var addrEnd = Loader.GuessAreaEnd(symtab.UValue, dynSeg); if (addrEnd != 0) { // We have found some symbols to ensure. ElfImageLoader.trace.Verbose("== Symbols in the DT_DYNAMIC segment"); int i = 0; for (ulong uSymAddr = symtab.UValue; uSymAddr < addrEnd; uSymAddr += syment.UValue) { var elfSym = Loader.EnsureSymbol(offSymtab, i, syment.UValue, offStrtab); ++i; ElfImageLoader.trace.Verbose(" {0:X8} {1}", elfSym.Value, elfSym.Name); var imgSym = Loader.CreateImageSymbol(elfSym, true); if (imgSym == null || imgSym.Address.ToLinear() == 0) { continue; } imageSymbols[imgSym.Address] = imgSym; } } }
protected override void DumpDynamicSegment(ElfSegment dynSeg) { var renderer = new DynamicSectionRenderer64(Loader, null, ElfMachine.EM_NONE); var sw = new StringWriter(); renderer.Render(dynSeg.p_offset, new TextFormatter(sw)); Debug.WriteLine(sw.ToString()); }
private void WriteProgramHeader64(ElfWriter writer, ref ElfSegment segment) { var hdr = new ElfNative.Elf64_Phdr(); writer.Encode(out hdr.p_type, segment.Type.Value); writer.Encode(out hdr.p_offset, segment.Offset); writer.Encode(out hdr.p_vaddr, segment.VirtualAddress); writer.Encode(out hdr.p_paddr, segment.PhysicalAddress); writer.Encode(out hdr.p_filesz, segment.Size); writer.Encode(out hdr.p_memsz, segment.SizeInMemory); writer.Encode(out hdr.p_flags, segment.Flags.Value); writer.Encode(out hdr.p_align, segment.Alignment); writer.Write(hdr); }
protected abstract void DumpDynamicSegment(ElfSegment dynSeg);
protected override void DumpDynamicSegment(ElfSegment dynSeg) { throw new NotImplementedException(); }