class Metasm::COFF::RelocationTable
array of relocations to apply to an executable file when it is loaded at an address that is not its preferred_base_address
Attributes
relocs[RW]
Public Instance Methods
decode(coff)
click to toggle source
decodes a relocation table from coff.encoded.ptr
Calls superclass method
Metasm::SerialStruct#decode
# File metasm/exe_format/coff_decode.rb, line 310 def decode(coff) super(coff) len = coff.decode_word len -= 8 if len < 0 or len % 2 != 0 puts "W: COFF: Invalid relocation table length #{len+8}" if $VERBOSE coff.curencoded.read(len) if len > 0 @relocs = [] return end @relocs = coff.curencoded.read(len).unpack(coff.endianness == :big ? 'n*' : 'v*').map { |r| Relocation.new(r&0xfff, r>>12) } #(len/2).times { @relocs << Relocation.decode(coff) } # tables may be big, this is too slow end
encode(coff)
click to toggle source
encodes a COFF
relocation table
Calls superclass method
Metasm::SerialStruct#encode
# File metasm/exe_format/coff_encode.rb, line 219 def encode(coff) rel = super(coff) << coff.encode_word(8 + 2*@relocs.length) @relocs.each { |r| rel << r.encode(coff) } rel end
set_default_values(coff)
click to toggle source
Calls superclass method
Metasm::SerialStruct#set_default_values
# File metasm/exe_format/coff_encode.rb, line 225 def set_default_values(coff) # @base_addr is an rva @base_addr = Expression[@base_addr, :-, coff.label_at(coff.encoded, 0)] if @base_addr.kind_of?(::String) # align relocation table size if @relocs.length % 2 != 0 r = Relocation.new r.type = 0 r.offset = 0 @relocs << r end super(coff) end