Don't raise in mach_data so the debugger doesn't catch it

Closes Homebrew/homebrew#33088.
This commit is contained in:
Jack Nagel 2014-10-10 19:21:46 -05:00
parent 8cc5aabfcf
commit 01397d17f7

View File

@ -53,51 +53,52 @@ module MachO
# /usr/include/mach-o/fat.h # /usr/include/mach-o/fat.h
def mach_data def mach_data
@mach_data ||= begin @mach_data ||= _mach_data
offsets = [] end
mach_data = []
header = read(8).unpack("N2") def _mach_data
case header[0] offsets = []
when 0xcafebabe # universal mach_data = []
header[1].times do |i|
# header[1] is the number of struct fat_arch in the file. header = read(8).unpack("N2")
# Each struct fat_arch is 20 bytes, and the 'offset' member case header[0]
# begins 8 bytes into the struct, with an additional 8 byte when 0xcafebabe # universal
# offset due to the struct fat_header at the beginning of header[1].times do |i|
# the file. # header[1] is the number of struct fat_arch in the file.
offsets << read(4, 20*i + 16).unpack("N")[0] # Each struct fat_arch is 20 bytes, and the 'offset' member
end # begins 8 bytes into the struct, with an additional 8 byte
when 0xcefaedfe, 0xcffaedfe, 0xfeedface, 0xfeedfacf # Single arch # offset due to the struct fat_header at the beginning of
offsets << 0 # the file.
when 0x7f454c46 # ELF offsets << read(4, 20*i + 16).unpack("N")[0]
mach_data << { :arch => :x86_64, :type => :executable }
else
raise "Not a Mach-O binary."
end end
when 0xcefaedfe, 0xcffaedfe, 0xfeedface, 0xfeedfacf # Single arch
offsets.each do |offset| offsets << 0
arch = case read(8, offset).unpack("N2") when 0x7f454c46 # ELF
when [0xcefaedfe, 0x07000000] then :i386 mach_data << { :arch => :x86_64, :type => :executable }
when [0xcffaedfe, 0x07000001] then :x86_64 else
when [0xfeedface, 0x00000012] then :ppc7400 return []
when [0xfeedfacf, 0x01000012] then :ppc64
else :dunno
end
type = case read(4, offset + 12).unpack("N")[0]
when 0x00000002, 0x02000000 then :executable
when 0x00000006, 0x06000000 then :dylib
when 0x00000008, 0x08000000 then :bundle
else :dunno
end
mach_data << { :arch => arch, :type => type }
end
mach_data
rescue
[]
end end
offsets.each do |offset|
arch = case read(8, offset).unpack("N2")
when [0xcefaedfe, 0x07000000] then :i386
when [0xcffaedfe, 0x07000001] then :x86_64
when [0xfeedface, 0x00000012] then :ppc7400
when [0xfeedfacf, 0x01000012] then :ppc64
else :dunno
end
type = case read(4, offset + 12).unpack("N")[0]
when 0x00000002, 0x02000000 then :executable
when 0x00000006, 0x06000000 then :dylib
when 0x00000008, 0x08000000 then :bundle
else :dunno
end
mach_data << { :arch => arch, :type => type }
end
mach_data
end end
def archs def archs