///|
fn usage() -> Unit {
println(
"moonlink 0.2.0\n\nUsage:\n moonlink resolve [--json] ...\n moonlink version\n moonlink help\n\nThe resolve command links symbol names across ELF64 relocatable objects and prints a deterministic link map.",
)
}
///|
fn read_input(path : String) -> @lib.LinkInput {
let bytes = @fs.read_file_to_bytes(path) catch {
error => {
eprintln("moonlink: cannot read '\{path}': \{@debug.to_string(error)}")
abort("")
}
}
@lib.parse_object(path, bytes) catch {
error => {
eprintln("moonlink: '\{path}': \{error.message()}")
abort("")
}
}
}
///|
fn resolve(paths : Array[String], json_output : Bool) -> Unit {
let inputs : Array[@lib.LinkInput] = []
for path in paths {
inputs.push(read_input(path))
}
let report = @lib.resolve_objects(inputs)
if json_output {
println(report.to_json())
} else {
println(report.to_link_map())
println(report.summary())
}
if !report.is_ok() {
abort("")
}
}
///|
fn main {
let raw = @env.args()
let args : Array[String] = if raw.length() <= 1 {
[]
} else {
raw[1:].to_owned()
}
if args.is_empty() {
usage()
return
}
match args[0] {
"help" | "--help" | "-h" => usage()
"version" | "--version" | "-V" => println("moonlink 0.2.0")
"resolve" => {
let paths : Array[String] = []
let mut json_output = false
for index in 1.. {
eprintln("moonlink: unknown command '\{command}'")
usage()
abort("")
}
}
}