Pass relocations to the elf generator
This commit is contained in:
@ -140,33 +140,37 @@ namespace elna::riscv
|
||||
auto references = generate(intermediate_code_generator, table, writer1);
|
||||
generate(intermediate_code_generator, table, writer2);
|
||||
|
||||
writer2->pipe.close();
|
||||
child.wait();
|
||||
|
||||
syma.arrange_local_symbols();
|
||||
|
||||
for (auto& reference : references)
|
||||
{
|
||||
ELFIO::Elf_Word relocated_symbol = lookup(syma, reference.name);
|
||||
auto reference_offset = boost::endian::native_to_big(static_cast<std::uint32_t>(reference.offset));
|
||||
std::uint8_t address_type{ 0 };
|
||||
|
||||
switch (reference.target)
|
||||
{
|
||||
case address_t::high20:
|
||||
rela.add_entry(reference.offset, relocated_symbol, 26 /* ELFIO::R_RISCV_HI20 */);
|
||||
// rela.add_entry(reference.offset, relocated_symbol, 51 /* ELFIO::R_RISCV_RELAX */);
|
||||
address_type = 26;
|
||||
break;
|
||||
case address_t::lower12i:
|
||||
rela.add_entry(reference.offset, relocated_symbol, 27 /* ELFIO::R_RISCV_LO12_I */);
|
||||
// rela.add_entry(reference.offset, relocated_symbol, 51 /* ELFIO::R_RISCV_RELAX */);
|
||||
address_type = 27;
|
||||
break;
|
||||
case address_t::text:
|
||||
rela.add_entry(reference.offset, relocated_symbol, 18 /* ELFIO::R_RISCV_CALL */);
|
||||
// rela.add_entry(reference.offset, relocated_symbol, 51 /* ELFIO::R_RISCV_RELAX */);
|
||||
address_type = 18;
|
||||
break;
|
||||
}
|
||||
rela.add_entry(reference.offset, relocated_symbol, 18 /* ELFIO::R_RISCV_CALL */);
|
||||
// rela.add_entry(reference.offset, relocated_symbol, 51 /* ELFIO::R_RISCV_RELAX */);
|
||||
writer2->pipe.write_some(boost::asio::buffer(&address_type, 1));
|
||||
writer2->pipe.write_some(boost::asio::buffer(reference.name.data(), reference.name.size() + 1));
|
||||
writer2->pipe.write_some(boost::asio::buffer(&reference_offset, 4));
|
||||
}
|
||||
|
||||
// Create ELF object file
|
||||
writer2->pipe.close();
|
||||
child.wait();
|
||||
|
||||
writer.save(out_file);
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user