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 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