ruby-macho 1.0.0 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -72,7 +72,8 @@ module MachO
72
72
  # @return [String] the name of the section, including null pad bytes
73
73
  attr_reader :sectname
74
74
 
75
- # @return [String] the name of the segment's section, including null pad bytes
75
+ # @return [String] the name of the segment's section, including null
76
+ # pad bytes
76
77
  attr_reader :segname
77
78
 
78
79
  # @return [Fixnum] the memory address of the section
@@ -124,17 +125,19 @@ module MachO
124
125
  @reserved2 = reserved2
125
126
  end
126
127
 
127
- # @return [String] the section's name, with any trailing NULL characters removed
128
+ # @return [String] the section's name, with any trailing NULL characters
129
+ # removed
128
130
  def section_name
129
131
  sectname.delete("\x00")
130
132
  end
131
133
 
132
- # @return [String] the parent segment's name, with any trailing NULL characters removed
134
+ # @return [String] the parent segment's name, with any trailing NULL
135
+ # characters removed
133
136
  def segment_name
134
137
  segname.delete("\x00")
135
138
  end
136
139
 
137
- # @return [Boolean] true if the section has no contents (i.e, `size` is 0)
140
+ # @return [Boolean] whether the section is empty (i.e, {size} is 0)
138
141
  def empty?
139
142
  size.zero?
140
143
  end
@@ -142,7 +145,7 @@ module MachO
142
145
  # @example
143
146
  # puts "this section is regular" if sect.flag?(:S_REGULAR)
144
147
  # @param flag [Symbol] a section flag symbol
145
- # @return [Boolean] true if `flag` is present in the section's flag field
148
+ # @return [Boolean] whether the flag is present in the section's {flags}
146
149
  def flag?(flag)
147
150
  flag = SECTION_FLAGS[flag]
148
151
  return false if flag.nil?
@@ -19,7 +19,7 @@ module MachO
19
19
 
20
20
  # @param endianness [Symbol] either `:big` or `:little`
21
21
  # @param bin [String] the string to be unpacked into the new structure
22
- # @return [MachO::MachOStructure] a new MachOStructure initialized with `bin`
22
+ # @return [MachO::MachOStructure] the resulting structure
23
23
  # @api private
24
24
  def self.new_from_bin(endianness, bin)
25
25
  format = Utils.specialize_format(self::FORMAT, endianness)
@@ -1,5 +1,6 @@
1
1
  module MachO
2
- # A collection of convenient methods for common operations on Mach-O and Fat binaries.
2
+ # A collection of convenient methods for common operations on Mach-O and Fat
3
+ # binaries.
3
4
  module Tools
4
5
  # @param filename [String] the Mach-O or Fat binary being read
5
6
  # @return [Array<String>] an array of all dylibs linked to the binary
@@ -9,7 +10,8 @@ module MachO
9
10
  file.linked_dylibs
10
11
  end
11
12
 
12
- # Changes the dylib ID of a Mach-O or Fat binary, overwriting the source file.
13
+ # Changes the dylib ID of a Mach-O or Fat binary, overwriting the source
14
+ # file.
13
15
  # @param filename [String] the Mach-O or Fat binary being modified
14
16
  # @param new_id [String] the new dylib ID for the binary
15
17
  # @param options [Hash]
@@ -23,7 +25,8 @@ module MachO
23
25
  file.write!
24
26
  end
25
27
 
26
- # Changes a shared library install name in a Mach-O or Fat binary, overwriting the source file.
28
+ # Changes a shared library install name in a Mach-O or Fat binary,
29
+ # overwriting the source file.
27
30
  # @param filename [String] the Mach-O or Fat binary being modified
28
31
  # @param old_name [String] the old shared library name
29
32
  # @param new_name [String] the new shared library name
@@ -38,7 +41,8 @@ module MachO
38
41
  file.write!
39
42
  end
40
43
 
41
- # Changes a runtime path in a Mach-O or Fat binary, overwriting the source file.
44
+ # Changes a runtime path in a Mach-O or Fat binary, overwriting the source
45
+ # file.
42
46
  # @param filename [String] the Mach-O or Fat binary being modified
43
47
  # @param old_path [String] the old runtime path
44
48
  # @param new_path [String] the new runtime path
@@ -67,7 +71,8 @@ module MachO
67
71
  file.write!
68
72
  end
69
73
 
70
- # Delete a runtime path from a Mach-O or Fat binary, overwriting the source file.
74
+ # Delete a runtime path from a Mach-O or Fat binary, overwriting the source
75
+ # file.
71
76
  # @param filename [String] the Mach-O or Fat binary being modified
72
77
  # @param old_path [String] the old runtime path
73
78
  # @param options [Hash]
@@ -80,5 +85,24 @@ module MachO
80
85
  file.delete_rpath(old_path, options)
81
86
  file.write!
82
87
  end
88
+
89
+ # Merge multiple Mach-Os into one universal (Fat) binary.
90
+ # @param filename [String] the fat binary to create
91
+ # @param files [Array<MachO::MachOFile, MachO::FatFile>] the files to merge
92
+ # @return [void]
93
+ def self.merge_machos(filename, *files)
94
+ machos = files.map do |file|
95
+ macho = MachO.open(file)
96
+ case macho
97
+ when MachO::MachOFile
98
+ macho
99
+ else
100
+ macho.machos
101
+ end
102
+ end.flatten
103
+
104
+ fat_macho = MachO::FatFile.new_from_machos(*machos)
105
+ fat_macho.write(filename)
106
+ end
83
107
  end
84
108
  end
@@ -13,7 +13,8 @@ module MachO
13
13
  value
14
14
  end
15
15
 
16
- # Returns the number of bytes needed to pad the given size to the given alignment.
16
+ # Returns the number of bytes needed to pad the given size to the given
17
+ # alignment.
17
18
  # @param size [Fixnum] the unpadded size
18
19
  # @param alignment [Fixnum] the number to alignment the size with
19
20
  # @return [Fixnum] the number of pad bytes required
@@ -21,7 +22,8 @@ module MachO
21
22
  round(size, alignment) - size
22
23
  end
23
24
 
24
- # Converts an abstract (native-endian) String#unpack format to big or little.
25
+ # Converts an abstract (native-endian) String#unpack format to big or
26
+ # little.
25
27
  # @param format [String] the format string being converted
26
28
  # @param endianness [Symbol] either `:big` or `:little`
27
29
  # @return [String] the converted string
@@ -31,7 +33,8 @@ module MachO
31
33
  end
32
34
 
33
35
  # Packs tagged strings into an aligned payload.
34
- # @param fixed_offset [Fixnum] the baseline offset for the first packed string
36
+ # @param fixed_offset [Fixnum] the baseline offset for the first packed
37
+ # string
35
38
  # @param alignment [Fixnum] the alignment value to use for packing
36
39
  # @param strings [Hash] the labeled strings to pack
37
40
  # @return [Array<String, Hash>] the packed string and labeled offsets
@@ -53,42 +56,42 @@ module MachO
53
56
 
54
57
  # Compares the given number to valid Mach-O magic numbers.
55
58
  # @param num [Fixnum] the number being checked
56
- # @return [Boolean] true if `num` is a valid Mach-O magic number, false otherwise
59
+ # @return [Boolean] whether `num` is a valid Mach-O magic number
57
60
  def self.magic?(num)
58
61
  Headers::MH_MAGICS.key?(num)
59
62
  end
60
63
 
61
64
  # Compares the given number to valid Fat magic numbers.
62
65
  # @param num [Fixnum] the number being checked
63
- # @return [Boolean] true if `num` is a valid Fat magic number, false otherwise
66
+ # @return [Boolean] whether `num` is a valid Fat magic number
64
67
  def self.fat_magic?(num)
65
68
  num == Headers::FAT_MAGIC
66
69
  end
67
70
 
68
71
  # Compares the given number to valid 32-bit Mach-O magic numbers.
69
72
  # @param num [Fixnum] the number being checked
70
- # @return [Boolean] true if `num` is a valid 32-bit magic number, false otherwise
73
+ # @return [Boolean] whether `num` is a valid 32-bit magic number
71
74
  def self.magic32?(num)
72
75
  num == Headers::MH_MAGIC || num == Headers::MH_CIGAM
73
76
  end
74
77
 
75
78
  # Compares the given number to valid 64-bit Mach-O magic numbers.
76
79
  # @param num [Fixnum] the number being checked
77
- # @return [Boolean] true if `num` is a valid 64-bit magic number, false otherwise
80
+ # @return [Boolean] whether `num` is a valid 64-bit magic number
78
81
  def self.magic64?(num)
79
82
  num == Headers::MH_MAGIC_64 || num == Headers::MH_CIGAM_64
80
83
  end
81
84
 
82
85
  # Compares the given number to valid little-endian magic numbers.
83
86
  # @param num [Fixnum] the number being checked
84
- # @return [Boolean] true if `num` is a valid little-endian magic number, false otherwise
87
+ # @return [Boolean] whether `num` is a valid little-endian magic number
85
88
  def self.little_magic?(num)
86
89
  num == Headers::MH_CIGAM || num == Headers::MH_CIGAM_64
87
90
  end
88
91
 
89
92
  # Compares the given number to valid big-endian magic numbers.
90
93
  # @param num [Fixnum] the number being checked
91
- # @return [Boolean] true if `num` is a valid big-endian magic number, false otherwise
94
+ # @return [Boolean] whether `num` is a valid big-endian magic number
92
95
  def self.big_magic?(num)
93
96
  num == Headers::MH_CIGAM || num == Headers::MH_CIGAM_64
94
97
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby-macho
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - William Woodruff
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-11-21 00:00:00.000000000 Z
11
+ date: 2017-03-26 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: A library for viewing and manipulating Mach-O files in Ruby.
14
14
  email: william@tuffbizz.com
@@ -50,7 +50,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
50
50
  version: '0'
51
51
  requirements: []
52
52
  rubyforge_project:
53
- rubygems_version: 2.5.1
53
+ rubygems_version: 2.6.8
54
54
  signing_key:
55
55
  specification_version: 4
56
56
  summary: ruby-macho - Mach-O file analyzer.