public override void FromStream(Stream stream)
{
base.FromStream(stream);
long endOffset = (stream.Position + Header.Size + 1) & ~0x1;
ElfHeader = NativeUtils.StreamToStructure<Elf32_Ehdr>(stream);
if ((ElfHeader.e_ident[0] != Constants.ELFMAG0) ||
(ElfHeader.e_ident[1] != Constants.ELFMAG1) ||
(ElfHeader.e_ident[2] != Constants.ELFMAG2) ||
(ElfHeader.e_ident[3] != Constants.ELFMAG3))
{
throw new InvalidDataException("not an elf file");
}
ELFCLASS fileClass = (ELFCLASS)ElfHeader.e_ident[(int)EIDENT.EI_CLASS];
ELFDATA dataClass = (ELFDATA)ElfHeader.e_ident[(int)EIDENT.EI_DATA];
ELFVERSION version = (ELFVERSION)ElfHeader.e_ident[(int)EIDENT.EI_VERSION];
ELFOSABI osAbi = (ELFOSABI)ElfHeader.e_ident[(int)EIDENT.EI_OSABI];
byte abiVersion = ElfHeader.e_ident[(int)EIDENT.EI_ABIVERSION];
if ((fileClass == ELFCLASS.ELFCLASSNONE) || (dataClass == ELFDATA.ELFDATANONE) || (version == ELFVERSION.EV_NONE))
{
throw new InvalidDataException("not an elf file");
}
// is big endian
if (dataClass == ELFDATA.ELFDATA2MSB)
{
ElfHeader.SwapEndian();
}
stream.Seek(endOffset, SeekOrigin.Begin);
}