#compdef elfdump

local -a args

args=(
  '-c[dump section header information]'
  '-d[dump .dynamic section]'
  '-e[dump file header]'
  '-G[dump .got (global offset table) section]'
  '-h[dump .hash section]'
  '-i[dump .interp (interpreter) section]'
  '-n[dump .note sections]'
  '(-w)-p[dump program headers]'
  '-r[dump relocation sections]'
  '-s[dump symbol table sections]'
  '(-p)-w[write contents of matched sections to file]:file:_files'
)

case $OSTYPE in
  solaris*)
    args+=(
      '-g[dump .group section]'
      '-H[dump .SUNW_cap (capabilities) section]'
      '-m[dump .SUNW_move section]'
      '-S[dump symbol table sections sorted according to symbol sort sections]'
      '-u[dump stack unwind/exceptions sections]'
      '-v[dump .SUNW_version (versioning) sections]'
      '-y[dump .SUNW_syminfo (symbol bindings) section]'
      '-I[match sections by index]:index or range'
      "-N[match sections by name]:section"
      '-T[match sections by type]:type'
      '-C[demangle C++ symbol names]'
      '-k[calculate ELF checksum]'
      '-l[show long section names without truncation]'
      '-O[specify osabi to apply]:osabi'
      '-P[use alternative section header]'
    )
  ;;
  freebsd*)
    args+=(
      '-a[dump all information]'
      '(-)-E[return success if file is an ELF file and failure if not]'
    )
  ;;
esac

_arguments -s $args \
  "*:elf file:_object_files"
