xref: /netbsd-src/external/gpl3/binutils.old/dist/binutils/od-macho.c (revision 82d56013d7b633d116a93943de88e08335357a7c)
1 /* od-macho.c -- dump information about an Mach-O object file.
2    Copyright (C) 2011-2018 Free Software Foundation, Inc.
3    Written by Tristan Gingold, Adacore.
4 
5    This file is part of GNU Binutils.
6 
7    This program is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 3, or (at your option)
10    any later version.
11 
12    This program is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16 
17    You should have received a copy of the GNU General Public License
18    along with this program; if not, write to the Free Software
19    Foundation, 51 Franklin Street - Fifth Floor, Boston,
20    MA 02110-1301, USA.  */
21 
22 #include "sysdep.h"
23 #include <stddef.h>
24 #include <time.h>
25 #include "safe-ctype.h"
26 #include "bfd.h"
27 #include "objdump.h"
28 #include "bucomm.h"
29 #include "dwarf.h"
30 #include "bfdlink.h"
31 #include "mach-o.h"
32 #include "mach-o/external.h"
33 #include "mach-o/codesign.h"
34 #include "mach-o/unwind.h"
35 
36 /* Index of the options in the options[] array.  */
37 #define OPT_HEADER 0
38 #define OPT_SECTION 1
39 #define OPT_MAP 2
40 #define OPT_LOAD 3
41 #define OPT_DYSYMTAB 4
42 #define OPT_CODESIGN 5
43 #define OPT_SEG_SPLIT_INFO 6
44 #define OPT_COMPACT_UNWIND 7
45 #define OPT_FUNCTION_STARTS 8
46 #define OPT_DATA_IN_CODE 9
47 #define OPT_TWOLEVEL_HINTS 10
48 #define OPT_DYLD_INFO 11
49 
50 /* List of actions.  */
51 static struct objdump_private_option options[] =
52   {
53     { "header", 0 },
54     { "section", 0 },
55     { "map", 0 },
56     { "load", 0 },
57     { "dysymtab", 0 },
58     { "codesign", 0 },
59     { "seg_split_info", 0 },
60     { "compact_unwind", 0 },
61     { "function_starts", 0 },
62     { "data_in_code", 0 },
63     { "twolevel_hints", 0 },
64     { "dyld_info", 0 },
65     { NULL, 0 }
66   };
67 
68 /* Display help.  */
69 
70 static void
71 mach_o_help (FILE *stream)
72 {
73   fprintf (stream, _("\
74 For Mach-O files:\n\
75   header           Display the file header\n\
76   section          Display the segments and sections commands\n\
77   map              Display the section map\n\
78   load             Display the load commands\n\
79   dysymtab         Display the dynamic symbol table\n\
80   codesign         Display code signature\n\
81   seg_split_info   Display segment split info\n\
82   compact_unwind   Display compact unwinding info\n\
83   function_starts  Display start address of functions\n\
84   data_in_code     Display data in code entries\n\
85   twolevel_hints   Display the two-level namespace lookup hints table\n\
86   dyld_info        Display dyld information\n\
87 "));
88 }
89 
90 /* Return TRUE if ABFD is handled.  */
91 
92 static int
93 mach_o_filter (bfd *abfd)
94 {
95   return bfd_get_flavour (abfd) == bfd_target_mach_o_flavour;
96 }
97 
98 static const bfd_mach_o_xlat_name bfd_mach_o_cpu_name[] =
99 {
100   { "vax", BFD_MACH_O_CPU_TYPE_VAX },
101   { "mc680x0", BFD_MACH_O_CPU_TYPE_MC680x0 },
102   { "i386", BFD_MACH_O_CPU_TYPE_I386 },
103   { "mips", BFD_MACH_O_CPU_TYPE_MIPS },
104   { "mc98000", BFD_MACH_O_CPU_TYPE_MC98000 },
105   { "hppa", BFD_MACH_O_CPU_TYPE_HPPA },
106   { "arm", BFD_MACH_O_CPU_TYPE_ARM },
107   { "mc88000", BFD_MACH_O_CPU_TYPE_MC88000 },
108   { "sparc", BFD_MACH_O_CPU_TYPE_SPARC },
109   { "alpha", BFD_MACH_O_CPU_TYPE_ALPHA },
110   { "powerpc", BFD_MACH_O_CPU_TYPE_POWERPC },
111   { "powerpc_64", BFD_MACH_O_CPU_TYPE_POWERPC_64 },
112   { "x86_64", BFD_MACH_O_CPU_TYPE_X86_64 },
113   { "arm64", BFD_MACH_O_CPU_TYPE_ARM64 },
114   { NULL, 0}
115 };
116 
117 static const bfd_mach_o_xlat_name bfd_mach_o_filetype_name[] =
118 {
119   { "object", BFD_MACH_O_MH_OBJECT },
120   { "execute", BFD_MACH_O_MH_EXECUTE },
121   { "fvmlib", BFD_MACH_O_MH_FVMLIB },
122   { "core", BFD_MACH_O_MH_CORE },
123   { "preload", BFD_MACH_O_MH_PRELOAD },
124   { "dylib", BFD_MACH_O_MH_DYLIB },
125   { "dylinker", BFD_MACH_O_MH_DYLINKER },
126   { "bundle", BFD_MACH_O_MH_BUNDLE },
127   { "dylib_stub", BFD_MACH_O_MH_DYLIB_STUB },
128   { "dym", BFD_MACH_O_MH_DSYM },
129   { "kext_bundle", BFD_MACH_O_MH_KEXT_BUNDLE },
130   { NULL, 0}
131 };
132 
133 static const bfd_mach_o_xlat_name bfd_mach_o_header_flags_name[] =
134 {
135   { "noundefs", BFD_MACH_O_MH_NOUNDEFS },
136   { "incrlink", BFD_MACH_O_MH_INCRLINK },
137   { "dyldlink", BFD_MACH_O_MH_DYLDLINK },
138   { "bindatload", BFD_MACH_O_MH_BINDATLOAD },
139   { "prebound", BFD_MACH_O_MH_PREBOUND },
140   { "split_segs", BFD_MACH_O_MH_SPLIT_SEGS },
141   { "lazy_init", BFD_MACH_O_MH_LAZY_INIT },
142   { "twolevel", BFD_MACH_O_MH_TWOLEVEL },
143   { "force_flat", BFD_MACH_O_MH_FORCE_FLAT },
144   { "nomultidefs", BFD_MACH_O_MH_NOMULTIDEFS },
145   { "nofixprebinding", BFD_MACH_O_MH_NOFIXPREBINDING },
146   { "prebindable", BFD_MACH_O_MH_PREBINDABLE },
147   { "allmodsbound", BFD_MACH_O_MH_ALLMODSBOUND },
148   { "subsections_via_symbols", BFD_MACH_O_MH_SUBSECTIONS_VIA_SYMBOLS },
149   { "canonical", BFD_MACH_O_MH_CANONICAL },
150   { "weak_defines", BFD_MACH_O_MH_WEAK_DEFINES },
151   { "binds_to_weak", BFD_MACH_O_MH_BINDS_TO_WEAK },
152   { "allow_stack_execution", BFD_MACH_O_MH_ALLOW_STACK_EXECUTION },
153   { "root_safe", BFD_MACH_O_MH_ROOT_SAFE },
154   { "setuid_safe", BFD_MACH_O_MH_SETUID_SAFE },
155   { "no_reexported_dylibs", BFD_MACH_O_MH_NO_REEXPORTED_DYLIBS },
156   { "pie", BFD_MACH_O_MH_PIE },
157   { "dead_strippable_dylib", BFD_MACH_O_MH_DEAD_STRIPPABLE_DYLIB },
158   { "has_tlv", BFD_MACH_O_MH_HAS_TLV_DESCRIPTORS },
159   { "no_heap_execution", BFD_MACH_O_MH_NO_HEAP_EXECUTION },
160   { "app_extension_safe", BFD_MACH_O_MH_APP_EXTENSION_SAFE },
161   { NULL, 0}
162 };
163 
164 static const bfd_mach_o_xlat_name bfd_mach_o_load_command_name[] =
165 {
166   { "segment", BFD_MACH_O_LC_SEGMENT},
167   { "symtab", BFD_MACH_O_LC_SYMTAB},
168   { "symseg", BFD_MACH_O_LC_SYMSEG},
169   { "thread", BFD_MACH_O_LC_THREAD},
170   { "unixthread", BFD_MACH_O_LC_UNIXTHREAD},
171   { "loadfvmlib", BFD_MACH_O_LC_LOADFVMLIB},
172   { "idfvmlib", BFD_MACH_O_LC_IDFVMLIB},
173   { "ident", BFD_MACH_O_LC_IDENT},
174   { "fvmfile", BFD_MACH_O_LC_FVMFILE},
175   { "prepage", BFD_MACH_O_LC_PREPAGE},
176   { "dysymtab", BFD_MACH_O_LC_DYSYMTAB},
177   { "load_dylib", BFD_MACH_O_LC_LOAD_DYLIB},
178   { "id_dylib", BFD_MACH_O_LC_ID_DYLIB},
179   { "load_dylinker", BFD_MACH_O_LC_LOAD_DYLINKER},
180   { "id_dylinker", BFD_MACH_O_LC_ID_DYLINKER},
181   { "prebound_dylib", BFD_MACH_O_LC_PREBOUND_DYLIB},
182   { "routines", BFD_MACH_O_LC_ROUTINES},
183   { "sub_framework", BFD_MACH_O_LC_SUB_FRAMEWORK},
184   { "sub_umbrella", BFD_MACH_O_LC_SUB_UMBRELLA},
185   { "sub_client", BFD_MACH_O_LC_SUB_CLIENT},
186   { "sub_library", BFD_MACH_O_LC_SUB_LIBRARY},
187   { "twolevel_hints", BFD_MACH_O_LC_TWOLEVEL_HINTS},
188   { "prebind_cksum", BFD_MACH_O_LC_PREBIND_CKSUM},
189   { "load_weak_dylib", BFD_MACH_O_LC_LOAD_WEAK_DYLIB},
190   { "segment_64", BFD_MACH_O_LC_SEGMENT_64},
191   { "routines_64", BFD_MACH_O_LC_ROUTINES_64},
192   { "uuid", BFD_MACH_O_LC_UUID},
193   { "rpath", BFD_MACH_O_LC_RPATH},
194   { "code_signature", BFD_MACH_O_LC_CODE_SIGNATURE},
195   { "segment_split_info", BFD_MACH_O_LC_SEGMENT_SPLIT_INFO},
196   { "reexport_dylib", BFD_MACH_O_LC_REEXPORT_DYLIB},
197   { "lazy_load_dylib", BFD_MACH_O_LC_LAZY_LOAD_DYLIB},
198   { "encryption_info", BFD_MACH_O_LC_ENCRYPTION_INFO},
199   { "dyld_info", BFD_MACH_O_LC_DYLD_INFO},
200   { "load_upward_lib", BFD_MACH_O_LC_LOAD_UPWARD_DYLIB},
201   { "version_min_macosx", BFD_MACH_O_LC_VERSION_MIN_MACOSX},
202   { "version_min_iphoneos", BFD_MACH_O_LC_VERSION_MIN_IPHONEOS},
203   { "function_starts", BFD_MACH_O_LC_FUNCTION_STARTS},
204   { "dyld_environment", BFD_MACH_O_LC_DYLD_ENVIRONMENT},
205   { "main", BFD_MACH_O_LC_MAIN},
206   { "data_in_code", BFD_MACH_O_LC_DATA_IN_CODE},
207   { "source_version", BFD_MACH_O_LC_SOURCE_VERSION},
208   { "dylib_code_sign_drs", BFD_MACH_O_LC_DYLIB_CODE_SIGN_DRS},
209   { "encryption_info_64", BFD_MACH_O_LC_ENCRYPTION_INFO_64},
210   { "linker_options", BFD_MACH_O_LC_LINKER_OPTIONS},
211   { "linker_optimization_hint", BFD_MACH_O_LC_LINKER_OPTIMIZATION_HINT},
212   { NULL, 0}
213 };
214 
215 static const bfd_mach_o_xlat_name bfd_mach_o_thread_x86_name[] =
216 {
217   { "thread_state32", BFD_MACH_O_x86_THREAD_STATE32},
218   { "float_state32", BFD_MACH_O_x86_FLOAT_STATE32},
219   { "exception_state32", BFD_MACH_O_x86_EXCEPTION_STATE32},
220   { "thread_state64", BFD_MACH_O_x86_THREAD_STATE64},
221   { "float_state64", BFD_MACH_O_x86_FLOAT_STATE64},
222   { "exception_state64", BFD_MACH_O_x86_EXCEPTION_STATE64},
223   { "thread_state", BFD_MACH_O_x86_THREAD_STATE},
224   { "float_state", BFD_MACH_O_x86_FLOAT_STATE},
225   { "exception_state", BFD_MACH_O_x86_EXCEPTION_STATE},
226   { "debug_state32", BFD_MACH_O_x86_DEBUG_STATE32},
227   { "debug_state64", BFD_MACH_O_x86_DEBUG_STATE64},
228   { "debug_state", BFD_MACH_O_x86_DEBUG_STATE},
229   { "state_none", BFD_MACH_O_x86_THREAD_STATE_NONE},
230   { NULL, 0 }
231 };
232 
233 static void
234 bfd_mach_o_print_flags (const bfd_mach_o_xlat_name *table,
235                         unsigned long val)
236 {
237   int first = 1;
238 
239   for (; table->name; table++)
240     {
241       if (table->val & val)
242         {
243           if (!first)
244             printf ("+");
245           printf ("%s", table->name);
246           val &= ~table->val;
247           first = 0;
248         }
249     }
250   if (val)
251     {
252       if (!first)
253         printf ("+");
254       printf ("0x%lx", val);
255       return;
256     }
257   if (first)
258     printf ("-");
259 }
260 
261 /* Print a bfd_uint64_t, using a platform independent style.  */
262 
263 static void
264 printf_uint64 (bfd_uint64_t v)
265 {
266   printf ("0x%08lx%08lx",
267 	  (unsigned long)((v >> 16) >> 16), (unsigned long)(v & 0xffffffffUL));
268 }
269 
270 static const char *
271 bfd_mach_o_get_name_or_null (const bfd_mach_o_xlat_name *table,
272                              unsigned long val)
273 {
274   for (; table->name; table++)
275     if (table->val == val)
276       return table->name;
277   return NULL;
278 }
279 
280 static const char *
281 bfd_mach_o_get_name (const bfd_mach_o_xlat_name *table, unsigned long val)
282 {
283   const char *res = bfd_mach_o_get_name_or_null (table, val);
284 
285   if (res == NULL)
286     return "*UNKNOWN*";
287   else
288     return res;
289 }
290 
291 static void
292 dump_header (bfd *abfd)
293 {
294   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
295   bfd_mach_o_header *h = &mdata->header;
296 
297   fputs (_("Mach-O header:\n"), stdout);
298   printf (_(" magic     : %08lx\n"), h->magic);
299   printf (_(" cputype   : %08lx (%s)\n"), h->cputype,
300           bfd_mach_o_get_name (bfd_mach_o_cpu_name, h->cputype));
301   printf (_(" cpusubtype: %08lx\n"), h->cpusubtype);
302   printf (_(" filetype  : %08lx (%s)\n"),
303           h->filetype,
304           bfd_mach_o_get_name (bfd_mach_o_filetype_name, h->filetype));
305   printf (_(" ncmds     : %08lx (%lu)\n"), h->ncmds, h->ncmds);
306   printf (_(" sizeofcmds: %08lx (%lu)\n"), h->sizeofcmds, h->sizeofcmds);
307   printf (_(" flags     : %08lx ("), h->flags);
308   bfd_mach_o_print_flags (bfd_mach_o_header_flags_name, h->flags);
309   fputs (_(")\n"), stdout);
310   printf (_(" reserved  : %08x\n"), h->reserved);
311   putchar ('\n');
312 }
313 
314 static void
315 disp_segment_prot (unsigned int prot)
316 {
317   putchar (prot & BFD_MACH_O_PROT_READ ? 'r' : '-');
318   putchar (prot & BFD_MACH_O_PROT_WRITE ? 'w' : '-');
319   putchar (prot & BFD_MACH_O_PROT_EXECUTE ? 'x' : '-');
320 }
321 
322 static void
323 dump_section_map (bfd *abfd)
324 {
325   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
326   bfd_mach_o_load_command *cmd;
327   unsigned int sec_nbr = 0;
328 
329   fputs (_("Segments and Sections:\n"), stdout);
330   fputs (_(" #: Segment name     Section name     Address\n"), stdout);
331 
332   for (cmd = mdata->first_command; cmd != NULL; cmd = cmd->next)
333     {
334       bfd_mach_o_segment_command *seg;
335       bfd_mach_o_section *sec;
336 
337       if (cmd->type != BFD_MACH_O_LC_SEGMENT
338 	  && cmd->type != BFD_MACH_O_LC_SEGMENT_64)
339 	continue;
340 
341       seg = &cmd->command.segment;
342 
343       printf ("[Segment %-16s ", seg->segname);
344       printf_vma (seg->vmaddr);
345       putchar ('-');
346       printf_vma  (seg->vmaddr + seg->vmsize - 1);
347       putchar (' ');
348       disp_segment_prot (seg->initprot);
349       printf ("]\n");
350 
351       for (sec = seg->sect_head; sec != NULL; sec = sec->next)
352 	{
353 	  printf ("%02u: %-16s %-16s ", ++sec_nbr,
354                   sec->segname, sec->sectname);
355 	  printf_vma (sec->addr);
356 	  putchar (' ');
357 	  printf_vma  (sec->size);
358 	  printf (" %08lx\n", sec->flags);
359 	}
360     }
361 }
362 
363 static void
364 dump_section_header (bfd *abfd ATTRIBUTE_UNUSED, bfd_mach_o_section *sec)
365 {
366   printf (" Section: %-16s %-16s (bfdname: %s)\n",
367            sec->sectname, sec->segname, sec->bfdsection->name);
368   printf ("  addr: ");
369   printf_vma (sec->addr);
370   printf (" size: ");
371   printf_vma (sec->size);
372   printf (" offset: ");
373   printf_vma (sec->offset);
374   printf ("\n");
375   printf ("  align: %ld", sec->align);
376   printf ("  nreloc: %lu  reloff: ", sec->nreloc);
377   printf_vma (sec->reloff);
378   printf ("\n");
379   printf ("  flags: %08lx (type: %s", sec->flags,
380           bfd_mach_o_get_name (bfd_mach_o_section_type_name,
381                                sec->flags & BFD_MACH_O_SECTION_TYPE_MASK));
382   printf (" attr: ");
383   bfd_mach_o_print_flags (bfd_mach_o_section_attribute_name,
384                           sec->flags & BFD_MACH_O_SECTION_ATTRIBUTES_MASK);
385   printf (")\n");
386   switch (sec->flags & BFD_MACH_O_SECTION_TYPE_MASK)
387     {
388     case BFD_MACH_O_S_NON_LAZY_SYMBOL_POINTERS:
389     case BFD_MACH_O_S_LAZY_SYMBOL_POINTERS:
390     case BFD_MACH_O_S_SYMBOL_STUBS:
391       printf ("  first indirect sym: %lu", sec->reserved1);
392       printf (" (%u entries)",
393                bfd_mach_o_section_get_nbr_indirect (abfd, sec));
394       break;
395     default:
396       printf ("  reserved1: 0x%lx", sec->reserved1);
397       break;
398     }
399   switch (sec->flags & BFD_MACH_O_SECTION_TYPE_MASK)
400     {
401     case BFD_MACH_O_S_SYMBOL_STUBS:
402       printf ("  stub size: %lu", sec->reserved2);
403       break;
404     default:
405       printf ("  reserved2: 0x%lx", sec->reserved2);
406       break;
407     }
408   printf ("  reserved3: 0x%lx\n", sec->reserved3);
409 }
410 
411 static void
412 dump_segment (bfd *abfd ATTRIBUTE_UNUSED, bfd_mach_o_load_command *cmd)
413 {
414   bfd_mach_o_segment_command *seg = &cmd->command.segment;
415   bfd_mach_o_section *sec;
416 
417   printf ("     name: %16s", *seg->segname ? seg->segname : "*none*");
418   printf ("  nsects: %lu", seg->nsects);
419   printf ("  flags: %lx", seg->flags);
420   printf ("  initprot: ");
421   disp_segment_prot (seg->initprot);
422   printf ("  maxprot: ");
423   disp_segment_prot (seg->maxprot);
424   printf ("\n");
425   printf ("   vmaddr: ");
426   printf_vma (seg->vmaddr);
427   printf ("   vmsize: ");
428   printf_vma  (seg->vmsize);
429   printf ("\n");
430   printf ("  fileoff: ");
431   printf_vma (seg->fileoff);
432   printf (" filesize: ");
433   printf_vma ((bfd_vma)seg->filesize);
434   printf (" endoff: ");
435   printf_vma ((bfd_vma)(seg->fileoff + seg->filesize));
436   printf ("\n");
437   for (sec = seg->sect_head; sec != NULL; sec = sec->next)
438     dump_section_header (abfd, sec);
439 }
440 
441 static void
442 dump_dysymtab (bfd *abfd, bfd_mach_o_load_command *cmd, bfd_boolean verbose)
443 {
444   bfd_mach_o_dysymtab_command *dysymtab = &cmd->command.dysymtab;
445   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
446   unsigned int i;
447 
448   printf ("              local symbols: idx: %10lu  num: %-8lu",
449           dysymtab->ilocalsym, dysymtab->nlocalsym);
450   printf (" (nxtidx: %lu)\n",
451           dysymtab->ilocalsym + dysymtab->nlocalsym);
452   printf ("           external symbols: idx: %10lu  num: %-8lu",
453           dysymtab->iextdefsym, dysymtab->nextdefsym);
454   printf (" (nxtidx: %lu)\n",
455           dysymtab->iextdefsym + dysymtab->nextdefsym);
456   printf ("          undefined symbols: idx: %10lu  num: %-8lu",
457           dysymtab->iundefsym, dysymtab->nundefsym);
458   printf (" (nxtidx: %lu)\n",
459           dysymtab->iundefsym + dysymtab->nundefsym);
460   printf ("           table of content: off: 0x%08lx  num: %-8lu",
461           dysymtab->tocoff, dysymtab->ntoc);
462   printf (" (endoff: 0x%08lx)\n",
463           dysymtab->tocoff + dysymtab->ntoc * BFD_MACH_O_TABLE_OF_CONTENT_SIZE);
464   printf ("               module table: off: 0x%08lx  num: %-8lu",
465           dysymtab->modtaboff, dysymtab->nmodtab);
466   printf (" (endoff: 0x%08lx)\n",
467           dysymtab->modtaboff + dysymtab->nmodtab
468           * (mdata->header.version == 2 ?
469              BFD_MACH_O_DYLIB_MODULE_64_SIZE : BFD_MACH_O_DYLIB_MODULE_SIZE));
470   printf ("   external reference table: off: 0x%08lx  num: %-8lu",
471           dysymtab->extrefsymoff, dysymtab->nextrefsyms);
472   printf (" (endoff: 0x%08lx)\n",
473           dysymtab->extrefsymoff
474           + dysymtab->nextrefsyms * BFD_MACH_O_REFERENCE_SIZE);
475   printf ("      indirect symbol table: off: 0x%08lx  num: %-8lu",
476           dysymtab->indirectsymoff, dysymtab->nindirectsyms);
477   printf (" (endoff: 0x%08lx)\n",
478           dysymtab->indirectsymoff
479           + dysymtab->nindirectsyms * BFD_MACH_O_INDIRECT_SYMBOL_SIZE);
480   printf ("  external relocation table: off: 0x%08lx  num: %-8lu",
481           dysymtab->extreloff, dysymtab->nextrel);
482   printf (" (endoff: 0x%08lx)\n",
483           dysymtab->extreloff + dysymtab->nextrel * BFD_MACH_O_RELENT_SIZE);
484   printf ("     local relocation table: off: 0x%08lx  num: %-8lu",
485           dysymtab->locreloff, dysymtab->nlocrel);
486   printf (" (endoff: 0x%08lx)\n",
487           dysymtab->locreloff + dysymtab->nlocrel * BFD_MACH_O_RELENT_SIZE);
488 
489   if (!verbose)
490     return;
491 
492   if (dysymtab->ntoc > 0
493       || dysymtab->nindirectsyms > 0
494       || dysymtab->nextrefsyms > 0)
495     {
496       /* Try to read the symbols to display the toc or indirect symbols.  */
497       bfd_mach_o_read_symtab_symbols (abfd);
498     }
499   else if (dysymtab->nmodtab > 0)
500     {
501       /* Try to read the strtab to display modules name.  */
502       bfd_mach_o_read_symtab_strtab (abfd);
503     }
504 
505   for (i = 0; i < dysymtab->nmodtab; i++)
506     {
507       bfd_mach_o_dylib_module *module = &dysymtab->dylib_module[i];
508       printf ("  module %u:\n", i);
509       printf ("   name: %lu", module->module_name_idx);
510       if (mdata->symtab && mdata->symtab->strtab)
511         printf (": %s",
512                  mdata->symtab->strtab + module->module_name_idx);
513       printf ("\n");
514       printf ("   extdefsym: idx: %8lu  num: %lu\n",
515                module->iextdefsym, module->nextdefsym);
516       printf ("      refsym: idx: %8lu  num: %lu\n",
517                module->irefsym, module->nrefsym);
518       printf ("    localsym: idx: %8lu  num: %lu\n",
519                module->ilocalsym, module->nlocalsym);
520       printf ("      extrel: idx: %8lu  num: %lu\n",
521                module->iextrel, module->nextrel);
522       printf ("        init: idx: %8u  num: %u\n",
523                module->iinit, module->ninit);
524       printf ("        term: idx: %8u  num: %u\n",
525                module->iterm, module->nterm);
526       printf ("   objc_module_info: addr: ");
527       printf_vma (module->objc_module_info_addr);
528       printf ("  size: %lu\n", module->objc_module_info_size);
529     }
530 
531   if (dysymtab->ntoc > 0)
532     {
533       bfd_mach_o_symtab_command *symtab = mdata->symtab;
534 
535       printf ("  table of content: (symbol/module)\n");
536       for (i = 0; i < dysymtab->ntoc; i++)
537         {
538           bfd_mach_o_dylib_table_of_content *toc = &dysymtab->dylib_toc[i];
539 
540           printf ("   %4u: ", i);
541           if (symtab && symtab->symbols && toc->symbol_index < symtab->nsyms)
542             {
543               const char *name = symtab->symbols[toc->symbol_index].symbol.name;
544               printf ("%s (%lu)", name ? name : "*invalid*",
545                        toc->symbol_index);
546             }
547           else
548             printf ("%lu", toc->symbol_index);
549 
550           printf (" / ");
551           if (symtab && symtab->strtab
552               && toc->module_index < dysymtab->nmodtab)
553             {
554               bfd_mach_o_dylib_module *mod;
555               mod = &dysymtab->dylib_module[toc->module_index];
556               printf ("%s (%lu)",
557                        symtab->strtab + mod->module_name_idx,
558                        toc->module_index);
559             }
560           else
561             printf ("%lu", toc->module_index);
562 
563           printf ("\n");
564         }
565     }
566 
567   if (dysymtab->nindirectsyms != 0)
568     {
569       printf ("  indirect symbols:\n");
570 
571       for (i = 0; i < mdata->nsects; i++)
572         {
573           bfd_mach_o_section *sec = mdata->sections[i];
574           unsigned int j, first, last;
575           bfd_mach_o_symtab_command *symtab = mdata->symtab;
576           bfd_vma addr;
577           bfd_vma entry_size;
578 
579           switch (sec->flags & BFD_MACH_O_SECTION_TYPE_MASK)
580             {
581             case BFD_MACH_O_S_NON_LAZY_SYMBOL_POINTERS:
582             case BFD_MACH_O_S_LAZY_SYMBOL_POINTERS:
583             case BFD_MACH_O_S_SYMBOL_STUBS:
584               first = sec->reserved1;
585               last = first + bfd_mach_o_section_get_nbr_indirect (abfd, sec);
586               addr = sec->addr;
587               entry_size = bfd_mach_o_section_get_entry_size (abfd, sec);
588               printf ("  for section %s.%s:\n",
589                        sec->segname, sec->sectname);
590               for (j = first; j < last; j++)
591                 {
592                   unsigned int isym = dysymtab->indirect_syms[j];
593 
594                   printf ("   ");
595                   printf_vma (addr);
596                   printf (" %5u: 0x%08x", j, isym);
597                   if (isym & BFD_MACH_O_INDIRECT_SYMBOL_LOCAL)
598                     printf (" LOCAL");
599                   if (isym & BFD_MACH_O_INDIRECT_SYMBOL_ABS)
600                     printf (" ABSOLUTE");
601                   if (symtab && symtab->symbols
602                       && isym < symtab->nsyms
603                       && symtab->symbols[isym].symbol.name)
604                     printf (" %s", symtab->symbols[isym].symbol.name);
605                   printf ("\n");
606                   addr += entry_size;
607                 }
608               break;
609             default:
610               break;
611             }
612         }
613     }
614   if (dysymtab->nextrefsyms > 0)
615     {
616       bfd_mach_o_symtab_command *symtab = mdata->symtab;
617 
618       printf ("  external reference table: (symbol flags)\n");
619       for (i = 0; i < dysymtab->nextrefsyms; i++)
620         {
621           bfd_mach_o_dylib_reference *ref = &dysymtab->ext_refs[i];
622 
623           printf ("   %4u: %5lu 0x%02lx", i, ref->isym, ref->flags);
624           if (symtab && symtab->symbols
625               && ref->isym < symtab->nsyms
626               && symtab->symbols[ref->isym].symbol.name)
627             printf (" %s", symtab->symbols[ref->isym].symbol.name);
628           printf ("\n");
629         }
630     }
631 
632 }
633 
634 static bfd_boolean
635 load_and_dump (bfd *abfd, ufile_ptr off, unsigned int len,
636 	       void (*dump)(bfd *abfd, unsigned char *buf, unsigned int len,
637 			    ufile_ptr off))
638 {
639   unsigned char *buf;
640 
641   if (len == 0)
642     return TRUE;
643 
644   buf = xmalloc (len);
645 
646   if (bfd_seek (abfd, off, SEEK_SET) == 0
647       && bfd_bread (buf, len, abfd) == len)
648     dump (abfd, buf, len, off);
649   else
650     return FALSE;
651 
652   free (buf);
653   return TRUE;
654 }
655 
656 static const bfd_mach_o_xlat_name bfd_mach_o_dyld_rebase_type_name[] =
657 {
658   { "pointer",      BFD_MACH_O_REBASE_TYPE_POINTER },
659   { "text_abs32",   BFD_MACH_O_REBASE_TYPE_TEXT_ABSOLUTE32 },
660   { "text_pcrel32", BFD_MACH_O_REBASE_TYPE_TEXT_PCREL32 },
661   { NULL, 0 }
662 };
663 
664 static void
665 dump_dyld_info_rebase (bfd *abfd, unsigned char *buf, unsigned int len,
666 		       ufile_ptr off ATTRIBUTE_UNUSED)
667 {
668   unsigned int i;
669   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
670   unsigned int ptrsize = mdata->header.version == 2 ? 8 : 4;
671 
672   for (i = 0; i < len; )
673     {
674       unsigned char b = buf[i++];
675       unsigned char imm = b & BFD_MACH_O_REBASE_IMMEDIATE_MASK;
676       bfd_vma leb;
677       unsigned int leblen;
678 
679       printf ("   [0x%04x] 0x%02x: ", i, b);
680       switch (b & BFD_MACH_O_REBASE_OPCODE_MASK)
681 	{
682 	case BFD_MACH_O_REBASE_OPCODE_DONE:
683 	  printf ("done\n");
684 	  return;
685 	case BFD_MACH_O_REBASE_OPCODE_SET_TYPE_IMM:
686 	  printf ("set_type %s\n",
687 		  bfd_mach_o_get_name (bfd_mach_o_dyld_rebase_type_name, imm));
688 	  break;
689 	case BFD_MACH_O_REBASE_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB:
690 	  leb = read_leb128 (buf + i, &leblen, 0, buf + len);
691 	  printf ("set segment: %u and offset: 0x%08x\n",
692 		  imm, (unsigned) leb);
693 	  i += leblen;
694 	  break;
695 	case BFD_MACH_O_REBASE_OPCODE_ADD_ADDR_ULEB:
696 	  leb = read_leb128 (buf + i, &leblen, 0, buf + len);
697 	  printf ("add addr uleb: 0x%08x\n", (unsigned) leb);
698 	  i += leblen;
699 	  break;
700 	case BFD_MACH_O_REBASE_OPCODE_ADD_ADDR_IMM_SCALED:
701 	  printf ("add addr imm scaled: %u\n", imm * ptrsize);
702 	  break;
703 	case BFD_MACH_O_REBASE_OPCODE_DO_REBASE_IMM_TIMES:
704 	  printf ("rebase imm times: %u\n", imm);
705 	  break;
706 	case BFD_MACH_O_REBASE_OPCODE_DO_REBASE_ULEB_TIMES:
707 	  leb = read_leb128 (buf + i, &leblen, 0, buf + len);
708 	  printf ("rebase uleb times: %u\n", (unsigned) leb);
709 	  i += leblen;
710 	  break;
711 	case BFD_MACH_O_REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB:
712 	  leb = read_leb128 (buf + i, &leblen, 0, buf + len);
713 	  printf ("rebase add addr uleb: %u\n", (unsigned) leb);
714 	  i += leblen;
715 	  break;
716 	case BFD_MACH_O_REBASE_OPCODE_DO_REBASE_ULEB_TIMES_SKIPPING_ULEB:
717 	  leb = read_leb128 (buf + i, &leblen, 0, buf + len);
718 	  printf ("rebase uleb times (%u)", (unsigned) leb);
719 	  i += leblen;
720 	  leb = read_leb128 (buf + i, &leblen, 0, buf + len);
721 	  printf (" skipping uleb (%u)\n", (unsigned) leb);
722 	  i += leblen;
723 	  break;
724 	default:
725 	  printf ("unknown\n");
726 	  return;
727 	}
728     }
729   printf ("   rebase commands without end!\n");
730 }
731 
732 static void
733 dump_dyld_info_bind (bfd *abfd, unsigned char *buf, unsigned int len,
734 		     ufile_ptr off ATTRIBUTE_UNUSED)
735 {
736   unsigned int i;
737   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
738   unsigned int ptrsize = mdata->header.version == 2 ? 8 : 4;
739 
740   for (i = 0; i < len; )
741     {
742       unsigned char b = buf[i++];
743       unsigned char imm = b & BFD_MACH_O_BIND_IMMEDIATE_MASK;
744       bfd_vma leb;
745       unsigned int leblen;
746 
747       printf ("   [0x%04x] 0x%02x: ", i, b);
748       switch (b & BFD_MACH_O_BIND_OPCODE_MASK)
749 	{
750 	case BFD_MACH_O_BIND_OPCODE_DONE:
751 	  printf ("done\n");
752 	  return;
753 	case BFD_MACH_O_BIND_OPCODE_SET_DYLIB_ORDINAL_IMM:
754 	  printf ("set dylib ordinal imm: %u\n", imm);
755 	  break;
756 	case BFD_MACH_O_BIND_OPCODE_SET_DYLIB_ORDINAL_ULEB:
757 	  leb = read_leb128 (buf + i, &leblen, 0, buf + len);
758 	  printf ("set dylib ordinal uleb: %u\n", imm);
759 	  i += leblen;
760 	  break;
761 	case BFD_MACH_O_BIND_OPCODE_SET_DYLIB_SPECIAL_IMM:
762 	  imm = (imm != 0) ? imm | BFD_MACH_O_BIND_OPCODE_MASK : imm;
763 	  printf ("set dylib special imm: %d\n", imm);
764 	  break;
765 	case BFD_MACH_O_BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM:
766 	  printf ("set symbol trailing flags imm: 0x%02x, ", imm);
767 	  for (; i < len && buf[i] != 0; i++)
768 	    putchar (buf[i] >= ' ' && buf[i] < 0x7f ? buf[i] : '?');
769 	  putchar ('\n');
770 	  i++;
771 	  break;
772 	case BFD_MACH_O_BIND_OPCODE_SET_TYPE_IMM:
773 	  /* Kludge: use the same table as rebase type.  */
774 	  printf ("set_type %s\n",
775 		  bfd_mach_o_get_name (bfd_mach_o_dyld_rebase_type_name, imm));
776 	  break;
777 	case BFD_MACH_O_BIND_OPCODE_SET_ADDEND_SLEB:
778 	  {
779 	    bfd_signed_vma svma;
780 	    svma = read_leb128 (buf + i, &leblen, 0, buf + len);
781 	    printf ("set addend sleb: 0x%08x\n", (unsigned) svma);
782 	    i += leblen;
783 	  }
784 	  break;
785 	case BFD_MACH_O_BIND_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB:
786 	  leb = read_leb128 (buf + i, &leblen, 0, buf + len);
787 	  printf ("set segment: %u and offset: 0x%08x\n",
788 		  imm, (unsigned) leb);
789 	  i += leblen;
790 	  break;
791 	case BFD_MACH_O_BIND_OPCODE_ADD_ADDR_ULEB:
792 	  leb = read_leb128 (buf + i, &leblen, 0, buf + len);
793 	  printf ("add addr uleb: 0x%08x\n", (unsigned) leb);
794 	  i += leblen;
795 	  break;
796 	case BFD_MACH_O_BIND_OPCODE_DO_BIND:
797 	  printf ("do bind\n");
798 	  break;
799 	case BFD_MACH_O_BIND_OPCODE_DO_BIND_ADD_ADDR_ULEB:
800 	  leb = read_leb128 (buf + i, &leblen, 0, buf + len);
801 	  printf ("do bind add addr uleb: 0x%08x\n", (unsigned) leb);
802 	  i += leblen;
803 	  break;
804 	case BFD_MACH_O_BIND_OPCODE_DO_BIND_ADD_ADDR_IMM_SCALED:
805 	  printf ("do bind add addr imm scaled: %u\n", imm * ptrsize);
806 	  break;
807 	case BFD_MACH_O_BIND_OPCODE_DO_BIND_ULEB_TIMES_SKIPPING_ULEB:
808 	  leb = read_leb128 (buf + i, &leblen, 0, buf + len);
809 	  printf ("do bind uleb times (%u)", (unsigned) leb);
810 	  i += leblen;
811 	  leb = read_leb128 (buf + i, &leblen, 0, buf + len);
812 	  printf (" skipping uleb (%u)\n", (unsigned) leb);
813 	  i += leblen;
814 	  break;
815 	default:
816 	  printf ("unknown\n");
817 	  return;
818 	}
819     }
820   printf ("   bind commands without end!\n");
821 }
822 
823 struct export_info_data
824 {
825   const unsigned char *name;
826   struct export_info_data *next;
827 };
828 
829 static void
830 dump_dyld_info_export_1 (bfd *abfd, unsigned char *buf, unsigned int len,
831 			 unsigned int off, struct export_info_data *parent,
832 			 struct export_info_data *base)
833 {
834   bfd_vma size;
835   unsigned int leblen;
836   unsigned int child_count;
837   unsigned int i;
838 
839   size = read_leb128 (buf + off, &leblen, 0, buf + len);
840   off += leblen;
841 
842   if (size != 0)
843     {
844       bfd_vma flags;
845       struct export_info_data *d;
846 
847       flags = read_leb128 (buf + off, &leblen, 0, buf + len);
848       off += leblen;
849 
850       fputs ("   ", stdout);
851       switch (flags & BFD_MACH_O_EXPORT_SYMBOL_FLAGS_KIND_MASK)
852 	{
853 	case BFD_MACH_O_EXPORT_SYMBOL_FLAGS_KIND_REGULAR:
854 	  putchar ('-');
855 	  break;
856 	case BFD_MACH_O_EXPORT_SYMBOL_FLAGS_KIND_THREAD_LOCAL:
857 	  putchar ('T');
858 	  break;
859 	default:
860 	  putchar ('?');
861 	  break;
862 	}
863       putchar ((flags & BFD_MACH_O_EXPORT_SYMBOL_FLAGS_WEAK_DEFINITION) ?
864 	       'W' : '-');
865 
866       if (flags & BFD_MACH_O_EXPORT_SYMBOL_FLAGS_REEXPORT)
867 	{
868 	  bfd_vma lib;
869 
870 	  lib = read_leb128 (buf + off, &leblen, 0, buf + len);
871 	  off += leblen;
872 
873 	  fputs (" [reexport] ", stdout);
874 	  for (d = base; d != NULL; d = d->next)
875 	    printf ("%s", d->name);
876 
877 	  fputs (" (", stdout);
878 	  if (buf[off] != 0)
879 	    {
880 	      fputs ((const char *)buf + off, stdout);
881 	      putchar (' ');
882 	      off += strlen ((const char *)buf + off);
883 	    }
884 	  printf ("from dylib %u)\n", (unsigned) lib);
885 	  off++;
886 	}
887       else
888 	{
889 	  bfd_vma offset;
890 	  bfd_vma resolv = 0;
891 
892 	  offset = read_leb128 (buf + off, &leblen, 0, buf + len);
893 	  off += leblen;
894 
895 	  if (flags & BFD_MACH_O_EXPORT_SYMBOL_FLAGS_STUB_AND_RESOLVER)
896 	    {
897 	      resolv = read_leb128 (buf + off, &leblen, 0, buf + len);
898 	      off += leblen;
899 	    }
900 
901 	  printf (" 0x%08x ", (unsigned) offset);
902 	  for (d = base; d != NULL; d = d->next)
903 	    printf ("%s", d->name);
904 	  if (flags & BFD_MACH_O_EXPORT_SYMBOL_FLAGS_STUB_AND_RESOLVER)
905 	    printf (" [resolv: 0x%08x]", (unsigned) resolv);
906 	  printf ("\n");
907 	}
908     }
909 
910   child_count = read_leb128 (buf + off, &leblen, 0, buf + len);
911   off += leblen;
912 
913   for (i = 0; i < child_count; i++)
914     {
915       struct export_info_data sub_data;
916       bfd_vma sub_off;
917 
918       sub_data.name = buf + off;
919       sub_data.next = NULL;
920       parent->next = &sub_data;
921 
922       off += strlen ((const char *)buf + off) + 1;
923 
924       sub_off = read_leb128 (buf + off, &leblen, 0, buf + len);
925       off += leblen;
926 
927       dump_dyld_info_export_1 (abfd, buf, len, sub_off, &sub_data, base);
928     }
929 }
930 
931 static void
932 dump_dyld_info_export (bfd *abfd, unsigned char *buf, unsigned int len,
933 		       ufile_ptr off ATTRIBUTE_UNUSED)
934 {
935   struct export_info_data data;
936 
937   data.name = (const unsigned char *) "";
938   data.next = NULL;
939 
940   printf ("   fl offset     sym        (Flags: Tls Weak)\n");
941   dump_dyld_info_export_1 (abfd, buf, len, 0, &data, &data);
942 }
943 
944 static void
945 dump_dyld_info (bfd *abfd, bfd_mach_o_load_command *cmd,
946 		bfd_boolean verbose)
947 {
948   bfd_mach_o_dyld_info_command *dinfo = &cmd->command.dyld_info;
949 
950   printf ("       rebase: off: 0x%08x  size: %-8u   (endoff: 0x%08x)\n",
951 	  dinfo->rebase_off, dinfo->rebase_size,
952 	  dinfo->rebase_off + dinfo->rebase_size);
953   printf ("         bind: off: 0x%08x  size: %-8u   (endoff: 0x%08x)\n",
954 	  dinfo->bind_off, dinfo->bind_size,
955 	  dinfo->bind_off + dinfo->bind_size);
956   printf ("    weak bind: off: 0x%08x  size: %-8u   (endoff: 0x%08x)\n",
957 	  dinfo->weak_bind_off, dinfo->weak_bind_size,
958 	  dinfo->weak_bind_off + dinfo->weak_bind_size);
959   printf ("    lazy bind: off: 0x%08x  size: %-8u   (endoff: 0x%08x)\n",
960 	  dinfo->lazy_bind_off, dinfo->lazy_bind_size,
961 	  dinfo->lazy_bind_off + dinfo->lazy_bind_size);
962   printf ("       export: off: 0x%08x  size: %-8u   (endoff: 0x%08x)\n",
963 	  dinfo->export_off, dinfo->export_size,
964 	  dinfo->export_off + dinfo->export_size);
965 
966   if (!verbose)
967     return;
968 
969   printf ("   rebase:\n");
970   if (!load_and_dump (abfd, dinfo->rebase_off, dinfo->rebase_size,
971 		      dump_dyld_info_rebase))
972     non_fatal (_("cannot read rebase dyld info"));
973 
974   printf ("   bind:\n");
975   if (!load_and_dump (abfd, dinfo->bind_off, dinfo->bind_size,
976 		      dump_dyld_info_bind))
977     non_fatal (_("cannot read bind dyld info"));
978 
979   printf ("   weak bind:\n");
980   if (!load_and_dump (abfd, dinfo->weak_bind_off, dinfo->weak_bind_size,
981 		      dump_dyld_info_bind))
982     non_fatal (_("cannot read weak bind dyld info"));
983 
984   printf ("   lazy bind:\n");
985   if (!load_and_dump (abfd, dinfo->lazy_bind_off, dinfo->lazy_bind_size,
986 		      dump_dyld_info_bind))
987     non_fatal (_("cannot read lazy bind dyld info"));
988 
989   printf ("   exported symbols:\n");
990   if (!load_and_dump (abfd, dinfo->export_off, dinfo->export_size,
991 		      dump_dyld_info_export))
992     non_fatal (_("cannot read export symbols dyld info"));
993 }
994 
995 static void
996 dump_thread (bfd *abfd, bfd_mach_o_load_command *cmd)
997 {
998   bfd_mach_o_thread_command *thread = &cmd->command.thread;
999   unsigned int j;
1000   bfd_mach_o_backend_data *bed = bfd_mach_o_get_backend_data (abfd);
1001   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
1002 
1003   printf (" nflavours: %lu\n", thread->nflavours);
1004   for (j = 0; j < thread->nflavours; j++)
1005     {
1006       bfd_mach_o_thread_flavour *flavour = &thread->flavours[j];
1007       const bfd_mach_o_xlat_name *name_table;
1008 
1009       printf ("  %2u: flavour: 0x%08lx", j, flavour->flavour);
1010       switch (mdata->header.cputype)
1011         {
1012         case BFD_MACH_O_CPU_TYPE_I386:
1013         case BFD_MACH_O_CPU_TYPE_X86_64:
1014           name_table = bfd_mach_o_thread_x86_name;
1015           break;
1016         default:
1017           name_table = NULL;
1018           break;
1019         }
1020       if (name_table != NULL)
1021         printf (": %s", bfd_mach_o_get_name (name_table, flavour->flavour));
1022       putchar ('\n');
1023 
1024       printf ("       offset: 0x%08lx  size: 0x%08lx\n",
1025               flavour->offset, flavour->size);
1026       if (bed->_bfd_mach_o_print_thread)
1027         {
1028           char *buf = xmalloc (flavour->size);
1029 
1030           if (bfd_seek (abfd, flavour->offset, SEEK_SET) == 0
1031               && bfd_bread (buf, flavour->size, abfd) == flavour->size)
1032             (*bed->_bfd_mach_o_print_thread)(abfd, flavour, stdout, buf);
1033 
1034           free (buf);
1035         }
1036     }
1037 }
1038 
1039 static const bfd_mach_o_xlat_name bfd_mach_o_cs_magic[] =
1040 {
1041   { "embedded signature", BFD_MACH_O_CS_MAGIC_EMBEDDED_SIGNATURE },
1042   { "requirement", BFD_MACH_O_CS_MAGIC_REQUIREMENT },
1043   { "requirements", BFD_MACH_O_CS_MAGIC_REQUIREMENTS },
1044   { "code directory", BFD_MACH_O_CS_MAGIC_CODEDIRECTORY },
1045   { "embedded entitlements", BFD_MACH_O_CS_MAGIC_EMBEDDED_ENTITLEMENTS },
1046   { "blob wrapper", BFD_MACH_O_CS_MAGIC_BLOB_WRAPPER },
1047   { NULL, 0 }
1048 };
1049 
1050 static const bfd_mach_o_xlat_name bfd_mach_o_cs_hash_type[] =
1051 {
1052   { "no-hash", BFD_MACH_O_CS_NO_HASH },
1053   { "sha1", BFD_MACH_O_CS_HASH_SHA1 },
1054   { "sha256", BFD_MACH_O_CS_HASH_SHA256 },
1055   { "skein 160", BFD_MACH_O_CS_HASH_PRESTANDARD_SKEIN_160x256 },
1056   { "skein 256", BFD_MACH_O_CS_HASH_PRESTANDARD_SKEIN_256x512 },
1057   { NULL, 0 }
1058 };
1059 
1060 static unsigned int
1061 dump_code_signature_blob (bfd *abfd, const unsigned char *buf, unsigned int len);
1062 
1063 static void
1064 dump_code_signature_superblob (bfd *abfd ATTRIBUTE_UNUSED,
1065                                const unsigned char *buf, unsigned int len)
1066 {
1067   unsigned int count;
1068   unsigned int i;
1069 
1070   if (len < 12)
1071     {
1072       printf (_("  [bad block length]\n"));
1073       return;
1074     }
1075   count = bfd_getb32 (buf + 8);
1076   printf (ngettext ("  %u index entry:\n",
1077 		    "  %u index entries:\n",
1078 		    count),
1079 	  count);
1080   if (len < 12 + 8 * count)
1081     {
1082       printf (_("  [bad block length]\n"));
1083       return;
1084     }
1085   for (i = 0; i < count; i++)
1086     {
1087       unsigned int type;
1088       unsigned int off;
1089 
1090       type = bfd_getb32 (buf + 12 + 8 * i);
1091       off = bfd_getb32 (buf + 12 + 8 * i + 4);
1092       printf (_("  index entry %u: type: %08x, offset: %08x\n"),
1093               i, type, off);
1094 
1095       dump_code_signature_blob (abfd, buf + off, len - off);
1096     }
1097 }
1098 
1099 static void
1100 swap_code_codedirectory_v1_in
1101   (const struct mach_o_codesign_codedirectory_external_v1 *src,
1102    struct mach_o_codesign_codedirectory_v1 *dst)
1103 {
1104   dst->version = bfd_getb32 (src->version);
1105   dst->flags = bfd_getb32 (src->flags);
1106   dst->hash_offset = bfd_getb32 (src->hash_offset);
1107   dst->ident_offset = bfd_getb32 (src->ident_offset);
1108   dst->nbr_special_slots = bfd_getb32 (src->nbr_special_slots);
1109   dst->nbr_code_slots = bfd_getb32 (src->nbr_code_slots);
1110   dst->code_limit = bfd_getb32 (src->code_limit);
1111   dst->hash_size = src->hash_size[0];
1112   dst->hash_type = src->hash_type[0];
1113   dst->spare1 = src->spare1[0];
1114   dst->page_size = src->page_size[0];
1115   dst->spare2 = bfd_getb32 (src->spare2);
1116 }
1117 
1118 static void
1119 hexdump (unsigned int start, unsigned int len,
1120          const unsigned char *buf)
1121 {
1122   unsigned int i, j;
1123 
1124   for (i = 0; i < len; i += 16)
1125     {
1126       printf ("%08x:", start + i);
1127       for (j = 0; j < 16; j++)
1128         {
1129           fputc (j == 8 ? '-' : ' ', stdout);
1130           if (i + j < len)
1131             printf ("%02x", buf[i + j]);
1132           else
1133             fputs ("  ", stdout);
1134         }
1135       fputc (' ', stdout);
1136       for (j = 0; j < 16; j++)
1137         {
1138           if (i + j < len)
1139             fputc (ISPRINT (buf[i + j]) ? buf[i + j] : '.', stdout);
1140           else
1141             fputc (' ', stdout);
1142         }
1143       fputc ('\n', stdout);
1144     }
1145 }
1146 
1147 static void
1148 dump_code_signature_codedirectory (bfd *abfd ATTRIBUTE_UNUSED,
1149                                    const unsigned char *buf, unsigned int len)
1150 {
1151   struct mach_o_codesign_codedirectory_v1 cd;
1152   const char *id;
1153 
1154   if (len < sizeof (struct mach_o_codesign_codedirectory_external_v1))
1155     {
1156       printf (_("  [bad block length]\n"));
1157       return;
1158     }
1159 
1160   swap_code_codedirectory_v1_in
1161     ((const struct mach_o_codesign_codedirectory_external_v1 *) (buf + 8), &cd);
1162 
1163   printf (_("  version:           %08x\n"), cd.version);
1164   printf (_("  flags:             %08x\n"), cd.flags);
1165   printf (_("  hash offset:       %08x\n"), cd.hash_offset);
1166   id = (const char *) buf + cd.ident_offset;
1167   printf (_("  ident offset:      %08x (- %08x)\n"),
1168           cd.ident_offset, cd.ident_offset + (unsigned) strlen (id) + 1);
1169   printf (_("   identity: %s\n"), id);
1170   printf (_("  nbr special slots: %08x (at offset %08x)\n"),
1171           cd.nbr_special_slots,
1172           cd.hash_offset - cd.nbr_special_slots * cd.hash_size);
1173   printf (_("  nbr code slots:    %08x\n"), cd.nbr_code_slots);
1174   printf (_("  code limit:        %08x\n"), cd.code_limit);
1175   printf (_("  hash size:         %02x\n"), cd.hash_size);
1176   printf (_("  hash type:         %02x (%s)\n"),
1177           cd.hash_type,
1178           bfd_mach_o_get_name (bfd_mach_o_cs_hash_type, cd.hash_type));
1179   printf (_("  spare1:            %02x\n"), cd.spare1);
1180   printf (_("  page size:         %02x\n"), cd.page_size);
1181   printf (_("  spare2:            %08x\n"), cd.spare2);
1182   if (cd.version >= 0x20100)
1183     printf (_("  scatter offset:    %08x\n"),
1184             (unsigned) bfd_getb32 (buf + 44));
1185 }
1186 
1187 static unsigned int
1188 dump_code_signature_blob (bfd *abfd, const unsigned char *buf, unsigned int len)
1189 {
1190   unsigned int magic;
1191   unsigned int length;
1192 
1193   if (len < 8)
1194     {
1195       printf (_("  [truncated block]\n"));
1196       return 0;
1197     }
1198   magic = bfd_getb32 (buf);
1199   length = bfd_getb32 (buf + 4);
1200   if (magic == 0 || length == 0)
1201     return 0;
1202 
1203   printf (_(" magic : %08x (%s)\n"), magic,
1204           bfd_mach_o_get_name (bfd_mach_o_cs_magic, magic));
1205   printf (_(" length: %08x\n"), length);
1206   if (length > len)
1207     {
1208       printf (_("  [bad block length]\n"));
1209       return 0;
1210     }
1211 
1212   switch (magic)
1213     {
1214     case BFD_MACH_O_CS_MAGIC_EMBEDDED_SIGNATURE:
1215       dump_code_signature_superblob (abfd, buf, length);
1216       break;
1217     case BFD_MACH_O_CS_MAGIC_CODEDIRECTORY:
1218       dump_code_signature_codedirectory (abfd, buf, length);
1219       break;
1220     default:
1221       hexdump (0, length - 8, buf + 8);
1222       break;
1223     }
1224   return length;
1225 }
1226 
1227 static void
1228 dump_code_signature (bfd *abfd, bfd_mach_o_linkedit_command *cmd)
1229 {
1230   unsigned char *buf = xmalloc (cmd->datasize);
1231   unsigned int off;
1232 
1233   if (bfd_seek (abfd, cmd->dataoff, SEEK_SET) != 0
1234       || bfd_bread (buf, cmd->datasize, abfd) != cmd->datasize)
1235     {
1236       non_fatal (_("cannot read code signature data"));
1237       free (buf);
1238       return;
1239     }
1240   for (off = 0; off < cmd->datasize;)
1241     {
1242       unsigned int len;
1243 
1244       len = dump_code_signature_blob (abfd, buf + off, cmd->datasize - off);
1245 
1246       if (len == 0)
1247         break;
1248       off += len;
1249     }
1250   free (buf);
1251 }
1252 
1253 static void
1254 dump_segment_split_info (bfd *abfd, bfd_mach_o_linkedit_command *cmd)
1255 {
1256   unsigned char *buf = xmalloc (cmd->datasize);
1257   unsigned char *p;
1258   unsigned int len;
1259   bfd_vma addr = 0;
1260 
1261   if (bfd_seek (abfd, cmd->dataoff, SEEK_SET) != 0
1262       || bfd_bread (buf, cmd->datasize, abfd) != cmd->datasize)
1263     {
1264       non_fatal (_("cannot read segment split info"));
1265       free (buf);
1266       return;
1267     }
1268   if (buf[cmd->datasize - 1] != 0)
1269     {
1270       non_fatal (_("segment split info is not nul terminated"));
1271       free (buf);
1272       return;
1273     }
1274 
1275   switch (buf[0])
1276     {
1277     case 0:
1278       printf (_("  32 bit pointers:\n"));
1279       break;
1280     case 1:
1281       printf (_("  64 bit pointers:\n"));
1282       break;
1283     case 2:
1284       printf (_("  PPC hi-16:\n"));
1285       break;
1286     default:
1287       printf (_("  Unhandled location type %u\n"), buf[0]);
1288       break;
1289     }
1290   for (p = buf + 1; *p != 0; p += len)
1291     {
1292       addr += read_leb128 (p, &len, 0, buf + cmd->datasize);
1293       fputs ("    ", stdout);
1294       bfd_printf_vma (abfd, addr);
1295       putchar ('\n');
1296     }
1297   free (buf);
1298 }
1299 
1300 static void
1301 dump_function_starts (bfd *abfd, bfd_mach_o_linkedit_command *cmd)
1302 {
1303   unsigned char *buf = xmalloc (cmd->datasize);
1304   unsigned char *end_buf = buf + cmd->datasize;
1305   unsigned char *p;
1306   bfd_vma addr;
1307 
1308   if (bfd_seek (abfd, cmd->dataoff, SEEK_SET) != 0
1309       || bfd_bread (buf, cmd->datasize, abfd) != cmd->datasize)
1310     {
1311       non_fatal (_("cannot read function starts"));
1312       free (buf);
1313       return;
1314     }
1315 
1316   /* Function starts are delta encoded, starting from the base address.  */
1317   addr = bfd_mach_o_get_base_address (abfd);
1318 
1319   for (p = buf; ;)
1320     {
1321       bfd_vma delta = 0;
1322       unsigned int shift = 0;
1323 
1324       if (*p == 0 || p == end_buf)
1325 	break;
1326       while (1)
1327 	{
1328 	  unsigned char b = *p++;
1329 
1330 	  delta |= (b & 0x7f) << shift;
1331 	  if ((b & 0x80) == 0)
1332 	    break;
1333 	  if (p == end_buf)
1334 	    {
1335 	      fputs ("   [truncated]\n", stdout);
1336 	      break;
1337 	    }
1338 	  shift += 7;
1339 	}
1340 
1341       addr += delta;
1342       fputs ("    ", stdout);
1343       bfd_printf_vma (abfd, addr);
1344       putchar ('\n');
1345     }
1346   free (buf);
1347 }
1348 
1349 static const bfd_mach_o_xlat_name data_in_code_kind_name[] =
1350 {
1351   { "data", BFD_MACH_O_DICE_KIND_DATA },
1352   { "1 byte jump table", BFD_MACH_O_DICE_JUMP_TABLES8 },
1353   { "2 bytes jump table", BFD_MACH_O_DICE_JUMP_TABLES16 },
1354   { "4 bytes jump table", BFD_MACH_O_DICE_JUMP_TABLES32 },
1355   { "4 bytes abs jump table", BFD_MACH_O_DICE_ABS_JUMP_TABLES32 },
1356   { NULL, 0 }
1357 };
1358 
1359 static void
1360 dump_data_in_code (bfd *abfd, bfd_mach_o_linkedit_command *cmd)
1361 {
1362   unsigned char *buf;
1363   unsigned char *p;
1364 
1365   if (cmd->datasize == 0)
1366     {
1367       printf ("   no data_in_code entries\n");
1368       return;
1369     }
1370 
1371   buf = xmalloc (cmd->datasize);
1372   if (bfd_seek (abfd, cmd->dataoff, SEEK_SET) != 0
1373       || bfd_bread (buf, cmd->datasize, abfd) != cmd->datasize)
1374     {
1375       non_fatal (_("cannot read data_in_code"));
1376       free (buf);
1377       return;
1378     }
1379 
1380   printf ("   offset     length kind\n");
1381   for (p = buf; p < buf + cmd->datasize; )
1382     {
1383       struct mach_o_data_in_code_entry_external *dice;
1384       unsigned int offset;
1385       unsigned int length;
1386       unsigned int kind;
1387 
1388       dice = (struct mach_o_data_in_code_entry_external *) p;
1389 
1390       offset = bfd_get_32 (abfd, dice->offset);
1391       length = bfd_get_16 (abfd, dice->length);
1392       kind = bfd_get_16 (abfd, dice->kind);
1393 
1394       printf ("   0x%08x 0x%04x 0x%04x %s\n", offset, length, kind,
1395 	      bfd_mach_o_get_name (data_in_code_kind_name, kind));
1396 
1397       p += sizeof (*dice);
1398     }
1399   free (buf);
1400 }
1401 
1402 static void
1403 dump_twolevel_hints (bfd *abfd, bfd_mach_o_twolevel_hints_command *cmd)
1404 {
1405   size_t sz = 4 * cmd->nhints;
1406   unsigned char *buf;
1407   unsigned char *p;
1408 
1409   buf = xmalloc (sz);
1410   if (bfd_seek (abfd, cmd->offset, SEEK_SET) != 0
1411       || bfd_bread (buf, sz, abfd) != sz)
1412     {
1413       non_fatal (_("cannot read twolevel hints"));
1414       free (buf);
1415       return;
1416     }
1417 
1418   for (p = buf; p < buf + sz; p += 4)
1419     {
1420       unsigned int v;
1421       unsigned int isub_image;
1422       unsigned int itoc;
1423 
1424       v = bfd_get_32 (abfd, p);
1425       if (bfd_big_endian (abfd))
1426 	{
1427 	  isub_image = (v >> 24) & 0xff;
1428 	  itoc = v & 0xffffff;
1429 	}
1430       else
1431 	{
1432 	  isub_image = v & 0xff;
1433 	  itoc = (v >> 8) & 0xffffff;
1434 	}
1435 
1436       printf ("  %3u %8u\n", isub_image, itoc);
1437     }
1438   free (buf);
1439 }
1440 
1441 static void
1442 dump_load_command (bfd *abfd, bfd_mach_o_load_command *cmd,
1443                    unsigned int idx, bfd_boolean verbose)
1444 {
1445   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
1446   const char *cmd_name;
1447 
1448   cmd_name = bfd_mach_o_get_name_or_null
1449     (bfd_mach_o_load_command_name, cmd->type);
1450   printf ("Load command #%-2u (size: %3u, offset: %4u): ",
1451 	  idx, cmd->len, cmd->offset);
1452   if (cmd_name == NULL)
1453     printf ("0x%02x\n", cmd->type);
1454   else
1455     printf ("%s\n", cmd_name);
1456 
1457   switch (cmd->type)
1458     {
1459     case BFD_MACH_O_LC_SEGMENT:
1460     case BFD_MACH_O_LC_SEGMENT_64:
1461       dump_segment (abfd, cmd);
1462       break;
1463     case BFD_MACH_O_LC_UUID:
1464       {
1465         bfd_mach_o_uuid_command *uuid = &cmd->command.uuid;
1466         unsigned int j;
1467 
1468 	printf ("   ");
1469         for (j = 0; j < sizeof (uuid->uuid); j ++)
1470           printf (" %02x", uuid->uuid[j]);
1471         putchar ('\n');
1472       }
1473       break;
1474     case BFD_MACH_O_LC_LOAD_DYLIB:
1475     case BFD_MACH_O_LC_LAZY_LOAD_DYLIB:
1476     case BFD_MACH_O_LC_LOAD_WEAK_DYLIB:
1477     case BFD_MACH_O_LC_REEXPORT_DYLIB:
1478     case BFD_MACH_O_LC_ID_DYLIB:
1479     case BFD_MACH_O_LC_LOAD_UPWARD_DYLIB:
1480       {
1481         bfd_mach_o_dylib_command *dylib = &cmd->command.dylib;
1482         printf ("  name: %s\n", dylib->name_str);
1483         printf ("            time stamp: 0x%08lx\n",
1484                 dylib->timestamp);
1485         printf ("       current version: 0x%08lx\n",
1486                 dylib->current_version);
1487         printf ("  comptibility version: 0x%08lx\n",
1488                 dylib->compatibility_version);
1489       }
1490       break;
1491     case BFD_MACH_O_LC_LOAD_DYLINKER:
1492     case BFD_MACH_O_LC_ID_DYLINKER:
1493       printf ("    %s\n", cmd->command.dylinker.name_str);
1494       break;
1495     case BFD_MACH_O_LC_DYLD_ENVIRONMENT:
1496       printf ("    %s\n", cmd->command.dylinker.name_str);
1497       break;
1498     case BFD_MACH_O_LC_SYMTAB:
1499       {
1500         bfd_mach_o_symtab_command *symtab = &cmd->command.symtab;
1501         printf ("   symoff: 0x%08x    nsyms: %8u  (endoff: 0x%08x)\n",
1502                 symtab->symoff, symtab->nsyms,
1503                 symtab->symoff + symtab->nsyms
1504                 * (mdata->header.version == 2
1505                    ? BFD_MACH_O_NLIST_64_SIZE : BFD_MACH_O_NLIST_SIZE));
1506         printf ("   stroff: 0x%08x  strsize: %8u  (endoff: 0x%08x)\n",
1507                 symtab->stroff, symtab->strsize,
1508                 symtab->stroff + symtab->strsize);
1509         break;
1510       }
1511     case BFD_MACH_O_LC_DYSYMTAB:
1512       dump_dysymtab (abfd, cmd, verbose);
1513       break;
1514     case BFD_MACH_O_LC_LOADFVMLIB:
1515     case BFD_MACH_O_LC_IDFVMLIB:
1516       {
1517         bfd_mach_o_fvmlib_command *fvmlib = &cmd->command.fvmlib;
1518         printf ("                fvmlib: %s\n", fvmlib->name_str);
1519         printf ("         minor version: 0x%08x\n", fvmlib->minor_version);
1520         printf ("        header address: 0x%08x\n", fvmlib->header_addr);
1521       }
1522       break;
1523     case BFD_MACH_O_LC_CODE_SIGNATURE:
1524     case BFD_MACH_O_LC_SEGMENT_SPLIT_INFO:
1525     case BFD_MACH_O_LC_FUNCTION_STARTS:
1526     case BFD_MACH_O_LC_DATA_IN_CODE:
1527     case BFD_MACH_O_LC_DYLIB_CODE_SIGN_DRS:
1528       {
1529         bfd_mach_o_linkedit_command *linkedit = &cmd->command.linkedit;
1530         printf
1531           ("  dataoff: 0x%08lx  datasize: 0x%08lx  (endoff: 0x%08lx)\n",
1532            linkedit->dataoff, linkedit->datasize,
1533            linkedit->dataoff + linkedit->datasize);
1534 
1535 	if (verbose)
1536 	  switch (cmd->type)
1537 	    {
1538 	    case BFD_MACH_O_LC_CODE_SIGNATURE:
1539 	      dump_code_signature (abfd, linkedit);
1540 	      break;
1541 	    case BFD_MACH_O_LC_SEGMENT_SPLIT_INFO:
1542 	      dump_segment_split_info (abfd, linkedit);
1543 	      break;
1544 	    case BFD_MACH_O_LC_FUNCTION_STARTS:
1545 	      dump_function_starts (abfd, linkedit);
1546 	      break;
1547 	    case BFD_MACH_O_LC_DATA_IN_CODE:
1548 	      dump_data_in_code (abfd, linkedit);
1549 	      break;
1550 	    default:
1551 	      break;
1552 	    }
1553       }
1554       break;
1555     case BFD_MACH_O_LC_SUB_FRAMEWORK:
1556     case BFD_MACH_O_LC_SUB_UMBRELLA:
1557     case BFD_MACH_O_LC_SUB_LIBRARY:
1558     case BFD_MACH_O_LC_SUB_CLIENT:
1559     case BFD_MACH_O_LC_RPATH:
1560       {
1561         bfd_mach_o_str_command *strc = &cmd->command.str;
1562         printf ("    %s\n", strc->str);
1563         break;
1564       }
1565     case BFD_MACH_O_LC_THREAD:
1566     case BFD_MACH_O_LC_UNIXTHREAD:
1567       dump_thread (abfd, cmd);
1568       break;
1569     case BFD_MACH_O_LC_ENCRYPTION_INFO:
1570       {
1571         bfd_mach_o_encryption_info_command *cryp =
1572           &cmd->command.encryption_info;
1573         printf ("  cryptoff: 0x%08x  cryptsize: 0x%08x (endoff 0x%08x)"
1574 		" cryptid: %u\n",
1575 		cryp->cryptoff, cryp->cryptsize,
1576 		cryp->cryptoff + cryp->cryptsize,
1577 		cryp->cryptid);
1578       }
1579       break;
1580     case BFD_MACH_O_LC_DYLD_INFO:
1581       dump_dyld_info (abfd, cmd, verbose);
1582       break;
1583     case BFD_MACH_O_LC_VERSION_MIN_MACOSX:
1584     case BFD_MACH_O_LC_VERSION_MIN_IPHONEOS:
1585       {
1586         bfd_mach_o_version_min_command *ver = &cmd->command.version_min;
1587 
1588         printf ("    %u.%u.%u\n", ver->rel, ver->maj, ver->min);
1589       }
1590       break;
1591     case BFD_MACH_O_LC_SOURCE_VERSION:
1592       {
1593         bfd_mach_o_source_version_command *version =
1594 	  &cmd->command.source_version;
1595         printf ("   version a.b.c.d.e: %u.%u.%u.%u.%u\n",
1596 		version->a, version->b, version->c, version->d, version->e);
1597         break;
1598       }
1599     case BFD_MACH_O_LC_PREBOUND_DYLIB:
1600       {
1601         bfd_mach_o_prebound_dylib_command *pbdy = &cmd->command.prebound_dylib;
1602 	unsigned char *lm = pbdy->linked_modules;
1603 	unsigned int j;
1604 	unsigned int last;
1605 
1606         printf ("      dylib: %s\n", pbdy->name_str);
1607         printf ("   nmodules: %u\n", pbdy->nmodules);
1608 	printf ("   linked modules (at %u): ",
1609 		pbdy->linked_modules_offset - cmd->offset);
1610 	last = pbdy->nmodules > 32 ? 32 : pbdy->nmodules;
1611 	for (j = 0; j < last; j++)
1612 	  printf ("%u", (lm[j >> 3] >> (j & 7)) & 1);
1613 	if (last < pbdy->nmodules)
1614 	  printf ("...");
1615 	putchar ('\n');
1616         break;
1617       }
1618     case BFD_MACH_O_LC_PREBIND_CKSUM:
1619       {
1620         bfd_mach_o_prebind_cksum_command *cksum = &cmd->command.prebind_cksum;
1621         printf ("   0x%08x\n", cksum->cksum);
1622         break;
1623       }
1624     case BFD_MACH_O_LC_TWOLEVEL_HINTS:
1625       {
1626         bfd_mach_o_twolevel_hints_command *hints =
1627 	  &cmd->command.twolevel_hints;
1628 
1629         printf ("   table offset: 0x%08x  nbr hints: %u\n",
1630 		hints->offset, hints->nhints);
1631 	if (verbose)
1632 	  dump_twolevel_hints (abfd, hints);
1633         break;
1634       }
1635     case BFD_MACH_O_LC_MAIN:
1636       {
1637         bfd_mach_o_main_command *entry = &cmd->command.main;
1638         printf ("   entry offset: ");
1639 	printf_uint64 (entry->entryoff);
1640         printf ("\n"
1641                 "   stack size:   ");
1642 	printf_uint64 (entry->stacksize);
1643 	printf ("\n");
1644         break;
1645       }
1646     default:
1647       break;
1648     }
1649   putchar ('\n');
1650 }
1651 
1652 static void
1653 dump_load_commands (bfd *abfd, unsigned int cmd32, unsigned int cmd64)
1654 {
1655   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
1656   bfd_mach_o_load_command *cmd;
1657   unsigned int i;
1658 
1659   for (cmd = mdata->first_command, i = 0; cmd != NULL; cmd = cmd->next, i++)
1660     {
1661       if (cmd32 == 0)
1662         dump_load_command (abfd, cmd, i, FALSE);
1663       else if (cmd->type == cmd32 || cmd->type == cmd64)
1664         dump_load_command (abfd, cmd, i, TRUE);
1665     }
1666 }
1667 
1668 static const char * const unwind_x86_64_regs[] =
1669   {"", "rbx", "r12", "r13", "r14", "r15", "rbp", "???" };
1670 
1671 static const char * const unwind_x86_regs[] =
1672   {"", "ebx", "ecx", "edx", "edi", "edi", "ebp", "???" };
1673 
1674 /* Dump x86 or x86-64 compact unwind encoding.  Works for both architecture,
1675    as the encoding is the same (but not register names).  */
1676 
1677 static void
1678 dump_unwind_encoding_x86 (unsigned int encoding, unsigned int sz,
1679 			  const char * const regs_name[])
1680 {
1681   unsigned int mode;
1682 
1683   mode = encoding & MACH_O_UNWIND_X86_64_MODE_MASK;
1684   switch (mode)
1685     {
1686     case MACH_O_UNWIND_X86_64_MODE_RBP_FRAME:
1687       {
1688 	unsigned int regs;
1689 	char pfx = sz == 8 ? 'R' : 'E';
1690 
1691 	regs = encoding & MACH_O_UNWIND_X86_64_RBP_FRAME_REGISTERS;
1692 	printf (" %cSP frame", pfx);
1693 	if (regs != 0)
1694 	  {
1695 	    unsigned int offset;
1696 	    int i;
1697 
1698 	    offset = (encoding & MACH_O_UNWIND_X86_64_RBP_FRAME_OFFSET) >> 16;
1699 	    printf (" at %cBP-%u:", pfx, offset * sz);
1700 	    for (i = 0; i < 5; i++)
1701 	      {
1702 		unsigned int reg = (regs >> (i * 3)) & 0x7;
1703 		if (reg != MACH_O_UNWIND_X86_64_REG_NONE)
1704 		  printf (" %s", regs_name[reg]);
1705 	      }
1706 	  }
1707       }
1708       break;
1709     case MACH_O_UNWIND_X86_64_MODE_STACK_IMMD:
1710     case MACH_O_UNWIND_X86_64_MODE_STACK_IND:
1711       {
1712 	unsigned int stack_size;
1713 	unsigned int reg_count;
1714 	unsigned int reg_perm;
1715 	unsigned int regs[6];
1716 	int i, j;
1717 
1718 	printf (" frameless");
1719 	stack_size =
1720 	  (encoding & MACH_O_UNWIND_X86_64_FRAMELESS_STACK_SIZE) >> 16;
1721 	reg_count =
1722 	  (encoding & MACH_O_UNWIND_X86_64_FRAMELESS_REG_COUNT) >> 10;
1723 	reg_perm = encoding & MACH_O_UNWIND_X86_64_FRAMELESS_REG_PERMUTATION;
1724 
1725 	if (mode == MACH_O_UNWIND_X86_64_MODE_STACK_IMMD)
1726 	  printf (" size: 0x%03x", stack_size * sz);
1727 	else
1728 	  {
1729 	    unsigned int stack_adj;
1730 
1731 	    stack_adj =
1732 	      (encoding & MACH_O_UNWIND_X86_64_FRAMELESS_STACK_ADJUST) >> 13;
1733 	    printf (" size at 0x%03x + 0x%02x", stack_size, stack_adj * sz);
1734 	  }
1735 	/* Registers are coded using arithmetic compression: the register
1736 	   is indexed in range 0-6, the second in range 0-5, the third in
1737 	   range 0-4, etc.  Already used registers are removed in next
1738 	   ranges.  */
1739 #define DO_PERM(R, NUM) R = reg_perm / NUM; reg_perm -= R * NUM
1740 	switch (reg_count)
1741 	  {
1742 	  case 6:
1743 	  case 5:
1744 	    DO_PERM (regs[0], 120);
1745 	    DO_PERM (regs[1], 24);
1746 	    DO_PERM (regs[2], 6);
1747 	    DO_PERM (regs[3], 2);
1748 	    DO_PERM (regs[4], 1);
1749 	    regs[5] = 0; /* Not used if reg_count = 5.  */
1750 	    break;
1751 	  case 4:
1752 	    DO_PERM (regs[0], 60);
1753 	    DO_PERM (regs[1], 12);
1754 	    DO_PERM (regs[2], 3);
1755 	    DO_PERM (regs[3], 1);
1756 	    break;
1757 	  case 3:
1758 	    DO_PERM (regs[0], 20);
1759 	    DO_PERM (regs[1], 4);
1760 	    DO_PERM (regs[2], 1);
1761 	    break;
1762 	  case 2:
1763 	    DO_PERM (regs[0], 5);
1764 	    DO_PERM (regs[1], 1);
1765 	    break;
1766 	  case 1:
1767 	    DO_PERM (regs[0], 1);
1768 	    break;
1769 	  case 0:
1770 	    break;
1771 	  default:
1772 	    printf (" [bad reg count]");
1773 	    return;
1774 	  }
1775 #undef DO_PERM
1776 	/* Renumber.  */
1777 	for (i = reg_count - 1; i >= 0; i--)
1778 	  {
1779 	    unsigned int inc = 1;
1780 	    for (j = 0; j < i; j++)
1781 	      if (regs[i] >= regs[j])
1782 		inc++;
1783 	    regs[i] += inc;
1784 	  }
1785 	/* Display.  */
1786 	for (i = 0; i < (int) reg_count; i++)
1787 	  printf (" %s", regs_name[regs[i]]);
1788       }
1789       break;
1790     case MACH_O_UNWIND_X86_64_MODE_DWARF:
1791       printf (" Dwarf offset: 0x%06x",
1792 	      encoding & MACH_O_UNWIND_X86_64_DWARF_SECTION_OFFSET);
1793       break;
1794     default:
1795       printf (" [unhandled mode]");
1796       break;
1797     }
1798 }
1799 
1800 /* Dump arm64 compact unwind entries.  */
1801 
1802 static void
1803 dump_unwind_encoding_arm64 (unsigned int encoding)
1804 {
1805   switch (encoding & MACH_O_UNWIND_ARM64_MODE_MASK)
1806     {
1807     case MACH_O_UNWIND_ARM64_MODE_FRAMELESS:
1808       printf (" frameless");
1809       break;
1810     case MACH_O_UNWIND_ARM64_MODE_DWARF:
1811       printf (" Dwarf offset: 0x%06x",
1812 	      encoding & MACH_O_UNWIND_ARM64_DWARF_SECTION_OFFSET);
1813       return;
1814     case MACH_O_UNWIND_ARM64_MODE_FRAME:
1815       printf (" frame");
1816       break;
1817     default:
1818       printf (" [unhandled mode]");
1819       return;
1820     }
1821   switch (encoding & MACH_O_UNWIND_ARM64_MODE_MASK)
1822     {
1823     case MACH_O_UNWIND_ARM64_MODE_FRAMELESS:
1824     case MACH_O_UNWIND_ARM64_MODE_FRAME:
1825       if (encoding & MACH_O_UNWIND_ARM64_FRAME_X19_X20_PAIR)
1826 	printf (" x19-x20");
1827       if (encoding & MACH_O_UNWIND_ARM64_FRAME_X21_X22_PAIR)
1828 	printf (" x21-x22");
1829       if (encoding & MACH_O_UNWIND_ARM64_FRAME_X23_X24_PAIR)
1830 	printf (" x23-x24");
1831       if (encoding & MACH_O_UNWIND_ARM64_FRAME_X25_X26_PAIR)
1832 	printf (" x25-x26");
1833       if (encoding & MACH_O_UNWIND_ARM64_FRAME_X27_X28_PAIR)
1834 	printf (" x27-x28");
1835       break;
1836     }
1837   switch (encoding & MACH_O_UNWIND_ARM64_MODE_MASK)
1838     {
1839     case MACH_O_UNWIND_ARM64_MODE_FRAME:
1840       if (encoding & MACH_O_UNWIND_ARM64_FRAME_D8_D9_PAIR)
1841 	printf (" d8-d9");
1842       if (encoding & MACH_O_UNWIND_ARM64_FRAME_D10_D11_PAIR)
1843 	printf (" d10-d11");
1844       if (encoding & MACH_O_UNWIND_ARM64_FRAME_D12_D13_PAIR)
1845 	printf (" d12-d13");
1846       if (encoding & MACH_O_UNWIND_ARM64_FRAME_D14_D15_PAIR)
1847 	printf (" d14-d15");
1848       break;
1849     case MACH_O_UNWIND_ARM64_MODE_FRAMELESS:
1850       printf (" size: %u",
1851 	      (encoding & MACH_O_UNWIND_ARM64_FRAMELESS_STACK_SIZE_MASK) >> 8);
1852       break;
1853     }
1854 }
1855 
1856 static void
1857 dump_unwind_encoding (bfd_mach_o_data_struct *mdata, unsigned int encoding)
1858 {
1859   printf ("0x%08x", encoding);
1860   if (encoding == 0)
1861     return;
1862 
1863   switch (mdata->header.cputype)
1864     {
1865     case BFD_MACH_O_CPU_TYPE_X86_64:
1866       dump_unwind_encoding_x86 (encoding, 8, unwind_x86_64_regs);
1867       break;
1868     case BFD_MACH_O_CPU_TYPE_I386:
1869       dump_unwind_encoding_x86 (encoding, 4, unwind_x86_regs);
1870       break;
1871     case BFD_MACH_O_CPU_TYPE_ARM64:
1872       dump_unwind_encoding_arm64 (encoding);
1873       break;
1874     default:
1875       printf (" [unhandled cpu]");
1876       break;
1877     }
1878   if (encoding & MACH_O_UNWIND_HAS_LSDA)
1879     printf (" LSDA");
1880   if (encoding & MACH_O_UNWIND_PERSONALITY_MASK)
1881     printf (" PERS(%u)",
1882 	    ((encoding & MACH_O_UNWIND_PERSONALITY_MASK)
1883 	     >> MACH_O_UNWIND_PERSONALITY_SHIFT));
1884 }
1885 
1886 static void
1887 dump_obj_compact_unwind (bfd *abfd,
1888 			 const unsigned char *content, bfd_size_type size)
1889 {
1890   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
1891   int is_64 = mdata->header.version == 2;
1892   const unsigned char *p;
1893 
1894   printf ("Compact unwind info:\n");
1895   printf (" start            length   personality      lsda\n");
1896 
1897   if (is_64)
1898     {
1899       struct mach_o_compact_unwind_64 *e =
1900 	(struct mach_o_compact_unwind_64 *) content;
1901 
1902       for (p = content; p < content + size; p += sizeof (*e))
1903 	{
1904 	  e = (struct mach_o_compact_unwind_64 *) p;
1905 
1906 	  putchar (' ');
1907 	  printf_uint64 (bfd_get_64 (abfd, e->start));
1908 	  printf (" %08lx", bfd_get_32 (abfd, e->length));
1909 	  putchar (' ');
1910 	  printf_uint64 (bfd_get_64 (abfd, e->personality));
1911 	  putchar (' ');
1912 	  printf_uint64 (bfd_get_64 (abfd, e->lsda));
1913 	  putchar ('\n');
1914 
1915 	  printf ("  encoding: ");
1916 	  dump_unwind_encoding (mdata, bfd_get_32 (abfd, e->encoding));
1917 	  putchar ('\n');
1918 	}
1919     }
1920   else
1921     {
1922       printf ("unhandled\n");
1923     }
1924 }
1925 
1926 static void
1927 dump_exe_compact_unwind (bfd *abfd,
1928 			 const unsigned char *content, bfd_size_type size)
1929 {
1930   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
1931   struct mach_o_unwind_info_header *hdr;
1932   unsigned int version;
1933   unsigned int encodings_offset;
1934   unsigned int encodings_count;
1935   unsigned int personality_offset;
1936   unsigned int personality_count;
1937   unsigned int index_offset;
1938   unsigned int index_count;
1939   struct mach_o_unwind_index_entry *index_entry;
1940   unsigned int i;
1941 
1942   /* The header.  */
1943   printf ("Compact unwind info:\n");
1944 
1945   hdr = (struct mach_o_unwind_info_header *) content;
1946   if (size < sizeof (*hdr))
1947     {
1948       printf ("  truncated!\n");
1949       return;
1950     }
1951 
1952   version = bfd_get_32 (abfd, hdr->version);
1953   if (version != MACH_O_UNWIND_SECTION_VERSION)
1954     {
1955       printf ("  unknown version: %u\n", version);
1956       return;
1957     }
1958   encodings_offset = bfd_get_32 (abfd, hdr->encodings_array_offset);
1959   encodings_count = bfd_get_32 (abfd, hdr->encodings_array_count);
1960   personality_offset = bfd_get_32 (abfd, hdr->personality_array_offset);
1961   personality_count = bfd_get_32 (abfd, hdr->personality_array_count);
1962   index_offset = bfd_get_32 (abfd, hdr->index_offset);
1963   index_count = bfd_get_32 (abfd, hdr->index_count);
1964   printf ("   %u encodings, %u personalities, %u level-1 indexes:\n",
1965 	  encodings_count, personality_count, index_count);
1966 
1967   /* Personality.  */
1968   if (personality_count > 0)
1969     {
1970       const unsigned char *pers = content + personality_offset;
1971 
1972       printf ("   personalities\n");
1973       for (i = 0; i < personality_count; i++)
1974 	printf ("     %u: 0x%08x\n", i,
1975 		(unsigned) bfd_get_32 (abfd, pers + 4 * i));
1976     }
1977 
1978   /* Level-1 index.  */
1979   printf ("   idx function   level2 off lsda off\n");
1980 
1981   index_entry = (struct mach_o_unwind_index_entry *) (content + index_offset);
1982   for (i = 0; i < index_count; i++)
1983     {
1984       unsigned int func_offset;
1985       unsigned int level2_offset;
1986       unsigned int lsda_offset;
1987 
1988       func_offset = bfd_get_32 (abfd, index_entry->function_offset);
1989       level2_offset = bfd_get_32 (abfd, index_entry->second_level_offset);
1990       lsda_offset = bfd_get_32 (abfd, index_entry->lsda_index_offset);
1991       printf ("   %3u 0x%08x 0x%08x 0x%08x\n",
1992 	      i, func_offset, level2_offset, lsda_offset);
1993       index_entry++;
1994     }
1995 
1996   /* Level-1 index.  */
1997   index_entry = (struct mach_o_unwind_index_entry *) (content + index_offset);
1998   for (i = 0; i < index_count; i++)
1999     {
2000       unsigned int func_offset;
2001       unsigned int level2_offset;
2002       const unsigned char *level2;
2003       unsigned int kind;
2004 
2005       func_offset = bfd_get_32 (abfd, index_entry->function_offset);
2006       level2_offset = bfd_get_32 (abfd, index_entry->second_level_offset);
2007 
2008       /* No level-2 for this index (should be the last index).  */
2009       if (level2_offset == 0)
2010 	continue;
2011 
2012       level2 = content + level2_offset;
2013       kind = bfd_get_32 (abfd, level2);
2014       switch (kind)
2015 	{
2016 	case MACH_O_UNWIND_SECOND_LEVEL_COMPRESSED:
2017 	  {
2018 	    struct mach_o_unwind_compressed_second_level_page_header *l2;
2019 	    unsigned int entry_offset;
2020 	    unsigned int entry_count;
2021 	    unsigned int l2_encodings_offset;
2022 	    unsigned int l2_encodings_count;
2023 	    const unsigned char *en;
2024 	    unsigned int j;
2025 
2026 	    l2 = (struct mach_o_unwind_compressed_second_level_page_header *)
2027 	      level2;
2028 	    entry_offset = bfd_get_16 (abfd, l2->entry_page_offset);
2029 	    entry_count = bfd_get_16 (abfd, l2->entry_count);
2030 	    l2_encodings_offset = bfd_get_16 (abfd, l2->encodings_offset);
2031 	    l2_encodings_count = bfd_get_16 (abfd, l2->encodings_count);
2032 
2033 	    printf ("   index %2u: compressed second level: "
2034 		    "%u entries, %u encodings (at 0x%08x)\n",
2035 		    i, entry_count, l2_encodings_count, l2_encodings_offset);
2036 	    printf ("   #    function   eidx  encoding\n");
2037 
2038 	    en = level2 + entry_offset;
2039 	    for (j = 0; j < entry_count; j++)
2040 	      {
2041 		unsigned int entry;
2042 		unsigned int en_func;
2043 		unsigned int enc_idx;
2044 		unsigned int encoding;
2045 		const unsigned char *enc_addr;
2046 
2047 		entry = bfd_get_32 (abfd, en);
2048 		en_func =
2049 		  MACH_O_UNWIND_INFO_COMPRESSED_ENTRY_FUNC_OFFSET (entry);
2050 		enc_idx =
2051 		  MACH_O_UNWIND_INFO_COMPRESSED_ENTRY_ENCODING_INDEX (entry);
2052 		if (enc_idx < encodings_count)
2053 		  enc_addr = content + encodings_offset
2054 		    + 4 * enc_idx;
2055 		else
2056 		  enc_addr = level2 + l2_encodings_offset
2057 		    + 4 * (enc_idx - encodings_count);
2058 		encoding = bfd_get_32 (abfd, enc_addr);
2059 
2060 		printf ("   %4u 0x%08x [%3u] ", j,
2061 			func_offset + en_func, enc_idx);
2062 		dump_unwind_encoding (mdata, encoding);
2063 		putchar ('\n');
2064 
2065 		en += 4;
2066 	      }
2067 	  }
2068 	  break;
2069 
2070 	case MACH_O_UNWIND_SECOND_LEVEL_REGULAR:
2071 	  {
2072 	    struct mach_o_unwind_regular_second_level_page_header *l2;
2073 	    struct mach_o_unwind_regular_second_level_entry *en;
2074 	    unsigned int entry_offset;
2075 	    unsigned int entry_count;
2076 	    unsigned int j;
2077 
2078 	    l2 = (struct mach_o_unwind_regular_second_level_page_header *)
2079 	      level2;
2080 
2081 	    entry_offset = bfd_get_16 (abfd, l2->entry_page_offset);
2082 	    entry_count = bfd_get_16 (abfd, l2->entry_count);
2083 	    printf ("   index %2u: regular level 2 at 0x%04x, %u entries\n",
2084 		    i, entry_offset, entry_count);
2085 	    printf ("   #    function   encoding\n");
2086 
2087 	    en = (struct mach_o_unwind_regular_second_level_entry *)
2088 	      (level2 + entry_offset);
2089 	    for (j = 0; j < entry_count; j++)
2090 	      {
2091 		unsigned int en_func;
2092 		unsigned int encoding;
2093 
2094 		en_func = bfd_get_32 (abfd, en->function_offset);
2095 		encoding = bfd_get_32 (abfd, en->encoding);
2096 		printf ("   %-4u 0x%08x ", j, en_func);
2097 		dump_unwind_encoding (mdata, encoding);
2098 		putchar ('\n');
2099 		en++;
2100 	      }
2101 	  }
2102 	  break;
2103 
2104 	default:
2105 	  printf ("   index %2u: unhandled second level format (%u)\n",
2106 		  i, kind);
2107 	  break;
2108 	}
2109 
2110       {
2111 	struct mach_o_unwind_lsda_index_entry *lsda;
2112 	unsigned int lsda_offset;
2113 	unsigned int next_lsda_offset;
2114 	unsigned int nbr_lsda;
2115 	unsigned int j;
2116 
2117 	lsda_offset = bfd_get_32 (abfd, index_entry->lsda_index_offset);
2118 	next_lsda_offset = bfd_get_32 (abfd, index_entry[1].lsda_index_offset);
2119 	lsda = (struct mach_o_unwind_lsda_index_entry *)
2120 	  (content + lsda_offset);
2121 	nbr_lsda = (next_lsda_offset - lsda_offset) / sizeof (*lsda);
2122 	for (j = 0; j < nbr_lsda; j++)
2123 	  {
2124 	    printf ("   lsda %3u: function 0x%08x lsda 0x%08x\n",
2125 		    j, (unsigned int) bfd_get_32 (abfd, lsda->function_offset),
2126 		    (unsigned int) bfd_get_32 (abfd, lsda->lsda_offset));
2127 	    lsda++;
2128 	  }
2129       }
2130       index_entry++;
2131     }
2132 }
2133 
2134 static void
2135 dump_section_content (bfd *abfd,
2136 		      const char *segname, const char *sectname,
2137 		      void (*dump)(bfd*, const unsigned char*, bfd_size_type))
2138 {
2139   bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
2140   bfd_mach_o_load_command *cmd;
2141 
2142   for (cmd = mdata->first_command; cmd != NULL; cmd = cmd->next)
2143     {
2144       if (cmd->type == BFD_MACH_O_LC_SEGMENT
2145 	  || cmd->type == BFD_MACH_O_LC_SEGMENT_64)
2146 	{
2147 	  bfd_mach_o_segment_command *seg = &cmd->command.segment;
2148 	  bfd_mach_o_section *sec;
2149 	  for (sec = seg->sect_head; sec != NULL; sec = sec->next)
2150 	    if (strcmp (sec->segname, segname) == 0
2151 		&& strcmp (sec->sectname, sectname) == 0)
2152 	      {
2153 		bfd_size_type size;
2154 		asection *bfdsec = sec->bfdsection;
2155 		unsigned char *content;
2156 
2157 		size = bfd_get_section_size (bfdsec);
2158 		content = (unsigned char *) xmalloc (size);
2159 		bfd_get_section_contents (abfd, bfdsec, content, 0, size);
2160 
2161 		(*dump)(abfd, content, size);
2162 
2163 		free (content);
2164 	      }
2165 	}
2166     }
2167 }
2168 
2169 /* Dump ABFD (according to the options[] array).  */
2170 
2171 static void
2172 mach_o_dump (bfd *abfd)
2173 {
2174   if (options[OPT_HEADER].selected)
2175     dump_header (abfd);
2176   if (options[OPT_SECTION].selected)
2177     dump_load_commands (abfd, BFD_MACH_O_LC_SEGMENT, BFD_MACH_O_LC_SEGMENT_64);
2178   if (options[OPT_MAP].selected)
2179     dump_section_map (abfd);
2180   if (options[OPT_LOAD].selected)
2181     dump_load_commands (abfd, 0, 0);
2182   if (options[OPT_DYSYMTAB].selected)
2183     dump_load_commands (abfd, BFD_MACH_O_LC_DYSYMTAB, 0);
2184   if (options[OPT_CODESIGN].selected)
2185     dump_load_commands (abfd, BFD_MACH_O_LC_CODE_SIGNATURE, 0);
2186   if (options[OPT_SEG_SPLIT_INFO].selected)
2187     dump_load_commands (abfd, BFD_MACH_O_LC_SEGMENT_SPLIT_INFO, 0);
2188   if (options[OPT_FUNCTION_STARTS].selected)
2189     dump_load_commands (abfd, BFD_MACH_O_LC_FUNCTION_STARTS, 0);
2190   if (options[OPT_DATA_IN_CODE].selected)
2191     dump_load_commands (abfd, BFD_MACH_O_LC_DATA_IN_CODE, 0);
2192   if (options[OPT_TWOLEVEL_HINTS].selected)
2193     dump_load_commands (abfd, BFD_MACH_O_LC_TWOLEVEL_HINTS, 0);
2194   if (options[OPT_COMPACT_UNWIND].selected)
2195     {
2196       dump_section_content (abfd, "__LD", "__compact_unwind",
2197 			    dump_obj_compact_unwind);
2198       dump_section_content (abfd, "__TEXT", "__unwind_info",
2199 			    dump_exe_compact_unwind);
2200     }
2201   if (options[OPT_DYLD_INFO].selected)
2202     dump_load_commands (abfd, BFD_MACH_O_LC_DYLD_INFO, 0);
2203 }
2204 
2205 /* Vector for Mach-O.  */
2206 
2207 const struct objdump_private_desc objdump_private_desc_mach_o =
2208   {
2209     mach_o_help,
2210     mach_o_filter,
2211     mach_o_dump,
2212     options
2213   };
2214