1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
|
#compdef objdump eu-objdump llvm-objdump
local curcontext="$curcontext" files variant ign ret=1
local -a opts args state state_descr line
typeset -A opt_args
files='*:object file:_object_files'
(( $#words > 2 )) && ign='!'
_pick_variant -r variant binutils=GNU elfutils=elfutils llvm=LLVM unix --version
opts=( -s -S ) # options to _arguments itself
args=(
'(-d --disassemble)'{-d,--disassemble}'[display assembler code of executable sections]'
'(-r --reloc)'{-r,--reloc}'[display relocation information]'
'(-s --full-contents)'{-s,--full-contents}'[display the full contents of all sections requested]'
\*{-j+,--section=}'[only display information for section]:section:(.bss .data .dynamic .dynsym .got .interp .shstrtab .symtab .text)'
)
case $variant in
binutils)
compset -P '@' && files='*:options file:_files'
args+=(
'!(--no-recurse-limit)--recurse-limit'
'--no-recurse-limit[disable demangling recursion limit]'
'(-a --archive-headers)'{-a,--archive-headers}'[display archive header information]'
'(-f --file-headers)'{-f,--file-headers}'[display contents of the overall file header]'
'(-p --private-headers)'{-p,--private-headers}'[display object format specific file header contents]'
\*{-P+,--private=}'[display information specific to the object format]:option'
'(-h --section-headers --headers)'{-h,--section-headers,--headers}'[display contents of the section headers]'
'(-x --all-headers)'{-x,--all-headers}'[display the contents of all headers]'
'--disassemble=[display assembler contents for specified symbol]:symbol'
'(-D --disassemble-all)'{-D,--disassemble-all}'[display assembler contents of all sections]'
'(-S --source)'{-S,--source}'[intermix source code with disassembly]'
'--source-comment=-[prefix lines of source code with specified text]::text prefix [# ]'
'(-g --debugging)'{-g,--debugging}'[display debug information in object file]'
'(-e --debugging-tags)'{-e,--debugging-tags}'[display debug information using ctags style]'
'(-G --stabs)'{-G,--stabs}'[display (in raw form) any STABS info in the file]'
'*-W-[display DWARF info in the file]::dwarf section:->short-dwarf-names'
'*--dwarf=-[display DWARF info in the file]::dwarf section:->dwarf-names'
'--ctf=[display compact C type format info for section]:section'
'(-t --syms)'{-t,--syms}'[display the contents of the symbol table(s)]'
'(-T --dynamic-syms)'{-T,--dynamic-syms}'[display the contents of the dynamic symbol table]'
'(-R --dynamic-reloc)'{-R,--dynamic-reloc}'[display the dynamic relocation entries in the file]'
"${ign}(- *)"{-v,--version}"[display version information]"
"${ign}(- *)"{-i,--info}"[list supported object formats and architectures]"
"${ign}(- *)"{-H,--help}"[display usage information]"
'(-b --target)'{-b+,--target=}'[specify the target object format]:target:->bfdnames'
'(-m --architecture)'{-m+,--architecture=}'[specify the target architecture]:architecture:->architectures'
\*{-M+,--disassembler-options=}'[pass target specific information to the disassembler]:option:->disassembler_options'
"(-E --endian)-E+[assume endianness when disassembling]:endianness:((B\:\"assume big endian format when disassembling\" L\:\"assume little endian format when disassembling\"))"
"(-E --endian)--endian=[assume endianness when disassembling]:endianness:((big\:\"assume big endian format when disassembling\" little\:\"assume little endian format when disassembling\"))"
'--file-start-context[include context from start of file (with -S)]'
\*{-I+,--include=}'[add directory to search list for source files]:directory:_files -/'
'(-l --line-numbers)'{-l,--line-numbers}'[include line numbers and filenames in output]'
'(-F --file-offsets)'{-F,--file-offsets}'[include file offsets when displaying information]'
'(-C --demangle)-C[decode mangled/processed symbol names]'
'(-C --demangle)--demangle=-[decode mangled/processed symbol names]::style:(auto gnu lucid arm hp edg gnu-v3 java gnat rust dlang)'
'!(--no-recurse-limit)--recurse-limit'
'--no-recurse-limit[disable demangling recursion limit]'
'(-w --wide)'{-w,--wide}'[format output for more than 80 columns]'
'(-z --disassemble-zeroes)'{-z,--disassemble-zeroes}"[don't skip blocks of zeroes when disassembling]"
'--start-address=[only process data whose address is >= ADDR]:address'
'--stop-address=[only process data whose address is < ADDR]:address'
"--no-addresses[don't print address alongside disassembly]"
'--prefix-addresses[print complete address alongside disassembly]'
'(--show-raw-insn --no-show-raw-insn)'--{,no-}show-raw-insn'[display hex alongside symbolic disassembly]'
'--insn-width=[display specified number of bytes on a single line with -d]:width (bytes)'
'--adjust-vma=[add offset to all displayed section addresses]:offset'
'--special-syms[include special symbols in symbol dumps]'
'--inlines[print all inlines for source line (with -l)]'
'--prefix=[add prefix to absolute paths for -S]:prefix'
'--prefix-strip=[strip initial directory names for -S]:level'
"--dwarf-depth=[don't display DIEs at specified or greater depth]:depth"
'--dwarf-start=[display DIEs at specified or deeper depth]:depth'
'--dwarf-check[perform additional dwarf internal consistency checks]'
'--ctf-parent=[use specified section as the CTF parent]:section'
'--visualize-jumps=-[visualize jumps by drawing ASCII art lines]::color:(color extended-color off)'
)
;;
elfutils)
args+=(
"--color=-[colorize the output]::when:(always auto never)"
"(- *)"{-\?,--help}"[display help]"
"(- *)--usage[display usage]"
"(- *)"{-V,--version}"[display program version]"
)
;;
llvm)
opts=( -S ) # no option stacking
args=( # start over from an empty array
'-aarch64-neon-syntax=[choose style of NEON code (AArch64)]:style:(generic apple)'
'-arch=[select arch from a fat binary (with -macho)]:architecture:(i386 x86_64)'
'-arch-name=[specify target arch to disassemble for]:architecture:->llvm_targets'
'-archive-headers[print archive headers (with -macho)]'
'-archive-member-offsets[w -macho -archive-headers: print offset to each archive member]'
'-bind[display Mach-O binding info]'
'-color[use color syntax highlighting]'
'-data-in-code[print data in code table (with -macho)]'
"-dis-symname=[disassemble just the specified symbol's instructions (with -macho)]"
'(-disassemble -d)'{-disassemble,-d}'[display assembler mnemonics for machine instructions]'
'(-disassemble-all -D)'{-disassemble-all,-D}'[disassemble all instruction sections]'
'-dsym=[use the specified .dSYM file for debug info (with -macho)]:dsym file:_files'
'-dwarf=[dump of dwarf debug section]:section:(frames)'
"-dyld-id[print the shared library's id for dylib Mach-O file (with -macho)]"
'-dylibs-used[print the shared libraries used for linked Mach-O files (with -macho)]'
'-exports-trie[display Mach-O exported symbols]'
'-fault-map-section[display contents of faultmap section]'
'-filter-print-funcs=[only print IR for the specified functions]:function names'
'-full-leading-addr[print full leading address (with -macho)]'
'-g[print line information from debug info if available (with -macho)]'
'-indirect-symbols[print indirect symbol table (with -macho)]'
'-info-plist[print the info plist section (with -macho)]'
'-lazy-bind[display Mach-O lazy binding info]'
'(-line-numbers -l)'{-line-numbers,-l}'[display source line numbers with disassembly]'
'-link-opt-hints[print the linker optimization hints (with -macho)]'
'(-macho -m)'{-macho,-m}'[use Mach-O specific object file parser]'
'*-mattr=[target specific attributes]:attributes'
'-mcpu=[specify target cpu type]:cpu type'
'-no-leading-addr[print no leading address (with -macho)]'
'-no-leading-headers[print no leading headers]'
"-no-show-raw-insn[don't print instruction bytes when disassembling]"
"-no-symbolic-operands[don't print operands symbolically when disassembling (with -macho)]"
'-non-verbose[print info in non-verbose form (with -macho)]'
'-objc-meta-data[print Objective-C runtime meta data (with -macho)]'
'-print-after-all[print IR after each pass]'
'-print-before-all[print IR before each pass]'
'-print-imm-hex[use hex format for immediate values]'
'-private-header[display only the first format specific file header]'
'(-private-headers -p)'{-private-headers,-p}'[display format specific file headers]'
'-r[display the relocation entries in the file]'
'-raw-clang-ast[dump raw binary contents of clang AST section]'
'-rebase[display Mach-O rebasing info]'
'-rng-seed=[seed for the random number generator]:seed'
'-s[display contents of each section]'
\*{-section=,-j}'[operate on the specified section only]:section'
'(-section-headers -h)'{-section-headers,-h}'[display summaries of the headers for each section]'
'(-source -S)'{-source,-S}'[display source inlined with disassembly]'
'-start-address=[start disassembly at the specified address]:address'
'-stop-address=[stop disassembly at the specified address]:address'
'-t[display the symbol table]'
'-time-passes[time each pass, print elapsed time on exit]'
'-triple=[target triple to disassemble for]:triple'
'-universal-headers[print Mach-O universal headers (with -macho)]'
'-verify-dom-info[verify dominator info (time consuming)]'
'-unwind-info[display unwind information]'
'-weak-bind[display Mach-O weak binding info]'
'-x86-asm-syntax=[choose style of assembler code (x86)]:style:(att intel)'
"${ign}(- *)-help[display available options]"
"${ign}(- *)-help-list[display list of available options]"
"${ign}(- *)-version[display version of objdump]"
)
;;
esac
_arguments $opts -C : "$args[@]" $files && ret=0
case "$state" in
short-dwarf-names)
_values -s "" "dwarf section" \
"l[rawline]" "L[decodedline]" "i[info]" "a[abbrev]" "p[pubnames]" \
"r[aranges]" "m[macro]" "f[frames]" "F[frames-interp]" "s[str]" \
'O[str-offsets]' \
"o[loc]" "R[ranges]" "t[pubtypes]" "U[trace_info]" "u[trace_abbrev]" \
"T[trace_aranges]" "g[gdb_index]" "A[addr]" "c[cu_index]" "k[links]" \
"K[follow-links]" && ret=0
;;
dwarf-names)
_sequence _wanted dwarf-sections expl "dwarf section" compadd - \
rawline decodedline info abbrev pubnames aranges macro frames \
frames-interp str str-offsets loc Ranges pubtypes gdb_index trace_info \
trace_abbrev trace_aranges addr cu_index links follow-links && ret=0
;;
bfdnames)
_wanted targets expl target compadd - \
${=${(M)${(f)"$(_call_program targets objdump --help)"}##* supported targets:*}##*: } && ret=0
;;
architectures)
_wanted architectures expl architecture compadd - \
${=${(M)${(f)"$(_call_program targets objdump --help)"}##* supported architectures:*}##*: } && ret=0
;;
disassembler_options)
_values -s , "disassembler option" "${(@)${(@)${(@M)${(f)${(ps.-M switch.)$(_call_program targets objdump --help)}[2]}:# [^ ]*}# }%% *}" && ret=0
;;
llvm_targets)
_values "target architecture" "${(z)${(@)${(f)$(_call_program targets
${~words[1]} -version)##*Registered Targets:}/ -*}}"
;;
esac
return ret
|