Class: ELFTools::Segments::LoadSegment

Inherits:
Segment
  • Object
show all
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

#header, #stream

Instance Method Summary collapse

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_headInteger

Returns the start of this segment.

Returns:

  • (Integer)

    The file offset.



13
14
15
# File 'lib/elftools/segments/load_segment.rb', line 13

def file_head
  header.p_offset.to_i
end

#file_tailInteger

Returns the end of this segment.

Returns:

  • (Integer)

    The file offset.



27
28
29
# File 'lib/elftools/segments/load_segment.rb', line 27

def file_tail
  file_head + size
end

#mem_headInteger

Returns the start virtual address of this segment.

Returns:

  • (Integer)

    The vma.



34
35
36
# File 'lib/elftools/segments/load_segment.rb', line 34

def mem_head
  header.p_vaddr.to_i
end

#mem_sizeInteger

Returns size in memory.

Returns:

  • (Integer)

    The size.



41
42
43
# File 'lib/elftools/segments/load_segment.rb', line 41

def mem_size
  header.p_memsz.to_i
end

#mem_tailInteger

Returns the end virtual address of this segment.

Returns:

  • (Integer)

    The vma.



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.

Parameters:

  • offset (Integer)

    File offset.

  • size (Integer) (defaults to: 0)

    Size.

Returns:

  • (Boolean)


58
59
60
# File 'lib/elftools/segments/load_segment.rb', line 58

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.

Parameters:

  • offset (Integer)

    File offset.

Returns:

  • (Integer)


66
67
68
69
# File 'lib/elftools/segments/load_segment.rb', line 66

def offset_to_vma(offset)
  # XXX: What if file_head is not aligned with p_vaddr (which is invalid according to ELF spec)?
  offset - file_head + header.p_vaddr
end

#sizeInteger

Returns size in file.

Returns:

  • (Integer)

    The size.



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 located in this segment.

Parameters:

  • vma (Integer)

    Virtual memory address.

  • size (Integer) (defaults to: 0)

    Size.

Returns:

  • (Boolean)


77
78
79
80
# File 'lib/elftools/segments/load_segment.rb', line 77

def vma_in?(vma, size = 0)
  vma >= (header.p_vaddr & -header.p_align) &&
    vma + size <= mem_tail
end

#vma_to_offset(vma) ⇒ Integer

Convert virtual memory address into file offset.

Parameters:

  • vma (Integer)

    Virtual memory address.

Returns:

  • (Integer)


86
87
88
# File 'lib/elftools/segments/load_segment.rb', line 86

def vma_to_offset(vma)
  vma - header.p_vaddr + header.p_offset
end