#![doc = include_str!("../README.md")]
use clap::Parser;
use std::path::PathBuf;
use std::process::ExitCode;
use elb::Elf;
use fs_err::File;
mod deps;
mod formatting;
mod logger;
mod patch;
mod relocate;
mod show;
use self::deps::*;
use self::formatting::*;
use self::logger::*;
use self::patch::*;
use self::relocate::*;
use self::show::*;
#[derive(clap::Parser)]
#[clap(version)]
struct Args {
#[clap(short = 'v', long = "verbose")]
verbose: bool,
#[clap(flatten)]
common: CommonArgs,
#[command(subcommand)]
command: Command,
}
#[derive(clap::Subcommand)]
enum Command {
Show(ShowArgs),
Check {
#[clap(value_name = "ELF file")]
file: PathBuf,
},
Deps(DepsArgs),
Relocate(RelocateArgs),
Patch(PatchArgs),
}
#[derive(clap::Args)]
pub struct CommonArgs {
#[clap(long = "page-size", value_name = "NUM", default_value_t = 4096)]
page_size: u64,
}
fn main() -> ExitCode {
match do_main() {
Ok(_) => ExitCode::SUCCESS,
Err(e) => {
eprintln!("{e}");
ExitCode::FAILURE
}
}
}
fn do_main() -> Result<(), Box<dyn std::error::Error>> {
let args = Args::parse();
Logger::init(args.verbose)?;
match args.command {
Command::Show(show_args) => show(args.common, show_args),
Command::Check { file } => check(args.common, file),
Command::Deps(deps_args) => deps(args.common, deps_args),
Command::Relocate(relocate_args) => relocate(args.common, relocate_args),
Command::Patch(patch_args) => patch(args.common, patch_args),
}
}
fn check(common: CommonArgs, file: PathBuf) -> Result<(), Box<dyn std::error::Error>> {
let mut file = File::open(&file)?;
let _elf = Elf::read(&mut file, common.page_size)?;
Ok(())
}