class Elf::GNU::SymbolVersionNeed

Public Instance Methods

[](idx) click to toggle source
# File lib/elf/gnu.rb, line 158
def [](idx)
  load unless @needed_versions

  @needed_versions[idx]
end
count() click to toggle source
# File lib/elf/gnu.rb, line 152
def count
  load unless @needed_versions

  @needed_versions.size
end
each_version(&block) click to toggle source

Allow to iterate over all the versions needed in the ELF file.

# File lib/elf/gnu.rb, line 166
def each_version(&block)
  load unless @needed_versions

  @needed_versions.each_value(&block)
end
load_internal() click to toggle source
# File lib/elf/gnu.rb, line 115
def load_internal
  link.load # do this now for safety

  @needed_versions = {}
  loop do
    version = @file.read_half
    raise SymbolVersionUnknown.new(version) if version != 1
    aux_count = @file.read_half
    file = link[@file.read_word]
    # discard the next, it's used for non-sequential reading.
    @file.read_word
    # This one is interesting only when we need to stop the
    # read loop.
    more = @file.read_word != 0

    for i in 1..aux_count
      entry = {}
      
      entry[:file] = file
      entry[:hash] = @file.read_word
      entry[:flags] = @file.read_half

      tmp = @file.read_half # damn Drepper and overloaded values
      entry[:private] = !(tmp & (1 << 15) == 0)
      index = tmp & ~(1 << 15)

      entry[:name] = link[@file.read_word]

      @needed_versions[index] = entry

      break unless @file.read_word != 0
    end

    break unless more
  end
end