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