You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

57 lines
1.3 KiB
Rust

use std::fmt::Display;
use crate::{
common::{Output, Relocatable},
error::Error,
};
pub struct Linker<'data> {
relocatables: Vec<Box<dyn Relocatable + 'data>>,
}
impl<'data> Linker<'data> {
pub fn new(relocatables: Vec<Box<dyn Relocatable + 'data>>) -> Self {
Self { relocatables }
}
pub fn add_relocatable(&mut self, relocatable: Box<dyn Relocatable + 'data>) {
self.relocatables.push(relocatable);
}
pub fn link<'l: 'data>(&'l self, output: &mut dyn Output<'data>) -> Result<u64, Error> {
let allocated = output.allocate(self.total_size()?)?;
for r in self.relocatables.iter() {
for s in r.sections() {
output.append_section(s?)?;
}
}
Ok(allocated)
}
fn total_size(&self) -> Result<u64, Error> {
let mut result = 0u64;
for o in self.relocatables.iter() {
for s in o.sections() {
result += s?.size()?;
}
}
Ok(result)
}
}
impl Display for Linker<'_> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
writeln!(f, "===Relocatables===")?;
for r in self.relocatables.iter() {
write!(f, "{}", r)?;
}
Ok(())
}
}