Class: MachO::LoadCommands::LoadCommand
- Inherits:
-
MachOStructure
- Object
- MachOStructure
- MachO::LoadCommands::LoadCommand
- Defined in:
- lib/macho/load_commands.rb
Overview
The top-level Mach-O load command structure.
This is the most generic load command -- only the type ID and size are represented. Used when a more specific class isn't available or isn't implemented.
Direct Known Subclasses
BuildVersionCommand, DyldInfoCommand, DylibCommand, DylinkerCommand, DysymtabCommand, EncryptionInfoCommand, EntryPointCommand, FilesetEntryCommand, FvmfileCommand, FvmlibCommand, IdentCommand, LinkeditDataCommand, LinkerOptionCommand, NoteCommand, PrebindCksumCommand, PreboundDylibCommand, RoutinesCommand, RpathCommand, SegmentCommand, SourceVersionCommand, SubClientCommand, SubFrameworkCommand, SubLibraryCommand, SubUmbrellaCommand, SymsegCommand, SymtabCommand, TargetTripleCommand, ThreadCommand, TwolevelHintsCommand, UUIDCommand, VersionMinCommand
Defined Under Namespace
Classes: LCStr, SerializationContext
Class Method Summary collapse
-
.create(cmd_sym, *args) ⇒ Object
Creates a new (viewless) command corresponding to the symbol provided.
-
.new_from_bin(view) ⇒ LoadCommand
private
Instantiates a new LoadCommand given a view into its origin Mach-O.
Instance Method Summary collapse
-
#cmd ⇒ Integer
The load command's type ID.
-
#cmdsize ⇒ Integer
The size of the load command, in bytes.
-
#offset ⇒ Integer
deprecated
Deprecated.
use #view instead
-
#serializable? ⇒ Boolean
Whether the load command can be serialized.
-
#serialize(context) ⇒ String?
private
The serialized fields of the load command, or nil if the load command can't be serialized.
-
#to_h ⇒ Hash
A hash representation of this load command.
-
#to_s ⇒ String
A string representation of the load command's identifying number.
-
#type ⇒ Symbol?
(also: #to_sym)
A symbol representation of the load command's type ID, or nil if the ID doesn't correspond to a known load command class.
-
#view ⇒ MachO::MachOView?
The raw view associated with the load command, or nil if the load command was created via LoadCommand.create.
Methods inherited from MachOStructure
Constructor Details
This class inherits a constructor from MachO::MachOStructure
Class Method Details
.create(cmd_sym, *args) ⇒ Object
Creates a new (viewless) command corresponding to the symbol provided
247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 |
# File 'lib/macho/load_commands.rb', line 247 def self.create(cmd_sym, *args) raise LoadCommandNotCreatableError, cmd_sym unless CREATABLE_LOAD_COMMANDS.include?(cmd_sym) klass = LoadCommands.const_get LC_STRUCTURES[cmd_sym] cmd = LOAD_COMMAND_CONSTANTS[cmd_sym] # cmd will be filled in, view and cmdsize will be left unpopulated klass_arity = klass.min_args - 3 # macOS 15 introduces a new dylib load command that adds a flags field to the end. # It uses the same commands with it dynamically being created if the dylib has a flags field if klass == DylibUseCommand && (args[1] != DYLIB_USE_MARKER || args.size <= DylibCommand.min_args - 3) klass = DylibCommand klass_arity = klass.min_args - 3 end raise LoadCommandCreationArityError.new(cmd_sym, klass_arity, args.size) if klass_arity > args.size klass.new(nil, cmd, nil, *args) end |
.new_from_bin(view) ⇒ LoadCommand
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Instantiates a new LoadCommand given a view into its origin Mach-O
237 238 239 240 241 242 |
# File 'lib/macho/load_commands.rb', line 237 def self.new_from_bin(view) bin = view.raw_data.slice(view.offset, bytesize) format = Utils.specialize_format(self.format, view.endianness) new(view, *bin.unpack(format)) end |
Instance Method Details
#cmd ⇒ Integer
Returns the load command's type ID.
228 |
# File 'lib/macho/load_commands.rb', line 228 field :cmd, :uint32 |
#cmdsize ⇒ Integer
Returns the size of the load command, in bytes.
231 |
# File 'lib/macho/load_commands.rb', line 231 field :cmdsize, :uint32 |
#offset ⇒ Integer
use #view instead
Returns the load command's offset in the source file.
287 288 289 |
# File 'lib/macho/load_commands.rb', line 287 def offset view.offset end |
#serializable? ⇒ Boolean
Returns whether the load command can be serialized.
269 270 271 |
# File 'lib/macho/load_commands.rb', line 269 def serializable? CREATABLE_LOAD_COMMANDS.include?(LOAD_COMMANDS[cmd]) end |
#serialize(context) ⇒ String?
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Returns the serialized fields of the load command, or nil if the load command can't be serialized.
278 279 280 281 282 283 |
# File 'lib/macho/load_commands.rb', line 278 def serialize(context) raise LoadCommandNotSerializableError, LOAD_COMMANDS[cmd] unless serializable? format = Utils.specialize_format(self.class.format, context.endianness) [cmd, self.class.bytesize].pack(format) end |
#to_h ⇒ Hash
Children should override this to include additional information.
Returns a hash representation of this load command.
307 308 309 310 311 312 313 314 |
# File 'lib/macho/load_commands.rb', line 307 def to_h { "view" => view.to_h, "cmd" => cmd, "cmdsize" => cmdsize, "type" => type, }.merge super end |
#to_s ⇒ String
Returns a string representation of the load command's identifying number.
301 302 303 |
# File 'lib/macho/load_commands.rb', line 301 def to_s type.to_s end |
#type ⇒ Symbol? Also known as: to_sym
Returns a symbol representation of the load command's type ID, or nil if the ID doesn't correspond to a known load command class.
293 294 295 |
# File 'lib/macho/load_commands.rb', line 293 def type LOAD_COMMANDS[cmd] end |
#view ⇒ MachO::MachOView?
Returns the raw view associated with the load command, or nil if the load command was created via create.
225 |
# File 'lib/macho/load_commands.rb', line 225 field :view, :view |