#!/bin/env nu

def elf-sections [
    elf: string # ELF-file to inspect
] {
	LANG=C readelf --wide --sections $elf |
		parse -r " +\\[ *\\S+\\] +(?<name>\\.\\S+) +(?<type>\\S+) +0*(?<addr>\\S+) +0*(?<off>\\S+) +0*(?<size>\\S+).*" |
		into int -r 16 "addr" "off" "size"

}

def elf-symbols [
    elf: string # ELF-file to inspect
	--section (-s): string
] {

	let symbols = (
		LANG=C readelf --wide --syms --demangle=rust $elf |
			tail -n +5 |
			parse -r " *(?<num>\\d+): (?<addr>\\S+) +(?<size>\\S+) +(?<type>\\S+) +(?<bind>\\S+) +(?<vis>\\S+) +(?<ndx>\\S+) (?<name>.*)" |
			into int "size" |
			into int "num" |
			into int -r 16 "addr"
	)


	if $section == null {
		$symbols
	} else {
		let section = (elf-sections $elf | where name == $section | first)
		let section_start = ($section | get addr)
		let section_end = ($section_start + ($section | get size))

		$symbols | where addr >= $section_start and addr < $section_end
	}
}
