Pass relocations to the elf generator

This commit is contained in:
2024-09-02 23:45:30 +02:00
parent a66365eef4
commit 25728ddc4a
4 changed files with 184 additions and 36 deletions

View File

@ -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);
}
}