class Sass::ELF

def core?

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

def dump(io)

def dump(io)
  e_ident = @ehdr[:e_ident]
  raise ArgumentError unless e_ident.slice(EI_MAG0, SELFMAG).pack('C*') == ELFMAG
  ehdr = @ehdr.dup
  ehdr[:e_ident] = e_ident.pack('C*')
  phdrs = @phdrs
  shdrs = @shdrs
  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
  elf_ehdr.pack(io, ehdr, little_endian)
  io.seek(ehdr[:e_phoff], IO::SEEK_SET) if ehdr[:e_phnum].positive?
  phdrs.each do |phdr|
    elf_phdr.pack(io, phdr, little_endian)
  end
  io.seek(ehdr[:e_shoff], IO::SEEK_SET) if ehdr[:e_shnum].positive?
  shdrs.each do |shdr|
    elf_shdr.pack(io, shdr, little_endian)
  end
  io.flush
end

def executable?

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

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

def interpreter

def interpreter
  phdr = @phdrs.find { |p| p[:p_type] == PT_INTERP }
  return if phdr.nil?
  @io.seek(phdr[:p_offset], IO::SEEK_SET)
  @io.read(phdr[:p_filesz]).unpack1('Z*')
end

def relocatable?

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

def shared_object?

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