vendor/macho: update to 0.2.2-39-ge2fbedc9
This commit is contained in:
parent
2496bdf280
commit
01d642f150
2
Library/Homebrew/vendor/README.md
vendored
2
Library/Homebrew/vendor/README.md
vendored
@ -3,7 +3,7 @@ Vendored Dependencies
|
||||
|
||||
* [okjson](https://github.com/kr/okjson), version 43.
|
||||
|
||||
* [ruby-macho](https://github.com/woodruffw/ruby-macho), version 0.2.2.
|
||||
* [ruby-macho](https://github.com/Homebrew/ruby-macho), version 0.2.2-39-ge2fbedc9.
|
||||
|
||||
## Licenses:
|
||||
|
||||
|
@ -3,14 +3,36 @@ module MachO
|
||||
class MachOError < RuntimeError
|
||||
end
|
||||
|
||||
# Raised when a file is not a Mach-O.
|
||||
class NotAMachOError < MachOError
|
||||
# @param error [String] the error in question
|
||||
def initialize(error)
|
||||
super error
|
||||
end
|
||||
end
|
||||
|
||||
# Raised when a file is too short to be a valid Mach-O file.
|
||||
class TruncatedFileError < NotAMachOError
|
||||
def initialize
|
||||
super "File is too short to be a valid Mach-O"
|
||||
end
|
||||
end
|
||||
|
||||
# Raised when a file's magic bytes are not valid Mach-O magic.
|
||||
class MagicError < MachOError
|
||||
class MagicError < NotAMachOError
|
||||
# @param num [Fixnum] the unknown number
|
||||
def initialize(num)
|
||||
super "Unrecognized Mach-O magic: 0x#{"%02x" % num}"
|
||||
end
|
||||
end
|
||||
|
||||
# Raised when a file is a Java classfile instead of a fat Mach-O.
|
||||
class JavaClassFileError < NotAMachOError
|
||||
def initialize
|
||||
super "File is a Java class file"
|
||||
end
|
||||
end
|
||||
|
||||
# Raised when a fat binary is loaded with MachOFile.
|
||||
class FatBinaryError < MachOError
|
||||
def initialize
|
||||
@ -82,4 +104,12 @@ module MachO
|
||||
super "No such runtime path: #{path}"
|
||||
end
|
||||
end
|
||||
|
||||
# Raised whenever unfinished code is called.
|
||||
class UnimplementedError < MachOError
|
||||
# @param thing [String] the thing that is unimplemented
|
||||
def initialize(thing)
|
||||
super "Unimplemented: #{thing}"
|
||||
end
|
||||
end
|
||||
end
|
||||
|
60
Library/Homebrew/vendor/macho/macho/fat_file.rb
vendored
60
Library/Homebrew/vendor/macho/macho/fat_file.rb
vendored
@ -13,6 +13,16 @@ module MachO
|
||||
# @return [Array<MachO::MachOFile>] an array of Mach-O binaries
|
||||
attr_reader :machos
|
||||
|
||||
# Creates a new FatFile instance from a binary string.
|
||||
# @param bin [String] a binary string containing raw Mach-O data
|
||||
# @return [MachO::FatFile] a new FatFile
|
||||
def self.new_from_bin(bin)
|
||||
instance = allocate
|
||||
instance.initialize_from_bin(bin)
|
||||
|
||||
instance
|
||||
end
|
||||
|
||||
# Creates a new FatFile from the given filename.
|
||||
# @param filename [String] the fat file to load from
|
||||
# @raise [ArgumentError] if the given filename does not exist
|
||||
@ -26,6 +36,15 @@ module MachO
|
||||
@machos = get_machos
|
||||
end
|
||||
|
||||
# @api private
|
||||
def initialize_from_bin(bin)
|
||||
@filename = nil
|
||||
@raw_data = bin
|
||||
@header = get_fat_header
|
||||
@fat_archs = get_fat_archs
|
||||
@machos = get_machos
|
||||
end
|
||||
|
||||
# The file's raw fat data.
|
||||
# @return [String] the raw fat data
|
||||
def serialize
|
||||
@ -131,8 +150,10 @@ module MachO
|
||||
# All shared libraries linked to the file's Mach-Os.
|
||||
# @return [Array<String>] an array of all shared libraries
|
||||
def linked_dylibs
|
||||
# can machos inside fat binaries have different dylibs?
|
||||
machos.flat_map(&:linked_dylibs).uniq
|
||||
# Individual architectures in a fat binary can link to different subsets
|
||||
# of libraries, but at this point we want to have the full picture, i.e.
|
||||
# the union of all libraries used by all architectures.
|
||||
machos.map(&:linked_dylibs).flatten.uniq
|
||||
end
|
||||
|
||||
# Changes all dependent shared library install names from `old_name` to `new_name`.
|
||||
@ -168,25 +189,45 @@ module MachO
|
||||
end
|
||||
|
||||
# Write all (fat) data to the file used to initialize the instance.
|
||||
# @return [void]
|
||||
# @raise [MachO::MachOError] if the instance was initialized without a file
|
||||
# @note Overwrites all data in the file!
|
||||
def write!
|
||||
File.open(@filename, "wb") { |f| f.write(@raw_data) }
|
||||
if filename.nil?
|
||||
raise MachOError.new("cannot write to a default file when initialized from a binary string")
|
||||
else
|
||||
File.open(@filename, "wb") { |f| f.write(@raw_data) }
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
# Obtain the fat header from raw file data.
|
||||
# @return [MachO::FatHeader] the fat header
|
||||
# @raise [MachO::TruncatedFileError] if the file is too small to have a valid header
|
||||
# @raise [MachO::MagicError] if the magic is not valid Mach-O magic
|
||||
# @raise [MachO::MachOBinaryError] if the magic is for a non-fat Mach-O file
|
||||
# @raise [MachO::JavaClassFileError] if the file is a Java classfile
|
||||
# @private
|
||||
def get_fat_header
|
||||
magic, nfat_arch = @raw_data[0..7].unpack("N2")
|
||||
# the smallest fat Mach-O header is 8 bytes
|
||||
raise TruncatedFileError.new if @raw_data.size < 8
|
||||
|
||||
raise MagicError.new(magic) unless MachO.magic?(magic)
|
||||
raise MachOBinaryError.new unless MachO.fat_magic?(magic)
|
||||
fh = FatHeader.new_from_bin(@raw_data[0, FatHeader.bytesize])
|
||||
|
||||
FatHeader.new(magic, nfat_arch)
|
||||
raise MagicError.new(fh.magic) unless MachO.magic?(fh.magic)
|
||||
raise MachOBinaryError.new unless MachO.fat_magic?(fh.magic)
|
||||
|
||||
# Rationale: Java classfiles have the same magic as big-endian fat
|
||||
# Mach-Os. Classfiles encode their version at the same offset as
|
||||
# `nfat_arch` and the lowest version number is 43, so we error out
|
||||
# if a file claims to have over 30 internal architectures. It's
|
||||
# technically possible for a fat Mach-O to have over 30 architectures,
|
||||
# but this is extremely unlikely and in practice distinguishes the two
|
||||
# formats.
|
||||
raise JavaClassFileError.new if fh.nfat_arch > 30
|
||||
|
||||
fh
|
||||
end
|
||||
|
||||
# Obtain an array of fat architectures from raw file data.
|
||||
@ -195,9 +236,10 @@ module MachO
|
||||
def get_fat_archs
|
||||
archs = []
|
||||
|
||||
fa_off = FatHeader.bytesize
|
||||
fa_len = FatArch.bytesize
|
||||
header.nfat_arch.times do |i|
|
||||
fields = @raw_data[8 + (FatArch.bytesize * i), FatArch.bytesize].unpack("N5")
|
||||
archs << FatArch.new(*fields)
|
||||
archs << FatArch.new_from_bin(@raw_data[fa_off + (fa_len * i), fa_len])
|
||||
end
|
||||
|
||||
archs
|
||||
|
16
Library/Homebrew/vendor/macho/macho/headers.rb
vendored
16
Library/Homebrew/vendor/macho/macho/headers.rb
vendored
@ -33,14 +33,11 @@ module MachO
|
||||
# any CPU (unused?)
|
||||
CPU_TYPE_ANY = -1
|
||||
|
||||
# x86 compatible CPUs
|
||||
CPU_TYPE_X86 = 0x07
|
||||
|
||||
# i386 and later compatible CPUs
|
||||
CPU_TYPE_I386 = CPU_TYPE_X86
|
||||
CPU_TYPE_I386 = 0x07
|
||||
|
||||
# x86_64 (AMD64) compatible CPUs
|
||||
CPU_TYPE_X86_64 = (CPU_TYPE_X86 | CPU_ARCH_ABI64)
|
||||
CPU_TYPE_X86_64 = (CPU_TYPE_I386 | CPU_ARCH_ABI64)
|
||||
|
||||
# PowerPC compatible CPUs (7400 series?)
|
||||
CPU_TYPE_POWERPC = 0x12
|
||||
@ -51,7 +48,6 @@ module MachO
|
||||
# association of cpu types to string representations
|
||||
CPU_TYPES = {
|
||||
CPU_TYPE_ANY => "CPU_TYPE_ANY",
|
||||
CPU_TYPE_X86 => "CPU_TYPE_X86",
|
||||
CPU_TYPE_I386 => "CPU_TYPE_I386",
|
||||
CPU_TYPE_X86_64 => "CPU_TYPE_X86_64",
|
||||
CPU_TYPE_POWERPC => "CPU_TYPE_POWERPC",
|
||||
@ -166,7 +162,7 @@ module MachO
|
||||
# @return [Fixnum] the number of fat architecture structures following the header
|
||||
attr_reader :nfat_arch
|
||||
|
||||
FORMAT = "VV"
|
||||
FORMAT = "N2" # always big-endian
|
||||
SIZEOF = 8
|
||||
|
||||
# @api private
|
||||
@ -195,7 +191,7 @@ module MachO
|
||||
# @return [Fixnum] the alignment, as a power of 2
|
||||
attr_reader :align
|
||||
|
||||
FORMAT = "VVVVV"
|
||||
FORMAT = "N5" # always big-endian
|
||||
SIZEOF = 20
|
||||
|
||||
# @api private
|
||||
@ -239,7 +235,9 @@ module MachO
|
||||
flags)
|
||||
@magic = magic
|
||||
@cputype = cputype
|
||||
@cpusubtype = cpusubtype
|
||||
# For now we're not interested in additional capability bits also to be
|
||||
# found in the `cpusubtype` field. We only care about the CPU sub-type.
|
||||
@cpusubtype = cpusubtype & ~CPU_SUBTYPE_MASK
|
||||
@filetype = filetype
|
||||
@ncmds = ncmds
|
||||
@sizeofcmds = sizeofcmds
|
||||
|
@ -830,7 +830,7 @@ module MachO
|
||||
SIZEOF = 24
|
||||
|
||||
# @api private
|
||||
def initialize(raw_data, offset, cmd, cmdsize, cryptoff, cryptsize, cryptid)
|
||||
def initialize(raw_data, offset, cmd, cmdsize, cryptoff, cryptsize, cryptid, pad)
|
||||
super(raw_data, offset, cmd, cmdsize)
|
||||
@cryptoff = cryptoff
|
||||
@cryptsize = cryptsize
|
||||
|
103
Library/Homebrew/vendor/macho/macho/macho_file.rb
vendored
103
Library/Homebrew/vendor/macho/macho/macho_file.rb
vendored
@ -215,7 +215,11 @@ module MachO
|
||||
# All shared libraries linked to the Mach-O.
|
||||
# @return [Array<String>] an array of all shared libraries
|
||||
def linked_dylibs
|
||||
dylib_load_commands.map(&:name).map(&:to_s)
|
||||
# Some linkers produce multiple `LC_LOAD_DYLIB` load commands for the same
|
||||
# library, but at this point we're really only interested in a list of
|
||||
# unique libraries this Mach-O file links to, thus: `uniq`. (This is also
|
||||
# for consistency with `FatFile` that merges this list across all archs.)
|
||||
dylib_load_commands.map(&:name).map(&:to_s).uniq
|
||||
end
|
||||
|
||||
# Changes the shared library `old_name` to `new_name`
|
||||
@ -293,7 +297,6 @@ module MachO
|
||||
end
|
||||
|
||||
# Write all Mach-O data to the file used to initialize the instance.
|
||||
# @raise [MachOError] if the instance was created from a binary string
|
||||
# @return [void]
|
||||
# @raise [MachO::MachOError] if the instance was initialized without a file
|
||||
# @note Overwrites all data in the file!
|
||||
@ -310,30 +313,29 @@ module MachO
|
||||
# The file's Mach-O header structure.
|
||||
# @return [MachO::MachHeader] if the Mach-O is 32-bit
|
||||
# @return [MachO::MachHeader64] if the Mach-O is 64-bit
|
||||
# @raise [MachO::TruncatedFileError] if the file is too small to have a valid header
|
||||
# @private
|
||||
def get_mach_header
|
||||
magic = get_magic
|
||||
cputype = get_cputype
|
||||
cpusubtype = get_cpusubtype
|
||||
filetype = get_filetype
|
||||
ncmds = get_ncmds
|
||||
sizeofcmds = get_sizeofcmds
|
||||
flags = get_flags
|
||||
# the smallest Mach-O header is 28 bytes
|
||||
raise TruncatedFileError.new if @raw_data.size < 28
|
||||
|
||||
if MachO.magic32?(magic)
|
||||
MachHeader.new(magic, cputype, cpusubtype, filetype, ncmds, sizeofcmds, flags)
|
||||
else
|
||||
# the reserved field is...reserved, so just fill it with 0
|
||||
MachHeader64.new(magic, cputype, cpusubtype, filetype, ncmds, sizeofcmds, flags, 0)
|
||||
end
|
||||
magic = get_and_check_magic
|
||||
mh_klass = MachO.magic32?(magic) ? MachHeader : MachHeader64
|
||||
mh = mh_klass.new_from_bin(@raw_data[0, mh_klass.bytesize])
|
||||
|
||||
check_cputype(mh.cputype)
|
||||
check_cpusubtype(mh.cpusubtype)
|
||||
check_filetype(mh.filetype)
|
||||
|
||||
mh
|
||||
end
|
||||
|
||||
# The file's magic number.
|
||||
# Read just the file's magic number and check its validity.
|
||||
# @return [Fixnum] the magic
|
||||
# @raise [MachO::MagicError] if the magic is not valid Mach-O magic
|
||||
# @raise [MachO::FatBinaryError] if the magic is for a Fat file
|
||||
# @private
|
||||
def get_magic
|
||||
def get_and_check_magic
|
||||
magic = @raw_data[0..3].unpack("N").first
|
||||
|
||||
raise MagicError.new(magic) unless MachO.magic?(magic)
|
||||
@ -342,62 +344,29 @@ module MachO
|
||||
magic
|
||||
end
|
||||
|
||||
# The file's CPU type.
|
||||
# @return [Fixnum] the CPU type
|
||||
# Check the file's CPU type.
|
||||
# @param cputype [Fixnum] the CPU type
|
||||
# @raise [MachO::CPUTypeError] if the CPU type is unknown
|
||||
# @private
|
||||
def get_cputype
|
||||
cputype = @raw_data[4..7].unpack("V").first
|
||||
|
||||
def check_cputype(cputype)
|
||||
raise CPUTypeError.new(cputype) unless CPU_TYPES.key?(cputype)
|
||||
|
||||
cputype
|
||||
end
|
||||
|
||||
# The file's CPU subtype.
|
||||
# @return [Fixnum] the CPU subtype
|
||||
# @raise [MachO::CPUSubtypeError] if the CPU subtype is unknown
|
||||
# Check the file's CPU sub-type.
|
||||
# @param cpusubtype [Fixnum] the CPU subtype
|
||||
# @raise [MachO::CPUSubtypeError] if the CPU sub-type is unknown
|
||||
# @private
|
||||
def get_cpusubtype
|
||||
cpusubtype = @raw_data[8..11].unpack("V").first
|
||||
cpusubtype &= ~CPU_SUBTYPE_LIB64 # this mask isn't documented!
|
||||
|
||||
def check_cpusubtype(cpusubtype)
|
||||
# Only check sub-type w/o capability bits (see `get_mach_header`).
|
||||
raise CPUSubtypeError.new(cpusubtype) unless CPU_SUBTYPES.key?(cpusubtype)
|
||||
|
||||
cpusubtype
|
||||
end
|
||||
|
||||
# The file's type.
|
||||
# @return [Fixnum] the file type
|
||||
# Check the file's type.
|
||||
# @param filetype [Fixnum] the file type
|
||||
# @raise [MachO::FiletypeError] if the file type is unknown
|
||||
# @private
|
||||
def get_filetype
|
||||
filetype = @raw_data[12..15].unpack("V").first
|
||||
|
||||
def check_filetype(filetype)
|
||||
raise FiletypeError.new(filetype) unless MH_FILETYPES.key?(filetype)
|
||||
|
||||
filetype
|
||||
end
|
||||
|
||||
# The number of load commands in the file.
|
||||
# @return [Fixnum] the number of load commands
|
||||
# @private
|
||||
def get_ncmds
|
||||
@raw_data[16..19].unpack("V").first
|
||||
end
|
||||
|
||||
# The size of all load commands, in bytes.
|
||||
# return [Fixnum] the size of all load commands
|
||||
# @private
|
||||
def get_sizeofcmds
|
||||
@raw_data[20..23].unpack("V").first
|
||||
end
|
||||
|
||||
# The Mach-O header's flags.
|
||||
# @return [Fixnum] the flags
|
||||
# @private
|
||||
def get_flags
|
||||
@raw_data[24..27].unpack("V").first
|
||||
end
|
||||
|
||||
# All load commands in the file.
|
||||
@ -484,17 +453,17 @@ module MachO
|
||||
new_size = cmd.class.bytesize + new_str.size
|
||||
new_sizeofcmds += new_size - cmd.cmdsize
|
||||
|
||||
low_fileoff = 2**64 # ULLONGMAX
|
||||
low_fileoff = @raw_data.size
|
||||
|
||||
# calculate the low file offset (offset to first section data)
|
||||
segments.each do |seg|
|
||||
sections(seg).each do |sect|
|
||||
if sect.size != 0 && !sect.flag?(:S_ZEROFILL) &&
|
||||
!sect.flag?(:S_THREAD_LOCAL_ZEROFILL) &&
|
||||
sect.offset < low_fileoff
|
||||
next if sect.size == 0
|
||||
next if sect.flag?(:S_ZEROFILL)
|
||||
next if sect.flag?(:S_THREAD_LOCAL_ZEROFILL)
|
||||
next unless sect.offset < low_fileoff
|
||||
|
||||
low_fileoff = sect.offset
|
||||
end
|
||||
low_fileoff = sect.offset
|
||||
end
|
||||
end
|
||||
|
||||
|
6
Library/Homebrew/vendor/macho/macho/tools.rb
vendored
6
Library/Homebrew/vendor/macho/macho/tools.rb
vendored
@ -41,7 +41,7 @@ module MachO
|
||||
# @return [void]
|
||||
# @todo unstub
|
||||
def self.change_rpath(filename, old_path, new_path)
|
||||
raise "stub"
|
||||
raise UnimplementedError.new("changing rpaths in a Mach-O")
|
||||
end
|
||||
|
||||
# Add a runtime path to a Mach-O or Fat binary, overwriting the source file.
|
||||
@ -50,7 +50,7 @@ module MachO
|
||||
# @return [void]
|
||||
# @todo unstub
|
||||
def self.add_rpath(filename, new_path)
|
||||
raise "stub"
|
||||
raise UnimplementedError.new("adding rpaths to a Mach-O")
|
||||
end
|
||||
|
||||
# Delete a runtime path from a Mach-O or Fat binary, overwriting the source file.
|
||||
@ -59,7 +59,7 @@ module MachO
|
||||
# @return [void]
|
||||
# @todo unstub
|
||||
def self.delete_rpath(filename, old_path)
|
||||
raise "stub"
|
||||
raise UnimplementedError.new("removing rpaths from a Mach-O")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
Loading…
x
Reference in New Issue
Block a user