class Sass::ELF

def core?

def core?
  @ehdr[:e_type] == ET_CORE
end

def executable?

def executable?
  @ehdr[:e_type] == ET_EXEC
end

def initialize(buffer)

def initialize(buffer)
  @buffer = buffer
  @ehdr = { e_ident: @buffer.read(EI_NIDENT).unpack('C*') }
  raise ArgumentError unless @ehdr[:e_ident].slice(EI_MAG0, SELFMAG).pack('C*') == ELFMAG
  case @ehdr[:e_ident][EI_CLASS]
  when ELFCLASS32
    elf_ehdr = :Elf32_Ehdr
    elf_phdr = :Elf32_Phdr
  when ELFCLASS64
    elf_ehdr = :Elf64_Ehdr
    elf_phdr = :Elf64_Phdr
  else
    raise EncodingError
  end
  case @ehdr[:e_ident][EI_DATA]
  when ELFDATA2LSB
    little_endian = true
  when ELFDATA2MSB
    little_endian = false
  else
    raise EncodingError
  end
  @ehdr.merge!(read(elf_ehdr, little_endian))
  @buffer.seek(@ehdr[:e_phoff], IO::SEEK_SET)
  @proghdrs = Array.new(@ehdr[:e_phnum]) do
    read(elf_phdr, little_endian)
  end
end

def interpreter

def interpreter
  phdr = @proghdrs.find { |p| p[:p_type] == PT_INTERP }
  return if phdr.nil?
  @buffer.seek(phdr[:p_offset], IO::SEEK_SET)
  interpreter = @buffer.read(phdr[:p_filesz])
  raise EncodingError unless interpreter.end_with?("\0")
  interpreter.chomp!("\0")
end

def read(type, little_endian)

def read(type, little_endian)
  size = PackInfo::SIZE_MAP[type]
  format = little_endian ? PackInfo::PACK_MAP[type] : PackInfo::PACK_MAP[type].tr('<', '>')
  [PackInfo::STRUCT_MAP[type], @buffer.read(size).unpack(format)].transpose.to_h
end

def relocatable?

def relocatable?
  @ehdr[:e_type] == ET_REL
end

def shared_object?

def shared_object?
  @ehdr[:e_type] == ET_DYN
end