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