internal ElfProgramHeader(Reader reader, bool is64bit, ulong headerPositon, long loadBias, bool isVirtual = false) { if (is64bit) { var header = reader.Read <ElfProgramHeader64>(headerPositon); _attributes = (ElfProgramHeaderAttributes)header.Flags; Type = header.Type; VirtualAddress = header.VirtualAddress; VirtualSize = header.VirtualSize; FileOffset = header.FileOffset; FileSize = header.FileSize; } else { var header = reader.Read <ElfProgramHeader32>(headerPositon); _attributes = (ElfProgramHeaderAttributes)header.Flags; Type = header.Type; VirtualAddress = header.VirtualAddress; VirtualSize = header.VirtualSize; FileOffset = header.FileOffset; FileSize = header.FileSize; } if (isVirtual) { ulong offset = (loadBias < 0) ? (ulong)((long)VirtualAddress + loadBias) : VirtualAddress + (ulong)loadBias; AddressSpace = new RelativeAddressSpace(reader.DataSource, "ProgramHeader", offset, VirtualSize); } else { ulong offset = (loadBias < 0) ? (ulong)((long)FileOffset + loadBias) : FileOffset + (ulong)loadBias; AddressSpace = new RelativeAddressSpace(reader.DataSource, "ProgramHeader", offset, FileSize); } }
public ElfProgramHeader(Reader reader, bool is64bit, long headerPositon, long fileOffset, bool isVirtual = false) { if (is64bit) { var header = reader.Read <ElfProgramHeader64>(headerPositon); _attributes = (ElfProgramHeaderAttributes)header.Flags; Type = header.Type; VirtualAddress = unchecked ((long)header.VirtualAddress); VirtualSize = unchecked ((long)header.VirtualSize); FileOffset = unchecked ((long)header.FileOffset); FileSize = unchecked ((long)header.FileSize); } else { var header = reader.Read <ElfProgramHeader32>(headerPositon); _attributes = (ElfProgramHeaderAttributes)header.Flags; Type = header.Type; VirtualAddress = header.VirtualAddress; VirtualSize = header.VirtualSize; FileOffset = header.FileOffset; FileSize = header.FileSize; } if (isVirtual && Type == ElfProgramHeaderType.Load) { AddressSpace = new RelativeAddressSpace(reader.DataSource, "ProgramHeader", VirtualAddress, VirtualSize); } else { AddressSpace = new RelativeAddressSpace(reader.DataSource, "ProgramHeader", fileOffset + FileOffset, FileSize); } }