# frozen_string_literal: true module Sass # The {ELF} class. # # It parses ELF header to extract interpreter. # @see https://github.com/torvalds/linux/blob/HEAD/include/uapi/linux/elf.h # @see https://github.com/torvalds/linux/blob/HEAD/kernel/kexec_elf.c class ELF module PackInfo PACK_MAP = { Elf32_Ehdr: 'S<2L<5S<6', Elf64_Ehdr: 'S<2L') [PackInfo::STRUCT_MAP[type], @buffer.read(size).unpack(format)].transpose.to_h end INTERPRETER = begin proc_self_exe = '/proc/self/exe' if File.exist?(proc_self_exe) File.open(proc_self_exe, 'rb') do |file| elf = ELF.new(file) interpreter = elf.interpreter if interpreter.nil? && elf.shared_object? File.readlink(proc_self_exe) else interpreter end end end end.freeze end private_constant :ELF end