41 lines
1.5 KiB
Ruby
41 lines
1.5 KiB
Ruby
require "#{File.dirname(__FILE__)}/macho/structure"
|
|
require "#{File.dirname(__FILE__)}/macho/view"
|
|
require "#{File.dirname(__FILE__)}/macho/headers"
|
|
require "#{File.dirname(__FILE__)}/macho/load_commands"
|
|
require "#{File.dirname(__FILE__)}/macho/sections"
|
|
require "#{File.dirname(__FILE__)}/macho/macho_file"
|
|
require "#{File.dirname(__FILE__)}/macho/fat_file"
|
|
require "#{File.dirname(__FILE__)}/macho/exceptions"
|
|
require "#{File.dirname(__FILE__)}/macho/utils"
|
|
require "#{File.dirname(__FILE__)}/macho/tools"
|
|
|
|
# The primary namespace for ruby-macho.
|
|
module MachO
|
|
# release version
|
|
VERSION = "1.2.0".freeze
|
|
|
|
# Opens the given filename as a MachOFile or FatFile, depending on its magic.
|
|
# @param filename [String] the file being opened
|
|
# @return [MachOFile] if the file is a Mach-O
|
|
# @return [FatFile] if the file is a Fat file
|
|
# @raise [ArgumentError] if the given file does not exist
|
|
# @raise [TruncatedFileError] if the file is too small to have a valid header
|
|
# @raise [MagicError] if the file's magic is not valid Mach-O magic
|
|
def self.open(filename)
|
|
raise ArgumentError, "#{filename}: no such file" unless File.file?(filename)
|
|
raise TruncatedFileError unless File.stat(filename).size >= 4
|
|
|
|
magic = File.open(filename, "rb") { |f| f.read(4) }.unpack("N").first
|
|
|
|
if Utils.fat_magic?(magic)
|
|
file = FatFile.new(filename)
|
|
elsif Utils.magic?(magic)
|
|
file = MachOFile.new(filename)
|
|
else
|
|
raise MagicError, magic
|
|
end
|
|
|
|
file
|
|
end
|
|
end
|