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

#mapped_headInteger

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.

Returns:

  • (Integer)

    The vma.



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_tailInteger

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.

Returns:

  • (Integer)

    The vma.



71
72
73
# File 'lib/elftools/segments/load_segment.rb', line 71

def mapped_tail
  mem_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)


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.

Parameters:

  • offset (Integer)

    File offset.

Returns:

  • (Integer)


92
93
94
# File 'lib/elftools/segments/load_segment.rb', line 92

def offset_to_vma(offset)
  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 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.

Parameters:

  • vma (Integer)

    Virtual memory address.

  • size (Integer) (defaults to: 0)

    Size.

Returns:

  • (Boolean)


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.

Parameters:

  • vma (Integer)

    Virtual memory address.

Returns:

  • (Integer)


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