Class: MachO::LoadCommands::SegmentCommand

Inherits:
LoadCommand show all
Defined in:
lib/macho/load_commands.rb

Overview

A load command indicating that part of this file is to be mapped into the task's address space. Corresponds to LC_SEGMENT.

Direct Known Subclasses

SegmentCommand64

Constant Summary collapse

FORMAT =

This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.

"L=2a16L=4l=2L=2".freeze
SIZEOF =

This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.

56

Instance Attribute Summary collapse

Attributes inherited from LoadCommand

#cmd, #cmdsize, #view

Instance Method Summary collapse

Methods inherited from LoadCommand

create, new_from_bin, #offset, #serializable?, #serialize, #to_s, #type

Methods inherited from MachOStructure

bytesize, new_from_bin

Constructor Details

#initialize(view, cmd, cmdsize, segname, vmaddr, vmsize, fileoff, filesize, maxprot, initprot, nsects, flags) ⇒ SegmentCommand

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 a new instance of SegmentCommand.



404
405
406
407
408
409
410
411
412
413
414
415
416
# File 'lib/macho/load_commands.rb', line 404

def initialize(view, cmd, cmdsize, segname, vmaddr, vmsize, fileoff,
               filesize, maxprot, initprot, nsects, flags)
  super(view, cmd, cmdsize)
  @segname = segname.delete("\x00")
  @vmaddr = vmaddr
  @vmsize = vmsize
  @fileoff = fileoff
  @filesize = filesize
  @maxprot = maxprot
  @initprot = initprot
  @nsects = nsects
  @flags = flags
end

Instance Attribute Details

#fileoffFixnum (readonly)

Returns the file offset of the segment.

Returns:

  • (Fixnum)

    the file offset of the segment



378
379
380
# File 'lib/macho/load_commands.rb', line 378

def fileoff
  @fileoff
end

#filesizeFixnum (readonly)

Returns the amount to map from the file.

Returns:

  • (Fixnum)

    the amount to map from the file



381
382
383
# File 'lib/macho/load_commands.rb', line 381

def filesize
  @filesize
end

#flagsFixnum (readonly)

Returns any flags associated with the segment.

Returns:

  • (Fixnum)

    any flags associated with the segment



393
394
395
# File 'lib/macho/load_commands.rb', line 393

def flags
  @flags
end

#initprotFixnum (readonly)

Returns the initial VM protection.

Returns:

  • (Fixnum)

    the initial VM protection



387
388
389
# File 'lib/macho/load_commands.rb', line 387

def initprot
  @initprot
end

#maxprotFixnum (readonly)

Returns the maximum VM protection.

Returns:

  • (Fixnum)

    the maximum VM protection



384
385
386
# File 'lib/macho/load_commands.rb', line 384

def maxprot
  @maxprot
end

#nsectsFixnum (readonly)

Returns the number of sections in the segment.

Returns:

  • (Fixnum)

    the number of sections in the segment



390
391
392
# File 'lib/macho/load_commands.rb', line 390

def nsects
  @nsects
end

#segnameString (readonly)

Returns the name of the segment.

Returns:

  • (String)

    the name of the segment



369
370
371
# File 'lib/macho/load_commands.rb', line 369

def segname
  @segname
end

#vmaddrFixnum (readonly)

Returns the memory address of the segment.

Returns:

  • (Fixnum)

    the memory address of the segment



372
373
374
# File 'lib/macho/load_commands.rb', line 372

def vmaddr
  @vmaddr
end

#vmsizeFixnum (readonly)

Returns the memory size of the segment.

Returns:

  • (Fixnum)

    the memory size of the segment



375
376
377
# File 'lib/macho/load_commands.rb', line 375

def vmsize
  @vmsize
end

Instance Method Details

#flag?(flag) ⇒ Boolean

Returns true if flag is present in the segment's flag field.

Examples:

puts "this segment relocated in/to it" if sect.flag?(:SG_NORELOC)

Parameters:

  • flag (Symbol)

    a segment flag symbol

Returns:

  • (Boolean)

    true if flag is present in the segment's flag field



442
443
444
445
446
# File 'lib/macho/load_commands.rb', line 442

def flag?(flag)
  flag = SEGMENT_FLAGS[flag]
  return false if flag.nil?
  flags & flag == flag
end

#sectionsArray<MachO::Sections::Section>, Array<MachO::Sections::Section64>

All sections referenced within this segment.

Returns:



421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
# File 'lib/macho/load_commands.rb', line 421

def sections
  klass = case self
  when SegmentCommand64
    MachO::Sections::Section64
  when SegmentCommand
    MachO::Sections::Section
  end

  offset = view.offset + self.class.bytesize
  length = nsects * klass.bytesize

  bins = view.raw_data[offset, length]
  bins.unpack("a#{klass.bytesize}" * nsects).map do |bin|
    klass.new_from_bin(view.endianness, bin)
  end
end