Class: ELFTools::Segments::Segment

Inherits:
Object
  • Object
show all
Defined in:
lib/elftools/segments/segment.rb

Overview

Base class of segments.

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(header, stream, offset_from_vma: nil, machine: nil, **_kwargs) ⇒ Segment

Instantiate a ELFTools::Segments::Segment object.

Parameters:

  • header (ELFTools::Structs::ELF32_Phdr, ELFTools::Structs::ELF64_Phdr)

    Program header.

  • stream (#pos=, #read)

    Streaming object.

  • offset_from_vma (Method) (defaults to: nil)

    The method to get offset of file, given virtual memory address.

  • machine (Integer) (defaults to: nil)

    The machine of the ELF file, which decides what the entries a segment points at mean. This should be e_machine of the ELF header.



20
21
22
23
24
25
# File 'lib/elftools/segments/segment.rb', line 20

def initialize(header, stream, offset_from_vma: nil, machine: nil, **_kwargs)
  @header = header
  @stream = stream
  @offset_from_vma = offset_from_vma
  @machine = machine
end

Instance Attribute Details

#headerELFTools::Structs::ELF32_Phdr, ELFTools::Structs::ELF64_Phdr (readonly)

Returns Program header.



7
8
9
# File 'lib/elftools/segments/segment.rb', line 7

def header
  @header
end

#stream#pos=, #read (readonly)

Returns Streaming object.

Returns:

  • (#pos=, #read)

    Streaming object.



8
9
10
# File 'lib/elftools/segments/segment.rb', line 8

def stream
  @stream
end

Class Method Details

.create(header, stream, *args, **kwargs) ⇒ ELFTools::Segments::Segment

Use different class according to header.p_type.

Parameters:

Returns:



22
23
24
25
26
27
28
29
30
31
# File 'lib/elftools/segments/segments.rb', line 22

def create(header, stream, *args, **kwargs)
  klass = case header.p_type
          when Constants::PT_DYNAMIC then DynamicSegment
          when Constants::PT_INTERP then InterpSegment
          when Constants::PT_LOAD then LoadSegment
          when Constants::PT_NOTE then NoteSegment
          else Segment
          end
  klass.new(header, stream, *args, **kwargs)
end

Instance Method Details

#dataString

The content in this segment.

Returns:

  • (String)

    The content.



36
37
38
39
# File 'lib/elftools/segments/segment.rb', line 36

def data
  stream.pos = header.p_offset
  stream.read(header.p_filesz)
end

#executable?Boolean

Is this segment executable?

Returns:

  • (Boolean)

    True or false.



55
56
57
# File 'lib/elftools/segments/segment.rb', line 55

def executable?
  header.p_flags.allbits?(1)
end

#readable?Boolean

Is this segment readable?

Returns:

  • (Boolean)

    True or false.



43
44
45
# File 'lib/elftools/segments/segment.rb', line 43

def readable?
  header.p_flags.allbits?(4)
end

#typeInteger

Return header.p_type in a simpler way.

Returns:

  • (Integer)

    The type, meaning of types are defined in Constants::PT.



30
31
32
# File 'lib/elftools/segments/segment.rb', line 30

def type
  header.p_type
end

#writable?Boolean

Is this segment writable?

Returns:

  • (Boolean)

    True or false.



49
50
51
# File 'lib/elftools/segments/segment.rb', line 49

def writable?
  header.p_flags.allbits?(2)
end