Class: ELFTools::Segments::LoadSegment
- Defined in:
- lib/elftools/segments/load_segment.rb
Overview
For DT_LOAD segment. Able to query between file offset and virtual memory address.
Instance Attribute Summary
Attributes inherited from Segment
Instance Method Summary collapse
-
#file_head ⇒ Integer
Returns the start of this segment.
-
#file_tail ⇒ Integer
Returns the end of this segment.
-
#mapped_head ⇒ Integer
Returns the lowest virtual address backed by this segment's file content.
-
#mapped_tail ⇒ Integer
Returns the end virtual address backed by this segment's file content.
-
#mem_head ⇒ Integer
Returns the start virtual address of this segment.
-
#mem_size ⇒ Integer
Returns size in memory.
-
#mem_tail ⇒ Integer
Returns the end virtual address of this segment.
-
#offset_in?(offset, size = 0) ⇒ Boolean
Query if the given file offset located in this segment.
-
#offset_to_vma(offset) ⇒ Integer
Convert file offset into virtual memory address.
-
#size ⇒ Integer
Returns size in file.
-
#vma_in?(vma, size = 0) ⇒ Boolean
Query if the given virtual memory address is backed by this segment's file content.
-
#vma_to_offset(vma) ⇒ Integer
Convert virtual memory address into file offset.
Methods inherited from Segment
create, #data, #executable?, #initialize, #readable?, #type, #writable?
Constructor Details
This class inherits a constructor from ELFTools::Segments::Segment
Instance Method Details
#file_head ⇒ Integer
Returns the start of this segment.
13 14 15 |
# File 'lib/elftools/segments/load_segment.rb', line 13 def file_head header.p_offset.to_i end |
#file_tail ⇒ Integer
Returns the end of this segment.
27 28 29 |
# File 'lib/elftools/segments/load_segment.rb', line 27 def file_tail file_head + size end |
#mapped_head ⇒ Integer
Returns the lowest virtual address backed by this segment's file content.
A segment is mapped from an aligned boundary, so the addresses preceding
#mem_head within the same alignment unit are backed by this segment as
well. The bound is clamped to the address of the first byte of the file,
so that a malformed ELF, whose p_offset and p_vaddr are not congruent
modulo p_align, cannot be converted into a negative file offset.
61 62 63 |
# File 'lib/elftools/segments/load_segment.rb', line 61 def mapped_head [header.p_vaddr.to_i & -header.p_align.to_i, mem_head - file_head].max end |
#mapped_tail ⇒ Integer
Returns the end virtual address backed by this segment's file content.
Addresses in between this and #mem_tail occupy memory but have no content in file, therefore cannot be converted into a file offset.
71 72 73 |
# File 'lib/elftools/segments/load_segment.rb', line 71 def mapped_tail mem_head + size end |
#mem_head ⇒ Integer
Returns the start virtual address of this segment.
34 35 36 |
# File 'lib/elftools/segments/load_segment.rb', line 34 def mem_head header.p_vaddr.to_i end |
#mem_size ⇒ Integer
Returns size in memory.
41 42 43 |
# File 'lib/elftools/segments/load_segment.rb', line 41 def mem_size header.p_memsz.to_i end |
#mem_tail ⇒ Integer
Returns the end virtual address of this segment.
48 49 50 |
# File 'lib/elftools/segments/load_segment.rb', line 48 def mem_tail mem_head + mem_size end |
#offset_in?(offset, size = 0) ⇒ Boolean
Query if the given file offset located in this segment.
81 82 83 |
# File 'lib/elftools/segments/load_segment.rb', line 81 def offset_in?(offset, size = 0) file_head <= offset && offset + size <= file_tail end |
#offset_to_vma(offset) ⇒ Integer
Convert file offset into virtual memory address.
The conversion is a shift by a constant, so it holds no matter p_offset
is aligned with p_vaddr or not.
92 93 94 |
# File 'lib/elftools/segments/load_segment.rb', line 92 def offset_to_vma(offset) offset - file_head + header.p_vaddr end |
#size ⇒ Integer
Returns size in file.
20 21 22 |
# File 'lib/elftools/segments/load_segment.rb', line 20 def size header.p_filesz.to_i end |
#vma_in?(vma, size = 0) ⇒ Boolean
Query if the given virtual memory address is backed by this segment's file content.
Only addresses in between #mapped_head and #mapped_tail can be converted into a file offset, see #vma_to_offset.
106 107 108 |
# File 'lib/elftools/segments/load_segment.rb', line 106 def vma_in?(vma, size = 0) vma >= mapped_head && vma + size <= mapped_tail end |
#vma_to_offset(vma) ⇒ Integer
Convert virtual memory address into file offset.
114 115 116 |
# File 'lib/elftools/segments/load_segment.rb', line 114 def vma_to_offset(vma) vma - header.p_vaddr + header.p_offset end |