#!/bin/env nu def elf-sections [ elf: string # ELF-file to inspect ] { LANG=C readelf --wide --sections $elf | parse -r " +\\[ *\\S+\\] +(?\\.\\S+) +(?\\S+) +0*(?\\S+) +0*(?\\S+) +0*(?\\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 " *(?\\d+): (?\\S+) +(?\\S+) +(?\\S+) +(?\\S+) +(?\\S+) +(?\\S+) (?.*)" | 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 } }