class Sass::ELF

def initialize(io, program_headers: true, section_headers: false)

def initialize(io, program_headers: true, section_headers: false)
  io.rewind
  e_ident = io.read(EI_NIDENT).unpack('C*')
  raise ArgumentError unless e_ident.slice(EI_MAG0, SELFMAG).pack('C*') == ELFMAG
  case e_ident[EI_CLASS]
  when ELFCLASS32
    elf_ehdr = Elf32_Ehdr
    elf_phdr = Elf32_Phdr
    elf_shdr = Elf32_Shdr
  when ELFCLASS64
    elf_ehdr = Elf64_Ehdr
    elf_phdr = Elf64_Phdr
    elf_shdr = Elf64_Shdr
  else
    raise EncodingError
  end
  case e_ident[EI_DATA]
  when ELFDATA2LSB
    little_endian = true
  when ELFDATA2MSB
    little_endian = false
  else
    raise EncodingError
  end
  io.rewind
  ehdr = elf_ehdr.unpack(io, little_endian)
  ehdr[:e_ident] = e_ident
  phdrs = if program_headers && ehdr[:e_phnum].positive?
            io.seek(ehdr[:e_phoff], IO::SEEK_SET)
            Array.new(ehdr[:e_phnum]) do
              elf_phdr.unpack(io, little_endian)
            end
          else
            []
          end
  shdrs = if section_headers && ehdr[:e_shnum].positive?
            io.seek(ehdr[:e_shoff], IO::SEEK_SET)
            Array.new(ehdr[:e_shnum]) do
              elf_shdr.unpack(io, little_endian)
            end
          else
            []
          end
  @io = io
  @ehdr = ehdr
  @phdrs = phdrs
  @shdrs = shdrs
end