Class: Nxo::NxoFile

Inherits:
Object
  • Object
show all
Defined in:
lib/nxo/nxo.rb

Direct Known Subclasses

NsoFile

Defined Under Namespace

Classes: Segment

Constant Summary collapse

MOD_MAGIC =
"MOD0"

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(segments) ⇒ NxoFile

Returns a new instance of NxoFile.



32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# File 'lib/nxo/nxo.rb', line 32

def initialize(segments)
  @segments = segments

  module_offset = self[4, 4].unpack("L<")[0]
  
  magic, o_dynamic, o_bss_b, o_bss_e, o_eh_frame_hdr_b, o_eh_frame_hdr_e, o_ro_module = self[module_offset, 0x1c].unpack("a4L<L<L<L<L<L<")

  if magic != MOD_MAGIC then
    raise Error::InvalidMagicError.new(module_magic, MOD_MAGIC)
  end

  if module_offset + o_bss_b != bss.address then # sanity check
  #  raise Error::AddressMismatchError.new(:module_bss, module_offset + o_bss_b, bss.address)
  end

  @dynamic = Dynamic::DynamicSection.new(self, module_offset + o_dynamic)
end

Instance Attribute Details

#dynamicObject (readonly)

Returns the value of attribute dynamic.



50
51
52
# File 'lib/nxo/nxo.rb', line 50

def dynamic
  @dynamic
end

Instance Method Details

#[](address, size) ⇒ Object



52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# File 'lib/nxo/nxo.rb', line 52

def [](address, size)
  @segments.each do |seg|
    if seg.contains?(address) then
      offset = address - seg.address
      available_size = seg.size - offset
      safe_size = [size, available_size].min
      str = seg[offset, safe_size]
      if safe_size < size then
        return str + self[address + safe_size, size - safe_size]
      else
        return str
      end
    end
  end
  raise Error::UnmappedAddressError.new(address)
end

#bssObject



81
82
83
# File 'lib/nxo/nxo.rb', line 81

def bss
  @segments[3]
end

#dataObject



77
78
79
# File 'lib/nxo/nxo.rb', line 77

def data
  @segments[2]
end

#fs_sdk_versionsObject



85
86
87
# File 'lib/nxo/nxo.rb', line 85

def fs_sdk_versions
  rodata.contents.scan(/sdk_version: ([0-9.]*)/).map do |m| m[0] end
end

#name_heuristicObject



89
90
91
92
# File 'lib/nxo/nxo.rb', line 89

def name_heuristic
  l = rodata[4, 4].unpack("L<")[0]
  return rodata[8, l]
end

#rodataObject



73
74
75
# File 'lib/nxo/nxo.rb', line 73

def rodata
  @segments[1]
end

#textObject



69
70
71
# File 'lib/nxo/nxo.rb', line 69

def text
  @segments[0]
end