class Sass::ELF
@see github.com/torvalds/linux/blob/HEAD/kernel/kexec_elf.c<br>@see github.com/torvalds/linux/blob/HEAD/include/uapi/linux/elf.h<br>It parses ELF header to extract interpreter.
The {ELF} class.
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