diff --git a/lib/asm/arm_assembler.rb b/lib/asm/arm_assembler.rb index 91d0ead1..8fa94902 100644 --- a/lib/asm/arm_assembler.rb +++ b/lib/asm/arm_assembler.rb @@ -116,47 +116,5 @@ module Asm end end - - # Relocation constants - # Note that in this assembler, a relocation simply means any - # reference to a label that can only be determined at assembly time - # or later (as in the normal meaning) - - R_ARM_PC24 = 0x01 - R_ARM_ABS32 = 0x02 - - # Unofficial (cant be used for extern relocations) - R_ARM_PC12 = 0xF0 - - def self.write_resolved_relocation(io, addr, type) - case type - when R_ARM_PC24 - diff = addr - io.tell - 8 - if (diff.abs > (1 << 25)) - raise Asm::AssemblyError.new('offset too large for R_ARM_PC24 relocation') - end - packed = [diff >> 2].pack('l') - io << packed[0,3] - when R_ARM_ABS32 - packed = [addr].pack('l') - io << packed - when R_ARM_PC12 - diff = addr - io.tell - 8 - if (diff.abs > 2047) - raise Asm::AssemblyError.new('offset too large for R_ARM_PC12 relocation') - end - - val = diff.abs - sign = (diff>0)?1:0 - - curr = io.read_uint32 - io.seek(-4, IO::SEEK_CUR) - - io.write_uint32 (curr & ~0b00000000100000000000111111111111) | - val | (sign << 23) - else - raise 'unknown relocation type' - end - end end diff --git a/lib/asm/instruction.rb b/lib/asm/instruction.rb index 6d5acdae..d20377e6 100644 --- a/lib/asm/instruction.rb +++ b/lib/asm/instruction.rb @@ -41,8 +41,6 @@ module Asm 4 end - RelocHandler = nil # Asm::Arm.method(:write_resolved_relocation) - def assemble(io, as) s = @s ? 1 : 0 case opcode @@ -102,8 +100,8 @@ module Asm elsif (arg.is_a?(Asm::LabelObject) or arg.is_a?(Asm::Label)) #not yet tested/supported # arg = @ast_asm.object_for_label(arg.label, self) if arg.is_a?(Asm::Label) -# as.add_relocation(io.tell, arg, Asm::R_ARM_PC24, RelocHandler) #write 0 "for now" and let relocation happen + raise "not coded #{arg.inspect}" io << "\x00\x00\x00" else raise "else not coded #{arg.inspect}" diff --git a/lib/asm/memory_access_builder.rb b/lib/asm/memory_access_builder.rb index b8286d37..29c18e71 100644 --- a/lib/asm/memory_access_builder.rb +++ b/lib/asm/memory_access_builder.rb @@ -68,18 +68,6 @@ module Asm (byte_access << 12+4+4+1+1) | (add_offset << 12+4+4+1+1+1) | (pre_post_index << 12+4+4+1+1+1+1) | (i << 12+4+4+1+1+1+1+1) | (inst_class << 12+4+4+1+1+1+1+1+1) | (cond << 12+4+4+1+1+1+1+1+1+2) - # move towards simpler model - if (@use_addrtable_reloc) -# closest_addrtable = Asm::Arm.closest_addrtable(as) - if (@addrtable_reloc_target.is_a?(Asm::Label)) - obj = generator.object_for_label(@addrtable_reloc_target.label, inst) -# ref_label = closest_addrtable.add_label(obj) - elsif (@addrtable_reloc_target.is_a?(Asm::NumLiteral)) -# ref_label = closest_addrtable.add_const(@addrtable_reloc_target.value) - end - as.add_relocation io.tell, ref_label, Asm::R_ARM_PC12, - Asm::Instruction::RelocHandler - end io.write_uint32 val end end diff --git a/lib/asm/object_writer.rb b/lib/asm/object_writer.rb index 04793d5b..242bfa4d 100644 --- a/lib/asm/object_writer.rb +++ b/lib/asm/object_writer.rb @@ -2,7 +2,6 @@ require 'elf/object_file' require 'elf/symbol_table_section' require 'elf/text_section' require 'elf/string_table_section' -require 'elf/relocation_table_section' module Asm @@ -17,9 +16,6 @@ module Asm @text = Elf::TextSection.new(".text") @object.add_section @text - -# @reloc_table = Elf::RelocationTableSection.new(".text.rel", @symbol_table, @text) -# @object.add_section @reloc_table end def set_text(text) @@ -31,14 +27,6 @@ module Asm @symbol_table.add_func_symbol name, offset, @text, linkage end -# def add_reloc_symbol(name) -# @symbol_table.add_func_symbol name, 0, nil, Elf::Constants::STB_GLOBAL -# end - -# def add_reloc(offset, label, type) -# @reloc_table.add_reloc offset, label, type -# end - def save(filename) to = File.open(filename, 'wb') @object.write to diff --git a/lib/elf/relocation_table_section.rb b/lib/elf/relocation_table_section.rb deleted file mode 100644 index 8cd65030..00000000 --- a/lib/elf/relocation_table_section.rb +++ /dev/null @@ -1,41 +0,0 @@ -module Elf - class RelocationTableSection < Section - def initialize(name, symtab, text_section) - super(name) - - @symtab = symtab - @text_section = text_section - - @relocs = [] - end - - def add_reloc(offset, name, type) - @relocs << [offset, name, type] - end - - def type - Elf::Constants::SHT_REL - end - - def ent_size - 8 - end - - def link - @symtab.index - end - - def info - @text_section.index - end - - def write(io) - @relocs.each { |reloc| - name_idx = @symtab.index_for_name(reloc[1]) - io.write_uint32 reloc[0] - # +1 because entry number 0 is und - io.write_uint32 reloc[2] | ((name_idx+1) << 8) - } - end - end -end