adds first version of the expanded as assembler from mikko
This commit is contained in:
77
lib/elf/symbol_table_section.rb
Normal file
77
lib/elf/symbol_table_section.rb
Normal file
@ -0,0 +1,77 @@
|
||||
module Elf
|
||||
class SymbolTableSection < Section
|
||||
def initialize(name, strtab)
|
||||
super(name)
|
||||
|
||||
@strtab = strtab
|
||||
|
||||
@symbols = []
|
||||
end
|
||||
|
||||
def add_func_symbol(name, value, text_section, linkage)
|
||||
@strtab.add_string name
|
||||
arr = [name, value, text_section, linkage]
|
||||
if (linkage == Elf::Constants::STB_LOCAL)
|
||||
@symbols.unshift arr
|
||||
else
|
||||
@symbols.push arr
|
||||
end
|
||||
end
|
||||
|
||||
def index_for_name(name)
|
||||
@symbols.each_with_index { |sym, idx|
|
||||
if (sym[0] == name)
|
||||
return idx
|
||||
end
|
||||
}
|
||||
nil
|
||||
end
|
||||
|
||||
def type
|
||||
Elf::Constants::SHT_SYMTAB
|
||||
end
|
||||
|
||||
def ent_size
|
||||
16
|
||||
end
|
||||
|
||||
def link
|
||||
@strtab.index
|
||||
end
|
||||
|
||||
def info
|
||||
i = -1
|
||||
@symbols.each_with_index { |sym, idx|
|
||||
if (sym[4] == Elf::Constants::STB_LOCAL)
|
||||
i = idx
|
||||
end
|
||||
}
|
||||
i + 1
|
||||
end
|
||||
|
||||
def write(io)
|
||||
# write undefined symbol
|
||||
io.write_uint32 0
|
||||
io.write_uint32 0
|
||||
io.write_uint32 0
|
||||
io.write_uint8 Elf::Constants::STB_LOCAL << 4
|
||||
io.write_uint8 0
|
||||
io.write_uint16 0
|
||||
|
||||
# write other symbols
|
||||
@symbols.each { |sym|
|
||||
io.write_uint32 @strtab.index_for(sym[0])
|
||||
io.write_uint32 sym[1]
|
||||
io.write_uint32 0
|
||||
io.write_uint8((sym[3] << 4) + 0)
|
||||
io.write_uint8 0
|
||||
if (sym[2])
|
||||
io.write_uint16 sym[2].index
|
||||
else
|
||||
# undefined symbol
|
||||
io.write_uint16 0
|
||||
end
|
||||
}
|
||||
end
|
||||
end
|
||||
end
|
Reference in New Issue
Block a user