Class: Nxo::NxoFile
- Inherits:
-
Object
- Object
- Nxo::NxoFile
- Defined in:
- lib/nxo/nxo.rb
Direct Known Subclasses
Defined Under Namespace
Classes: Segment
Constant Summary collapse
- MOD_MAGIC =
"MOD0"
Instance Attribute Summary collapse
-
#dynamic ⇒ Object
readonly
Returns the value of attribute dynamic.
Instance Method Summary collapse
- #[](address, size) ⇒ Object
- #bss ⇒ Object
- #data ⇒ Object
- #fs_sdk_versions ⇒ Object
-
#initialize(segments) ⇒ NxoFile
constructor
A new instance of NxoFile.
- #name_heuristic ⇒ Object
- #rodata ⇒ Object
- #text ⇒ Object
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
#dynamic ⇒ Object (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 |
#bss ⇒ Object
81 82 83 |
# File 'lib/nxo/nxo.rb', line 81 def bss @segments[3] end |
#data ⇒ Object
77 78 79 |
# File 'lib/nxo/nxo.rb', line 77 def data @segments[2] end |
#fs_sdk_versions ⇒ Object
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_heuristic ⇒ Object
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 |
#rodata ⇒ Object
73 74 75 |
# File 'lib/nxo/nxo.rb', line 73 def rodata @segments[1] end |
#text ⇒ Object
69 70 71 |
# File 'lib/nxo/nxo.rb', line 69 def text @segments[0] end |