1 /* od-macho.c -- dump information about an Mach-O object file.
2 Copyright (C) 2011-2014 Free Software Foundation, Inc.
3 Written by Tristan Gingold, Adacore.
5 This file is part of GNU Binutils.
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)
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.
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. */
25 #include "safe-ctype.h"
32 #include "mach-o/external.h"
33 #include "mach-o/codesign.h"
34 #include "mach-o/unwind.h"
36 /* Index of the options in the options[] array. */
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
47 /* List of actions. */
48 static struct objdump_private_option options[] =
56 { "seg_split_info", 0 },
57 { "compact_unwind", 0 },
58 { "function_starts", 0 },
65 mach_o_help (FILE *stream)
69 header Display the file header\n\
70 section Display the segments and sections commands\n\
71 map Display the section map\n\
72 load Display the load commands\n\
73 dysymtab Display the dynamic symbol table\n\
74 codesign Display code signature\n\
75 seg_split_info Display segment split info\n\
76 compact_unwind Display compact unwinding info\n\
77 function_starts Display start address of functions\n\
81 /* Return TRUE if ABFD is handled. */
84 mach_o_filter (bfd *abfd)
86 return bfd_get_flavour (abfd) == bfd_target_mach_o_flavour;
89 static const bfd_mach_o_xlat_name bfd_mach_o_cpu_name[] =
91 { "vax", BFD_MACH_O_CPU_TYPE_VAX },
92 { "mc680x0", BFD_MACH_O_CPU_TYPE_MC680x0 },
93 { "i386", BFD_MACH_O_CPU_TYPE_I386 },
94 { "mips", BFD_MACH_O_CPU_TYPE_MIPS },
95 { "mc98000", BFD_MACH_O_CPU_TYPE_MC98000 },
96 { "hppa", BFD_MACH_O_CPU_TYPE_HPPA },
97 { "arm", BFD_MACH_O_CPU_TYPE_ARM },
98 { "mc88000", BFD_MACH_O_CPU_TYPE_MC88000 },
99 { "sparc", BFD_MACH_O_CPU_TYPE_SPARC },
100 { "i860", BFD_MACH_O_CPU_TYPE_I860 },
101 { "alpha", BFD_MACH_O_CPU_TYPE_ALPHA },
102 { "powerpc", BFD_MACH_O_CPU_TYPE_POWERPC },
103 { "powerpc_64", BFD_MACH_O_CPU_TYPE_POWERPC_64 },
104 { "x86_64", BFD_MACH_O_CPU_TYPE_X86_64 },
105 { "arm64", BFD_MACH_O_CPU_TYPE_ARM64 },
109 static const bfd_mach_o_xlat_name bfd_mach_o_filetype_name[] =
111 { "object", BFD_MACH_O_MH_OBJECT },
112 { "execute", BFD_MACH_O_MH_EXECUTE },
113 { "fvmlib", BFD_MACH_O_MH_FVMLIB },
114 { "core", BFD_MACH_O_MH_CORE },
115 { "preload", BFD_MACH_O_MH_PRELOAD },
116 { "dylib", BFD_MACH_O_MH_DYLIB },
117 { "dylinker", BFD_MACH_O_MH_DYLINKER },
118 { "bundle", BFD_MACH_O_MH_BUNDLE },
119 { "dylib_stub", BFD_MACH_O_MH_DYLIB_STUB },
120 { "dym", BFD_MACH_O_MH_DSYM },
121 { "kext_bundle", BFD_MACH_O_MH_KEXT_BUNDLE },
125 static const bfd_mach_o_xlat_name bfd_mach_o_header_flags_name[] =
127 { "noundefs", BFD_MACH_O_MH_NOUNDEFS },
128 { "incrlink", BFD_MACH_O_MH_INCRLINK },
129 { "dyldlink", BFD_MACH_O_MH_DYLDLINK },
130 { "bindatload", BFD_MACH_O_MH_BINDATLOAD },
131 { "prebound", BFD_MACH_O_MH_PREBOUND },
132 { "split_segs", BFD_MACH_O_MH_SPLIT_SEGS },
133 { "lazy_init", BFD_MACH_O_MH_LAZY_INIT },
134 { "twolevel", BFD_MACH_O_MH_TWOLEVEL },
135 { "force_flat", BFD_MACH_O_MH_FORCE_FLAT },
136 { "nomultidefs", BFD_MACH_O_MH_NOMULTIDEFS },
137 { "nofixprebinding", BFD_MACH_O_MH_NOFIXPREBINDING },
138 { "prebindable", BFD_MACH_O_MH_PREBINDABLE },
139 { "allmodsbound", BFD_MACH_O_MH_ALLMODSBOUND },
140 { "subsections_via_symbols", BFD_MACH_O_MH_SUBSECTIONS_VIA_SYMBOLS },
141 { "canonical", BFD_MACH_O_MH_CANONICAL },
142 { "weak_defines", BFD_MACH_O_MH_WEAK_DEFINES },
143 { "binds_to_weak", BFD_MACH_O_MH_BINDS_TO_WEAK },
144 { "allow_stack_execution", BFD_MACH_O_MH_ALLOW_STACK_EXECUTION },
145 { "root_safe", BFD_MACH_O_MH_ROOT_SAFE },
146 { "setuid_safe", BFD_MACH_O_MH_SETUID_SAFE },
147 { "no_reexported_dylibs", BFD_MACH_O_MH_NO_REEXPORTED_DYLIBS },
148 { "pie", BFD_MACH_O_MH_PIE },
152 static const bfd_mach_o_xlat_name bfd_mach_o_load_command_name[] =
154 { "segment", BFD_MACH_O_LC_SEGMENT},
155 { "symtab", BFD_MACH_O_LC_SYMTAB},
156 { "symseg", BFD_MACH_O_LC_SYMSEG},
157 { "thread", BFD_MACH_O_LC_THREAD},
158 { "unixthread", BFD_MACH_O_LC_UNIXTHREAD},
159 { "loadfvmlib", BFD_MACH_O_LC_LOADFVMLIB},
160 { "idfvmlib", BFD_MACH_O_LC_IDFVMLIB},
161 { "ident", BFD_MACH_O_LC_IDENT},
162 { "fvmfile", BFD_MACH_O_LC_FVMFILE},
163 { "prepage", BFD_MACH_O_LC_PREPAGE},
164 { "dysymtab", BFD_MACH_O_LC_DYSYMTAB},
165 { "load_dylib", BFD_MACH_O_LC_LOAD_DYLIB},
166 { "id_dylib", BFD_MACH_O_LC_ID_DYLIB},
167 { "load_dylinker", BFD_MACH_O_LC_LOAD_DYLINKER},
168 { "id_dylinker", BFD_MACH_O_LC_ID_DYLINKER},
169 { "prebound_dylib", BFD_MACH_O_LC_PREBOUND_DYLIB},
170 { "routines", BFD_MACH_O_LC_ROUTINES},
171 { "sub_framework", BFD_MACH_O_LC_SUB_FRAMEWORK},
172 { "sub_umbrella", BFD_MACH_O_LC_SUB_UMBRELLA},
173 { "sub_client", BFD_MACH_O_LC_SUB_CLIENT},
174 { "sub_library", BFD_MACH_O_LC_SUB_LIBRARY},
175 { "twolevel_hints", BFD_MACH_O_LC_TWOLEVEL_HINTS},
176 { "prebind_cksum", BFD_MACH_O_LC_PREBIND_CKSUM},
177 { "load_weak_dylib", BFD_MACH_O_LC_LOAD_WEAK_DYLIB},
178 { "segment_64", BFD_MACH_O_LC_SEGMENT_64},
179 { "routines_64", BFD_MACH_O_LC_ROUTINES_64},
180 { "uuid", BFD_MACH_O_LC_UUID},
181 { "rpath", BFD_MACH_O_LC_RPATH},
182 { "code_signature", BFD_MACH_O_LC_CODE_SIGNATURE},
183 { "segment_split_info", BFD_MACH_O_LC_SEGMENT_SPLIT_INFO},
184 { "reexport_dylib", BFD_MACH_O_LC_REEXPORT_DYLIB},
185 { "lazy_load_dylib", BFD_MACH_O_LC_LAZY_LOAD_DYLIB},
186 { "encryption_info", BFD_MACH_O_LC_ENCRYPTION_INFO},
187 { "dyld_info", BFD_MACH_O_LC_DYLD_INFO},
188 { "load_upward_lib", BFD_MACH_O_LC_LOAD_UPWARD_DYLIB},
189 { "version_min_macosx", BFD_MACH_O_LC_VERSION_MIN_MACOSX},
190 { "version_min_iphoneos", BFD_MACH_O_LC_VERSION_MIN_IPHONEOS},
191 { "function_starts", BFD_MACH_O_LC_FUNCTION_STARTS},
192 { "dyld_environment", BFD_MACH_O_LC_DYLD_ENVIRONMENT},
193 { "main", BFD_MACH_O_LC_MAIN},
194 { "data_in_code", BFD_MACH_O_LC_DATA_IN_CODE},
195 { "source_version", BFD_MACH_O_LC_SOURCE_VERSION},
196 { "dylib_code_sign_drs", BFD_MACH_O_LC_DYLIB_CODE_SIGN_DRS},
200 static const bfd_mach_o_xlat_name bfd_mach_o_thread_x86_name[] =
202 { "thread_state32", BFD_MACH_O_x86_THREAD_STATE32},
203 { "float_state32", BFD_MACH_O_x86_FLOAT_STATE32},
204 { "exception_state32", BFD_MACH_O_x86_EXCEPTION_STATE32},
205 { "thread_state64", BFD_MACH_O_x86_THREAD_STATE64},
206 { "float_state64", BFD_MACH_O_x86_FLOAT_STATE64},
207 { "exception_state64", BFD_MACH_O_x86_EXCEPTION_STATE64},
208 { "thread_state", BFD_MACH_O_x86_THREAD_STATE},
209 { "float_state", BFD_MACH_O_x86_FLOAT_STATE},
210 { "exception_state", BFD_MACH_O_x86_EXCEPTION_STATE},
211 { "debug_state32", BFD_MACH_O_x86_DEBUG_STATE32},
212 { "debug_state64", BFD_MACH_O_x86_DEBUG_STATE64},
213 { "debug_state", BFD_MACH_O_x86_DEBUG_STATE},
214 { "state_none", BFD_MACH_O_x86_THREAD_STATE_NONE},
219 bfd_mach_o_print_flags (const bfd_mach_o_xlat_name *table,
224 for (; table->name; table++)
226 if (table->val & val)
230 printf ("%s", table->name);
239 printf ("0x%lx", val);
247 bfd_mach_o_get_name_or_null (const bfd_mach_o_xlat_name *table,
250 for (; table->name; table++)
251 if (table->val == val)
257 bfd_mach_o_get_name (const bfd_mach_o_xlat_name *table, unsigned long val)
259 const char *res = bfd_mach_o_get_name_or_null (table, val);
268 dump_header (bfd *abfd)
270 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
271 bfd_mach_o_header *h = &mdata->header;
273 fputs (_("Mach-O header:\n"), stdout);
274 printf (_(" magic : %08lx\n"), h->magic);
275 printf (_(" cputype : %08lx (%s)\n"), h->cputype,
276 bfd_mach_o_get_name (bfd_mach_o_cpu_name, h->cputype));
277 printf (_(" cpusubtype: %08lx\n"), h->cpusubtype);
278 printf (_(" filetype : %08lx (%s)\n"),
280 bfd_mach_o_get_name (bfd_mach_o_filetype_name, h->filetype));
281 printf (_(" ncmds : %08lx (%lu)\n"), h->ncmds, h->ncmds);
282 printf (_(" sizeofcmds: %08lx\n"), h->sizeofcmds);
283 printf (_(" flags : %08lx ("), h->flags);
284 bfd_mach_o_print_flags (bfd_mach_o_header_flags_name, h->flags);
285 fputs (_(")\n"), stdout);
286 printf (_(" reserved : %08x\n"), h->reserved);
290 disp_segment_prot (unsigned int prot)
292 putchar (prot & BFD_MACH_O_PROT_READ ? 'r' : '-');
293 putchar (prot & BFD_MACH_O_PROT_WRITE ? 'w' : '-');
294 putchar (prot & BFD_MACH_O_PROT_EXECUTE ? 'x' : '-');
298 dump_section_map (bfd *abfd)
300 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
302 unsigned int sec_nbr = 0;
304 fputs (_("Segments and Sections:\n"), stdout);
305 fputs (_(" #: Segment name Section name Address\n"), stdout);
307 for (i = 0; i < mdata->header.ncmds; i++)
309 bfd_mach_o_segment_command *seg;
310 bfd_mach_o_section *sec;
312 if (mdata->commands[i].type != BFD_MACH_O_LC_SEGMENT
313 && mdata->commands[i].type != BFD_MACH_O_LC_SEGMENT_64)
316 seg = &mdata->commands[i].command.segment;
318 printf ("[Segment %-16s ", seg->segname);
319 printf_vma (seg->vmaddr);
321 printf_vma (seg->vmaddr + seg->vmsize - 1);
323 disp_segment_prot (seg->initprot);
326 for (sec = seg->sect_head; sec != NULL; sec = sec->next)
328 printf ("%02u: %-16s %-16s ", ++sec_nbr,
329 sec->segname, sec->sectname);
330 printf_vma (sec->addr);
332 printf_vma (sec->size);
333 printf (" %08lx\n", sec->flags);
339 dump_section_header (bfd *abfd ATTRIBUTE_UNUSED, bfd_mach_o_section *sec)
341 printf (" Section: %-16s %-16s (bfdname: %s)\n",
342 sec->sectname, sec->segname, sec->bfdsection->name);
344 printf_vma (sec->addr);
346 printf_vma (sec->size);
347 printf (" offset: ");
348 printf_vma (sec->offset);
350 printf (" align: %ld", sec->align);
351 printf (" nreloc: %lu reloff: ", sec->nreloc);
352 printf_vma (sec->reloff);
354 printf (" flags: %08lx (type: %s", sec->flags,
355 bfd_mach_o_get_name (bfd_mach_o_section_type_name,
356 sec->flags & BFD_MACH_O_SECTION_TYPE_MASK));
358 bfd_mach_o_print_flags (bfd_mach_o_section_attribute_name,
359 sec->flags & BFD_MACH_O_SECTION_ATTRIBUTES_MASK);
361 switch (sec->flags & BFD_MACH_O_SECTION_TYPE_MASK)
363 case BFD_MACH_O_S_NON_LAZY_SYMBOL_POINTERS:
364 case BFD_MACH_O_S_LAZY_SYMBOL_POINTERS:
365 case BFD_MACH_O_S_SYMBOL_STUBS:
366 printf (" first indirect sym: %lu", sec->reserved1);
367 printf (" (%u entries)",
368 bfd_mach_o_section_get_nbr_indirect (abfd, sec));
371 printf (" reserved1: 0x%lx", sec->reserved1);
374 switch (sec->flags & BFD_MACH_O_SECTION_TYPE_MASK)
376 case BFD_MACH_O_S_SYMBOL_STUBS:
377 printf (" stub size: %lu", sec->reserved2);
380 printf (" reserved2: 0x%lx", sec->reserved2);
383 printf (" reserved3: 0x%lx\n", sec->reserved3);
387 dump_segment (bfd *abfd ATTRIBUTE_UNUSED, bfd_mach_o_load_command *cmd)
389 bfd_mach_o_segment_command *seg = &cmd->command.segment;
390 bfd_mach_o_section *sec;
392 printf (" name: %s\n", *seg->segname ? seg->segname : "*none*");
393 printf (" vmaddr: ");
394 printf_vma (seg->vmaddr);
395 printf (" vmsize: ");
396 printf_vma (seg->vmsize);
398 printf (" fileoff: ");
399 printf_vma (seg->fileoff);
400 printf (" filesize: ");
401 printf_vma ((bfd_vma)seg->filesize);
402 printf (" endoff: ");
403 printf_vma ((bfd_vma)(seg->fileoff + seg->filesize));
405 printf (" nsects: %lu", seg->nsects);
406 printf (" flags: %lx", seg->flags);
407 printf (" initprot: ");
408 disp_segment_prot (seg->initprot);
409 printf (" maxprot: ");
410 disp_segment_prot (seg->maxprot);
412 for (sec = seg->sect_head; sec != NULL; sec = sec->next)
413 dump_section_header (abfd, sec);
417 dump_dysymtab (bfd *abfd, bfd_mach_o_load_command *cmd, bfd_boolean verbose)
419 bfd_mach_o_dysymtab_command *dysymtab = &cmd->command.dysymtab;
420 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
423 printf (" local symbols: idx: %10lu num: %-8lu",
424 dysymtab->ilocalsym, dysymtab->nlocalsym);
425 printf (" (nxtidx: %lu)\n",
426 dysymtab->ilocalsym + dysymtab->nlocalsym);
427 printf (" external symbols: idx: %10lu num: %-8lu",
428 dysymtab->iextdefsym, dysymtab->nextdefsym);
429 printf (" (nxtidx: %lu)\n",
430 dysymtab->iextdefsym + dysymtab->nextdefsym);
431 printf (" undefined symbols: idx: %10lu num: %-8lu",
432 dysymtab->iundefsym, dysymtab->nundefsym);
433 printf (" (nxtidx: %lu)\n",
434 dysymtab->iundefsym + dysymtab->nundefsym);
435 printf (" table of content: off: 0x%08lx num: %-8lu",
436 dysymtab->tocoff, dysymtab->ntoc);
437 printf (" (endoff: 0x%08lx)\n",
438 dysymtab->tocoff + dysymtab->ntoc * BFD_MACH_O_TABLE_OF_CONTENT_SIZE);
439 printf (" module table: off: 0x%08lx num: %-8lu",
440 dysymtab->modtaboff, dysymtab->nmodtab);
441 printf (" (endoff: 0x%08lx)\n",
442 dysymtab->modtaboff + dysymtab->nmodtab
443 * (mdata->header.version == 2 ?
444 BFD_MACH_O_DYLIB_MODULE_64_SIZE : BFD_MACH_O_DYLIB_MODULE_SIZE));
445 printf (" external reference table: off: 0x%08lx num: %-8lu",
446 dysymtab->extrefsymoff, dysymtab->nextrefsyms);
447 printf (" (endoff: 0x%08lx)\n",
448 dysymtab->extrefsymoff
449 + dysymtab->nextrefsyms * BFD_MACH_O_REFERENCE_SIZE);
450 printf (" indirect symbol table: off: 0x%08lx num: %-8lu",
451 dysymtab->indirectsymoff, dysymtab->nindirectsyms);
452 printf (" (endoff: 0x%08lx)\n",
453 dysymtab->indirectsymoff
454 + dysymtab->nindirectsyms * BFD_MACH_O_INDIRECT_SYMBOL_SIZE);
455 printf (" external relocation table: off: 0x%08lx num: %-8lu",
456 dysymtab->extreloff, dysymtab->nextrel);
457 printf (" (endoff: 0x%08lx)\n",
458 dysymtab->extreloff + dysymtab->nextrel * BFD_MACH_O_RELENT_SIZE);
459 printf (" local relocation table: off: 0x%08lx num: %-8lu",
460 dysymtab->locreloff, dysymtab->nlocrel);
461 printf (" (endoff: 0x%08lx)\n",
462 dysymtab->locreloff + dysymtab->nlocrel * BFD_MACH_O_RELENT_SIZE);
467 if (dysymtab->ntoc > 0
468 || dysymtab->nindirectsyms > 0
469 || dysymtab->nextrefsyms > 0)
471 /* Try to read the symbols to display the toc or indirect symbols. */
472 bfd_mach_o_read_symtab_symbols (abfd);
474 else if (dysymtab->nmodtab > 0)
476 /* Try to read the strtab to display modules name. */
477 bfd_mach_o_read_symtab_strtab (abfd);
480 for (i = 0; i < dysymtab->nmodtab; i++)
482 bfd_mach_o_dylib_module *module = &dysymtab->dylib_module[i];
483 printf (" module %u:\n", i);
484 printf (" name: %lu", module->module_name_idx);
485 if (mdata->symtab && mdata->symtab->strtab)
487 mdata->symtab->strtab + module->module_name_idx);
489 printf (" extdefsym: idx: %8lu num: %lu\n",
490 module->iextdefsym, module->nextdefsym);
491 printf (" refsym: idx: %8lu num: %lu\n",
492 module->irefsym, module->nrefsym);
493 printf (" localsym: idx: %8lu num: %lu\n",
494 module->ilocalsym, module->nlocalsym);
495 printf (" extrel: idx: %8lu num: %lu\n",
496 module->iextrel, module->nextrel);
497 printf (" init: idx: %8u num: %u\n",
498 module->iinit, module->ninit);
499 printf (" term: idx: %8u num: %u\n",
500 module->iterm, module->nterm);
501 printf (" objc_module_info: addr: ");
502 printf_vma (module->objc_module_info_addr);
503 printf (" size: %lu\n", module->objc_module_info_size);
506 if (dysymtab->ntoc > 0)
508 bfd_mach_o_symtab_command *symtab = mdata->symtab;
510 printf (" table of content: (symbol/module)\n");
511 for (i = 0; i < dysymtab->ntoc; i++)
513 bfd_mach_o_dylib_table_of_content *toc = &dysymtab->dylib_toc[i];
515 printf (" %4u: ", i);
516 if (symtab && symtab->symbols && toc->symbol_index < symtab->nsyms)
518 const char *name = symtab->symbols[toc->symbol_index].symbol.name;
519 printf ("%s (%lu)", name ? name : "*invalid*",
523 printf ("%lu", toc->symbol_index);
526 if (symtab && symtab->strtab
527 && toc->module_index < dysymtab->nmodtab)
529 bfd_mach_o_dylib_module *mod;
530 mod = &dysymtab->dylib_module[toc->module_index];
532 symtab->strtab + mod->module_name_idx,
536 printf ("%lu", toc->module_index);
542 if (dysymtab->nindirectsyms != 0)
544 printf (" indirect symbols:\n");
546 for (i = 0; i < mdata->nsects; i++)
548 bfd_mach_o_section *sec = mdata->sections[i];
549 unsigned int j, first, last;
550 bfd_mach_o_symtab_command *symtab = mdata->symtab;
554 switch (sec->flags & BFD_MACH_O_SECTION_TYPE_MASK)
556 case BFD_MACH_O_S_NON_LAZY_SYMBOL_POINTERS:
557 case BFD_MACH_O_S_LAZY_SYMBOL_POINTERS:
558 case BFD_MACH_O_S_SYMBOL_STUBS:
559 first = sec->reserved1;
560 last = first + bfd_mach_o_section_get_nbr_indirect (abfd, sec);
562 entry_size = bfd_mach_o_section_get_entry_size (abfd, sec);
563 printf (" for section %s.%s:\n",
564 sec->segname, sec->sectname);
565 for (j = first; j < last; j++)
567 unsigned int isym = dysymtab->indirect_syms[j];
571 printf (" %5u: 0x%08x", j, isym);
572 if (isym & BFD_MACH_O_INDIRECT_SYMBOL_LOCAL)
574 if (isym & BFD_MACH_O_INDIRECT_SYMBOL_ABS)
575 printf (" ABSOLUTE");
576 if (symtab && symtab->symbols
577 && isym < symtab->nsyms
578 && symtab->symbols[isym].symbol.name)
579 printf (" %s", symtab->symbols[isym].symbol.name);
589 if (dysymtab->nextrefsyms > 0)
591 bfd_mach_o_symtab_command *symtab = mdata->symtab;
593 printf (" external reference table: (symbol flags)\n");
594 for (i = 0; i < dysymtab->nextrefsyms; i++)
596 bfd_mach_o_dylib_reference *ref = &dysymtab->ext_refs[i];
598 printf (" %4u: %5lu 0x%02lx", i, ref->isym, ref->flags);
599 if (symtab && symtab->symbols
600 && ref->isym < symtab->nsyms
601 && symtab->symbols[ref->isym].symbol.name)
602 printf (" %s", symtab->symbols[ref->isym].symbol.name);
610 dump_dyld_info (bfd *abfd ATTRIBUTE_UNUSED, bfd_mach_o_load_command *cmd)
612 bfd_mach_o_dyld_info_command *info = &cmd->command.dyld_info;
614 printf (" rebase: off: 0x%08x size: %-8u\n",
615 info->rebase_off, info->rebase_size);
616 printf (" bind: off: 0x%08x size: %-8u\n",
617 info->bind_off, info->bind_size);
618 printf (" weak bind: off: 0x%08x size: %-8u\n",
619 info->weak_bind_off, info->weak_bind_size);
620 printf (" lazy bind: off: 0x%08x size: %-8u\n",
621 info->lazy_bind_off, info->lazy_bind_size);
622 printf (" export: off: 0x%08x size: %-8u\n",
623 info->export_off, info->export_size);
627 dump_thread (bfd *abfd, bfd_mach_o_load_command *cmd)
629 bfd_mach_o_thread_command *thread = &cmd->command.thread;
631 bfd_mach_o_backend_data *bed = bfd_mach_o_get_backend_data (abfd);
632 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
634 printf (" nflavours: %lu\n", thread->nflavours);
635 for (j = 0; j < thread->nflavours; j++)
637 bfd_mach_o_thread_flavour *flavour = &thread->flavours[j];
638 const bfd_mach_o_xlat_name *name_table;
640 printf (" %2u: flavour: 0x%08lx", j, flavour->flavour);
641 switch (mdata->header.cputype)
643 case BFD_MACH_O_CPU_TYPE_I386:
644 case BFD_MACH_O_CPU_TYPE_X86_64:
645 name_table = bfd_mach_o_thread_x86_name;
651 if (name_table != NULL)
652 printf (": %s", bfd_mach_o_get_name (name_table, flavour->flavour));
655 printf (" offset: 0x%08lx size: 0x%08lx\n",
656 flavour->offset, flavour->size);
657 if (bed->_bfd_mach_o_print_thread)
659 char *buf = xmalloc (flavour->size);
661 if (bfd_seek (abfd, flavour->offset, SEEK_SET) == 0
662 && bfd_bread (buf, flavour->size, abfd) == flavour->size)
663 (*bed->_bfd_mach_o_print_thread)(abfd, flavour, stdout, buf);
670 static const bfd_mach_o_xlat_name bfd_mach_o_cs_magic[] =
672 { "embedded signature", BFD_MACH_O_CS_MAGIC_EMBEDDED_SIGNATURE },
673 { "requirement", BFD_MACH_O_CS_MAGIC_REQUIREMENT },
674 { "requirements", BFD_MACH_O_CS_MAGIC_REQUIREMENTS },
675 { "code directory", BFD_MACH_O_CS_MAGIC_CODEDIRECTORY },
676 { "embedded entitlements", BFD_MACH_O_CS_MAGIC_EMBEDDED_ENTITLEMENTS },
677 { "blob wrapper", BFD_MACH_O_CS_MAGIC_BLOB_WRAPPER },
681 static const bfd_mach_o_xlat_name bfd_mach_o_cs_hash_type[] =
683 { "no-hash", BFD_MACH_O_CS_NO_HASH },
684 { "sha1", BFD_MACH_O_CS_HASH_SHA1 },
685 { "sha256", BFD_MACH_O_CS_HASH_SHA256 },
686 { "skein 160", BFD_MACH_O_CS_HASH_PRESTANDARD_SKEIN_160x256 },
687 { "skein 256", BFD_MACH_O_CS_HASH_PRESTANDARD_SKEIN_256x512 },
692 dump_code_signature_blob (bfd *abfd, const unsigned char *buf, unsigned int len);
695 dump_code_signature_superblob (bfd *abfd ATTRIBUTE_UNUSED,
696 const unsigned char *buf, unsigned int len)
703 printf (_(" [bad block length]\n"));
706 count = bfd_getb32 (buf + 8);
707 printf (_(" %u index entries:\n"), count);
708 if (len < 12 + 8 * count)
710 printf (_(" [bad block length]\n"));
713 for (i = 0; i < count; i++)
718 type = bfd_getb32 (buf + 12 + 8 * i);
719 off = bfd_getb32 (buf + 12 + 8 * i + 4);
720 printf (_(" index entry %u: type: %08x, offset: %08x\n"),
723 dump_code_signature_blob (abfd, buf + off, len - off);
728 swap_code_codedirectory_v1_in
729 (const struct mach_o_codesign_codedirectory_external_v1 *src,
730 struct mach_o_codesign_codedirectory_v1 *dst)
732 dst->version = bfd_getb32 (src->version);
733 dst->flags = bfd_getb32 (src->flags);
734 dst->hash_offset = bfd_getb32 (src->hash_offset);
735 dst->ident_offset = bfd_getb32 (src->ident_offset);
736 dst->nbr_special_slots = bfd_getb32 (src->nbr_special_slots);
737 dst->nbr_code_slots = bfd_getb32 (src->nbr_code_slots);
738 dst->code_limit = bfd_getb32 (src->code_limit);
739 dst->hash_size = src->hash_size[0];
740 dst->hash_type = src->hash_type[0];
741 dst->spare1 = src->spare1[0];
742 dst->page_size = src->page_size[0];
743 dst->spare2 = bfd_getb32 (src->spare2);
747 hexdump (unsigned int start, unsigned int len,
748 const unsigned char *buf)
752 for (i = 0; i < len; i += 16)
754 printf ("%08x:", start + i);
755 for (j = 0; j < 16; j++)
757 fputc (j == 8 ? '-' : ' ', stdout);
759 printf ("%02x", buf[i + j]);
764 for (j = 0; j < 16; j++)
767 fputc (ISPRINT (buf[i + j]) ? buf[i + j] : '.', stdout);
771 fputc ('\n', stdout);
776 dump_code_signature_codedirectory (bfd *abfd ATTRIBUTE_UNUSED,
777 const unsigned char *buf, unsigned int len)
779 struct mach_o_codesign_codedirectory_v1 cd;
782 if (len < sizeof (struct mach_o_codesign_codedirectory_external_v1))
784 printf (_(" [bad block length]\n"));
788 swap_code_codedirectory_v1_in
789 ((const struct mach_o_codesign_codedirectory_external_v1 *) (buf + 8), &cd);
791 printf (_(" version: %08x\n"), cd.version);
792 printf (_(" flags: %08x\n"), cd.flags);
793 printf (_(" hash offset: %08x\n"), cd.hash_offset);
794 id = (const char *) buf + cd.ident_offset;
795 printf (_(" ident offset: %08x (- %08x)\n"),
796 cd.ident_offset, cd.ident_offset + (unsigned) strlen (id) + 1);
797 printf (_(" identity: %s\n"), id);
798 printf (_(" nbr special slots: %08x (at offset %08x)\n"),
799 cd.nbr_special_slots,
800 cd.hash_offset - cd.nbr_special_slots * cd.hash_size);
801 printf (_(" nbr code slots: %08x\n"), cd.nbr_code_slots);
802 printf (_(" code limit: %08x\n"), cd.code_limit);
803 printf (_(" hash size: %02x\n"), cd.hash_size);
804 printf (_(" hash type: %02x (%s)\n"),
806 bfd_mach_o_get_name (bfd_mach_o_cs_hash_type, cd.hash_type));
807 printf (_(" spare1: %02x\n"), cd.spare1);
808 printf (_(" page size: %02x\n"), cd.page_size);
809 printf (_(" spare2: %08x\n"), cd.spare2);
810 if (cd.version >= 0x20100)
811 printf (_(" scatter offset: %08x\n"),
812 (unsigned) bfd_getb32 (buf + 44));
816 dump_code_signature_blob (bfd *abfd, const unsigned char *buf, unsigned int len)
823 printf (_(" [truncated block]\n"));
826 magic = bfd_getb32 (buf);
827 length = bfd_getb32 (buf + 4);
828 if (magic == 0 || length == 0)
831 printf (_(" magic : %08x (%s)\n"), magic,
832 bfd_mach_o_get_name (bfd_mach_o_cs_magic, magic));
833 printf (_(" length: %08x\n"), length);
836 printf (_(" [bad block length]\n"));
842 case BFD_MACH_O_CS_MAGIC_EMBEDDED_SIGNATURE:
843 dump_code_signature_superblob (abfd, buf, length);
845 case BFD_MACH_O_CS_MAGIC_CODEDIRECTORY:
846 dump_code_signature_codedirectory (abfd, buf, length);
849 hexdump (0, length - 8, buf + 8);
856 dump_code_signature (bfd *abfd, bfd_mach_o_linkedit_command *cmd)
858 unsigned char *buf = xmalloc (cmd->datasize);
861 if (bfd_seek (abfd, cmd->dataoff, SEEK_SET) != 0
862 || bfd_bread (buf, cmd->datasize, abfd) != cmd->datasize)
864 non_fatal (_("cannot read code signature data"));
868 for (off = 0; off < cmd->datasize;)
872 len = dump_code_signature_blob (abfd, buf + off, cmd->datasize - off);
882 dump_segment_split_info (bfd *abfd, bfd_mach_o_linkedit_command *cmd)
884 unsigned char *buf = xmalloc (cmd->datasize);
889 if (bfd_seek (abfd, cmd->dataoff, SEEK_SET) != 0
890 || bfd_bread (buf, cmd->datasize, abfd) != cmd->datasize)
892 non_fatal (_("cannot read segment split info"));
896 if (buf[cmd->datasize - 1] != 0)
898 non_fatal (_("segment split info is not nul terminated"));
906 printf (_(" 32 bit pointers:\n"));
909 printf (_(" 64 bit pointers:\n"));
912 printf (_(" PPC hi-16:\n"));
915 printf (_(" Unhandled location type %u\n"), buf[0]);
918 for (p = buf + 1; *p != 0; p += len)
920 addr += read_unsigned_leb128 (abfd, p, &len);
922 bfd_printf_vma (abfd, addr);
929 dump_function_starts (bfd *abfd, bfd_mach_o_linkedit_command *cmd)
931 unsigned char *buf = xmalloc (cmd->datasize);
932 unsigned char *end_buf = buf + cmd->datasize;
936 if (bfd_seek (abfd, cmd->dataoff, SEEK_SET) != 0
937 || bfd_bread (buf, cmd->datasize, abfd) != cmd->datasize)
939 non_fatal (_("cannot read function starts"));
944 /* Function starts are delta encoded, starting from the base address. */
945 addr = bfd_mach_o_get_base_address (abfd);
950 unsigned int shift = 0;
952 if (*p == 0 || p == end_buf)
956 unsigned char b = *p++;
958 delta |= (b & 0x7f) << shift;
963 fputs (" [truncated]\n", stdout);
971 bfd_printf_vma (abfd, addr);
978 dump_load_command (bfd *abfd, bfd_mach_o_load_command *cmd,
981 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
982 const char *cmd_name;
984 cmd_name = bfd_mach_o_get_name_or_null
985 (bfd_mach_o_load_command_name, cmd->type);
986 printf ("Load command ");
987 if (cmd_name == NULL)
988 printf ("0x%02x:", cmd->type);
990 printf ("%s:", cmd_name);
994 case BFD_MACH_O_LC_SEGMENT:
995 case BFD_MACH_O_LC_SEGMENT_64:
996 dump_segment (abfd, cmd);
998 case BFD_MACH_O_LC_UUID:
1000 bfd_mach_o_uuid_command *uuid = &cmd->command.uuid;
1003 for (j = 0; j < sizeof (uuid->uuid); j ++)
1004 printf (" %02x", uuid->uuid[j]);
1008 case BFD_MACH_O_LC_LOAD_DYLIB:
1009 case BFD_MACH_O_LC_LAZY_LOAD_DYLIB:
1010 case BFD_MACH_O_LC_LOAD_WEAK_DYLIB:
1011 case BFD_MACH_O_LC_REEXPORT_DYLIB:
1012 case BFD_MACH_O_LC_ID_DYLIB:
1013 case BFD_MACH_O_LC_LOAD_UPWARD_DYLIB:
1015 bfd_mach_o_dylib_command *dylib = &cmd->command.dylib;
1016 printf (" %s\n", dylib->name_str);
1017 printf (" time stamp: 0x%08lx\n",
1019 printf (" current version: 0x%08lx\n",
1020 dylib->current_version);
1021 printf (" comptibility version: 0x%08lx\n",
1022 dylib->compatibility_version);
1025 case BFD_MACH_O_LC_LOAD_DYLINKER:
1026 case BFD_MACH_O_LC_ID_DYLINKER:
1027 printf (" %s\n", cmd->command.dylinker.name_str);
1029 case BFD_MACH_O_LC_DYLD_ENVIRONMENT:
1031 printf (" %s\n", cmd->command.dylinker.name_str);
1033 case BFD_MACH_O_LC_SYMTAB:
1035 bfd_mach_o_symtab_command *symtab = &cmd->command.symtab;
1037 " symoff: 0x%08x nsyms: %8u (endoff: 0x%08x)\n",
1038 symtab->symoff, symtab->nsyms,
1039 symtab->symoff + symtab->nsyms
1040 * (mdata->header.version == 2
1041 ? BFD_MACH_O_NLIST_64_SIZE : BFD_MACH_O_NLIST_SIZE));
1042 printf (" stroff: 0x%08x strsize: %8u (endoff: 0x%08x)\n",
1043 symtab->stroff, symtab->strsize,
1044 symtab->stroff + symtab->strsize);
1047 case BFD_MACH_O_LC_DYSYMTAB:
1049 dump_dysymtab (abfd, cmd, verbose);
1051 case BFD_MACH_O_LC_LOADFVMLIB:
1052 case BFD_MACH_O_LC_IDFVMLIB:
1054 bfd_mach_o_fvmlib_command *fvmlib = &cmd->command.fvmlib;
1055 printf (" %s\n", fvmlib->name_str);
1056 printf (" minor version: 0x%08x\n", fvmlib->minor_version);
1057 printf (" header address: 0x%08x\n", fvmlib->header_addr);
1060 case BFD_MACH_O_LC_CODE_SIGNATURE:
1061 case BFD_MACH_O_LC_SEGMENT_SPLIT_INFO:
1062 case BFD_MACH_O_LC_FUNCTION_STARTS:
1063 case BFD_MACH_O_LC_DATA_IN_CODE:
1064 case BFD_MACH_O_LC_DYLIB_CODE_SIGN_DRS:
1066 bfd_mach_o_linkedit_command *linkedit = &cmd->command.linkedit;
1069 " dataoff: 0x%08lx datasize: 0x%08lx (endoff: 0x%08lx)\n",
1070 linkedit->dataoff, linkedit->datasize,
1071 linkedit->dataoff + linkedit->datasize);
1073 if (verbose && cmd->type == BFD_MACH_O_LC_CODE_SIGNATURE)
1074 dump_code_signature (abfd, linkedit);
1075 else if (verbose && cmd->type == BFD_MACH_O_LC_SEGMENT_SPLIT_INFO)
1076 dump_segment_split_info (abfd, linkedit);
1077 else if (verbose && cmd->type == BFD_MACH_O_LC_FUNCTION_STARTS)
1078 dump_function_starts (abfd, linkedit);
1081 case BFD_MACH_O_LC_SUB_FRAMEWORK:
1082 case BFD_MACH_O_LC_SUB_UMBRELLA:
1083 case BFD_MACH_O_LC_SUB_LIBRARY:
1084 case BFD_MACH_O_LC_SUB_CLIENT:
1085 case BFD_MACH_O_LC_RPATH:
1087 bfd_mach_o_str_command *str = &cmd->command.str;
1088 printf (" %s\n", str->str);
1091 case BFD_MACH_O_LC_THREAD:
1092 case BFD_MACH_O_LC_UNIXTHREAD:
1093 dump_thread (abfd, cmd);
1095 case BFD_MACH_O_LC_ENCRYPTION_INFO:
1097 bfd_mach_o_encryption_info_command *cryp =
1098 &cmd->command.encryption_info;
1101 " cryptoff: 0x%08x cryptsize: 0x%08x (endoff 0x%08x)"
1103 cryp->cryptoff, cryp->cryptsize,
1104 cryp->cryptoff + cryp->cryptsize,
1108 case BFD_MACH_O_LC_DYLD_INFO:
1110 dump_dyld_info (abfd, cmd);
1112 case BFD_MACH_O_LC_VERSION_MIN_MACOSX:
1113 case BFD_MACH_O_LC_VERSION_MIN_IPHONEOS:
1115 bfd_mach_o_version_min_command *ver = &cmd->command.version_min;
1117 printf (" %u.%u.%u\n", ver->rel, ver->maj, ver->min);
1120 case BFD_MACH_O_LC_SOURCE_VERSION:
1122 bfd_mach_o_source_version_command *version =
1123 &cmd->command.source_version;
1125 " version a.b.c.d.e: %u.%u.%u.%u.%u\n",
1126 version->a, version->b, version->c, version->d, version->e);
1129 case BFD_MACH_O_LC_MAIN:
1131 bfd_mach_o_main_command *entry = &cmd->command.main;
1134 printf_vma (entry->entryoff);
1137 printf_vma (entry->stacksize);
1143 printf (" offset: 0x%08lx\n", (unsigned long)cmd->offset);
1144 printf (" size: 0x%08lx\n", (unsigned long)cmd->len);
1151 dump_load_commands (bfd *abfd, unsigned int cmd32, unsigned int cmd64)
1153 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
1156 for (i = 0; i < mdata->header.ncmds; i++)
1158 bfd_mach_o_load_command *cmd = &mdata->commands[i];
1161 dump_load_command (abfd, cmd, FALSE);
1162 else if (cmd->type == cmd32 || cmd->type == cmd64)
1163 dump_load_command (abfd, cmd, TRUE);
1167 static const char * const unwind_x86_64_regs[] =
1168 {"", "rbx", "r12", "r13", "r14", "r15", "rbp", "???" };
1170 static const char * const unwind_x86_regs[] =
1171 {"", "ebx", "ecx", "edx", "edi", "edi", "ebp", "???" };
1173 /* Dump x86 or x86-64 compact unwind encoding. Works for both architecture,
1174 as the encoding is the same (but not register names). */
1177 dump_unwind_encoding_x86 (unsigned int encoding, unsigned int sz,
1178 const char * const regs_name[])
1182 mode = encoding & MACH_O_UNWIND_X86_64_MODE_MASK;
1185 case MACH_O_UNWIND_X86_64_MODE_RBP_FRAME:
1188 char pfx = sz == 8 ? 'R' : 'E';
1190 regs = encoding & MACH_O_UNWIND_X86_64_RBP_FRAME_REGSITERS;
1191 printf (" %cSP frame", pfx);
1194 unsigned int offset;
1197 offset = (encoding & MACH_O_UNWIND_X86_64_RBP_FRAME_OFFSET) >> 16;
1198 printf (" at %cBP-%u:", pfx, offset * sz);
1199 for (i = 0; i < 5; i++)
1201 unsigned int reg = (regs >> (i * 3)) & 0x7;
1202 if (reg != MACH_O_UNWIND_X86_64_REG_NONE)
1203 printf (" %s", regs_name[reg]);
1208 case MACH_O_UNWIND_X86_64_MODE_STACK_IMMD:
1209 case MACH_O_UNWIND_X86_64_MODE_STACK_IND:
1211 unsigned int stack_size;
1212 unsigned int reg_count;
1213 unsigned int reg_perm;
1214 unsigned int regs[6];
1217 printf (" frameless");
1219 (encoding & MACH_O_UNWIND_X86_64_FRAMELESS_STACK_SIZE) >> 16;
1221 (encoding & MACH_O_UNWIND_X86_64_FRAMELESS_REG_COUNT) >> 10;
1222 reg_perm = encoding & MACH_O_UNWIND_X86_64_FRAMELESS_REG_PERMUTATION;
1224 if (mode == MACH_O_UNWIND_X86_64_MODE_STACK_IMMD)
1225 printf (" size: 0x%03x", stack_size * sz);
1228 unsigned int stack_adj;
1231 (encoding & MACH_O_UNWIND_X86_64_FRAMELESS_STACK_ADJUST) >> 13;
1232 printf (" size at 0x%03x + 0x%02x", stack_size, stack_adj * sz);
1234 /* Registers are coded using arithmetic compression: the register
1235 is indexed in range 0-6, the second in range 0-5, the third in
1236 range 0-4, etc. Already used registers are removed in next
1238 #define DO_PERM(R, NUM) R = reg_perm / NUM; reg_perm -= R * NUM
1243 DO_PERM (regs[0], 120);
1244 DO_PERM (regs[1], 24);
1245 DO_PERM (regs[2], 6);
1246 DO_PERM (regs[3], 2);
1247 DO_PERM (regs[4], 1);
1248 regs[5] = 0; /* Not used if reg_count = 5. */
1251 DO_PERM (regs[0], 60);
1252 DO_PERM (regs[1], 12);
1253 DO_PERM (regs[2], 3);
1254 DO_PERM (regs[3], 1);
1257 DO_PERM (regs[0], 20);
1258 DO_PERM (regs[1], 4);
1259 DO_PERM (regs[2], 1);
1262 DO_PERM (regs[0], 5);
1263 DO_PERM (regs[1], 1);
1266 DO_PERM (regs[0], 1);
1271 printf (" [bad reg count]");
1276 for (i = reg_count - 1; i >= 0; i--)
1278 unsigned int inc = 1;
1279 for (j = 0; j < i; j++)
1280 if (regs[i] >= regs[j])
1285 for (i = 0; i < (int) reg_count; i++)
1286 printf (" %s", regs_name[regs[i]]);
1289 case MACH_O_UNWIND_X86_64_MODE_DWARF:
1290 printf (" Dwarf offset: 0x%06x",
1291 encoding & MACH_O_UNWIND_X86_64_DWARF_SECTION_OFFSET);
1294 printf (" [unhandled mode]");
1300 dump_unwind_encoding (bfd_mach_o_data_struct *mdata, unsigned int encoding)
1302 printf ("0x%08x", encoding);
1306 switch (mdata->header.cputype)
1308 case BFD_MACH_O_CPU_TYPE_X86_64:
1309 dump_unwind_encoding_x86 (encoding, 8, unwind_x86_64_regs);
1311 case BFD_MACH_O_CPU_TYPE_I386:
1312 dump_unwind_encoding_x86 (encoding, 4, unwind_x86_regs);
1315 printf (" [unhandled cpu]");
1318 if (encoding & MACH_O_UNWIND_HAS_LSDA)
1320 if (encoding & MACH_O_UNWIND_PERSONALITY_MASK)
1321 printf (" PERS(%u)",
1322 ((encoding & MACH_O_UNWIND_PERSONALITY_MASK)
1323 >> MACH_O_UNWIND_PERSONALITY_SHIFT));
1327 dump_obj_compact_unwind (bfd *abfd,
1328 const unsigned char *content, bfd_size_type size)
1330 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
1331 int is_64 = mdata->header.version == 2;
1332 const unsigned char *p;
1334 printf ("Compact unwind info:\n");
1335 printf (" start length personality lsda\n");
1339 struct mach_o_compact_unwind_64 *e =
1340 (struct mach_o_compact_unwind_64 *) content;
1342 for (p = content; p < content + size; p += sizeof (*e))
1344 e = (struct mach_o_compact_unwind_64 *) p;
1347 fprintf_vma (stdout, bfd_get_64 (abfd, e->start));
1348 printf (" %08lx", bfd_get_32 (abfd, e->length));
1350 fprintf_vma (stdout, bfd_get_64 (abfd, e->personnality));
1352 fprintf_vma (stdout, bfd_get_64 (abfd, e->lsda));
1355 printf (" encoding: ");
1356 dump_unwind_encoding (mdata, bfd_get_32 (abfd, e->encoding));
1362 printf ("unhandled\n");
1367 dump_exe_compact_unwind (bfd *abfd,
1368 const unsigned char *content, bfd_size_type size)
1370 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
1371 struct mach_o_unwind_info_header *hdr;
1372 unsigned int version;
1373 unsigned int encodings_offset;
1374 unsigned int encodings_count;
1375 unsigned int personality_offset;
1376 unsigned int personality_count;
1377 unsigned int index_offset;
1378 unsigned int index_count;
1379 struct mach_o_unwind_index_entry *index_entry;
1383 printf ("Compact unwind info:\n");
1385 hdr = (struct mach_o_unwind_info_header *) content;
1386 if (size < sizeof (*hdr))
1388 printf (" truncated!\n");
1392 version = bfd_get_32 (abfd, hdr->version);
1393 if (version != MACH_O_UNWIND_SECTION_VERSION)
1395 printf (" unknown version: %u\n", version);
1398 encodings_offset = bfd_get_32 (abfd, hdr->encodings_array_offset);
1399 encodings_count = bfd_get_32 (abfd, hdr->encodings_array_count);
1400 personality_offset = bfd_get_32 (abfd, hdr->personality_array_offset);
1401 personality_count = bfd_get_32 (abfd, hdr->personality_array_count);
1402 index_offset = bfd_get_32 (abfd, hdr->index_offset);
1403 index_count = bfd_get_32 (abfd, hdr->index_count);
1404 printf (" %u encodings, %u personalities, %u level-1 indexes:\n",
1405 encodings_count, personality_count, index_count);
1407 /* Level-1 index. */
1408 printf (" idx function level2 off lsda off\n");
1410 index_entry = (struct mach_o_unwind_index_entry *) (content + index_offset);
1411 for (i = 0; i < index_count; i++)
1413 unsigned int func_offset;
1414 unsigned int level2_offset;
1415 unsigned int lsda_offset;
1417 func_offset = bfd_get_32 (abfd, index_entry->function_offset);
1418 level2_offset = bfd_get_32 (abfd, index_entry->second_level_offset);
1419 lsda_offset = bfd_get_32 (abfd, index_entry->lsda_index_offset);
1420 printf (" %3u 0x%08x 0x%08x 0x%08x\n",
1421 i, func_offset, level2_offset, lsda_offset);
1425 /* Level-1 index. */
1426 index_entry = (struct mach_o_unwind_index_entry *) (content + index_offset);
1427 for (i = 0; i < index_count; i++)
1429 unsigned int func_offset;
1430 unsigned int level2_offset;
1431 const unsigned char *level2;
1434 func_offset = bfd_get_32 (abfd, index_entry->function_offset);
1435 level2_offset = bfd_get_32 (abfd, index_entry->second_level_offset);
1437 /* No level-2 for this index (should be the last index). */
1438 if (level2_offset == 0)
1441 level2 = content + level2_offset;
1442 kind = bfd_get_32 (abfd, level2);
1445 case MACH_O_UNWIND_SECOND_LEVEL_COMPRESSED:
1447 struct mach_o_unwind_compressed_second_level_page_header *l2;
1448 unsigned int entry_offset;
1449 unsigned int entry_count;
1450 unsigned int l2_encodings_offset;
1451 unsigned int l2_encodings_count;
1452 const unsigned char *en;
1455 l2 = (struct mach_o_unwind_compressed_second_level_page_header *)
1457 entry_offset = bfd_get_16 (abfd, l2->entry_page_offset);
1458 entry_count = bfd_get_16 (abfd, l2->entry_count);
1459 l2_encodings_offset = bfd_get_16 (abfd, l2->encodings_offset);
1460 l2_encodings_count = bfd_get_16 (abfd, l2->encodings_count);
1462 printf (" index %2u: compressed second level: "
1463 "%u entries, %u encodings (at 0x%08x)\n",
1464 i, entry_count, l2_encodings_count, l2_encodings_offset);
1465 printf (" # function eidx encoding\n");
1467 en = level2 + entry_offset;
1468 for (j = 0; j < entry_count; j++)
1471 unsigned int en_func;
1472 unsigned int enc_idx;
1473 unsigned int encoding;
1474 const unsigned char *enc_addr;
1476 entry = bfd_get_32 (abfd, en);
1478 MACH_O_UNWIND_INFO_COMPRESSED_ENTRY_FUNC_OFFSET (entry);
1480 MACH_O_UNWIND_INFO_COMPRESSED_ENTRY_ENCODING_INDEX (entry);
1481 if (enc_idx < encodings_count)
1482 enc_addr = content + encodings_offset
1485 enc_addr = level2 + l2_encodings_offset
1486 + 4 * (enc_idx - encodings_count);
1487 encoding = bfd_get_32 (abfd, enc_addr);
1489 printf (" %-4u 0x%08x [%3u] ", j,
1490 func_offset + en_func, enc_idx);
1491 dump_unwind_encoding (mdata, encoding);
1499 case MACH_O_UNWIND_SECOND_LEVEL_REGULAR:
1501 struct mach_o_unwind_regular_second_level_page_header *l2;
1502 struct mach_o_unwind_regular_second_level_entry *en;
1503 unsigned int entry_offset;
1504 unsigned int entry_count;
1507 l2 = (struct mach_o_unwind_regular_second_level_page_header *)
1510 entry_offset = bfd_get_16 (abfd, l2->entry_page_offset);
1511 entry_count = bfd_get_16 (abfd, l2->entry_count);
1512 printf (" index %2u: regular level 2 at 0x%04x, %u entries\n",
1513 i, entry_offset, entry_count);
1514 printf (" # function encoding\n");
1516 en = (struct mach_o_unwind_regular_second_level_entry *)
1517 (level2 + entry_offset);
1518 for (j = 0; j < entry_count; j++)
1520 unsigned int en_func;
1521 unsigned int encoding;
1523 en_func = bfd_get_32 (abfd, en->function_offset);
1524 encoding = bfd_get_32 (abfd, en->encoding);
1525 printf (" %-4u 0x%08x ", j, en_func);
1526 dump_unwind_encoding (mdata, encoding);
1534 printf (" index %2u: unhandled second level format (%u)\n",
1540 struct mach_o_unwind_lsda_index_entry *lsda;
1541 unsigned int lsda_offset;
1542 unsigned int next_lsda_offset;
1543 unsigned int nbr_lsda;
1546 lsda_offset = bfd_get_32 (abfd, index_entry->lsda_index_offset);
1547 next_lsda_offset = bfd_get_32 (abfd, index_entry[1].lsda_index_offset);
1548 lsda = (struct mach_o_unwind_lsda_index_entry *)
1549 (content + lsda_offset);
1550 nbr_lsda = (next_lsda_offset - lsda_offset) / sizeof (*lsda);
1551 for (j = 0; j < nbr_lsda; j++)
1553 printf (" lsda %3u: function 0x%08x lsda 0x%08x\n",
1554 j, (unsigned int) bfd_get_32 (abfd, lsda->function_offset),
1555 (unsigned int) bfd_get_32 (abfd, lsda->lsda_offset));
1564 dump_section_content (bfd *abfd,
1565 const char *segname, const char *sectname,
1566 void (*dump)(bfd*, const unsigned char*, bfd_size_type))
1568 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
1571 for (i = 0; i < mdata->header.ncmds; i++)
1573 bfd_mach_o_load_command *cmd = &mdata->commands[i];
1574 if (cmd->type == BFD_MACH_O_LC_SEGMENT
1575 || cmd->type == BFD_MACH_O_LC_SEGMENT_64)
1577 bfd_mach_o_segment_command *seg = &cmd->command.segment;
1578 bfd_mach_o_section *sec;
1579 for (sec = seg->sect_head; sec != NULL; sec = sec->next)
1580 if (strcmp (sec->segname, segname) == 0
1581 && strcmp (sec->sectname, sectname) == 0)
1584 asection *bfdsec = sec->bfdsection;
1585 unsigned char *content;
1587 size = bfd_get_section_size (bfdsec);
1588 content = (unsigned char *) xmalloc (size);
1589 bfd_get_section_contents (abfd, bfdsec, content, 0, size);
1591 (*dump)(abfd, content, size);
1599 /* Dump ABFD (according to the options[] array). */
1602 mach_o_dump (bfd *abfd)
1604 if (options[OPT_HEADER].selected)
1606 if (options[OPT_SECTION].selected)
1607 dump_load_commands (abfd, BFD_MACH_O_LC_SEGMENT, BFD_MACH_O_LC_SEGMENT_64);
1608 if (options[OPT_MAP].selected)
1609 dump_section_map (abfd);
1610 if (options[OPT_LOAD].selected)
1611 dump_load_commands (abfd, 0, 0);
1612 if (options[OPT_DYSYMTAB].selected)
1613 dump_load_commands (abfd, BFD_MACH_O_LC_DYSYMTAB, 0);
1614 if (options[OPT_CODESIGN].selected)
1615 dump_load_commands (abfd, BFD_MACH_O_LC_CODE_SIGNATURE, 0);
1616 if (options[OPT_SEG_SPLIT_INFO].selected)
1617 dump_load_commands (abfd, BFD_MACH_O_LC_SEGMENT_SPLIT_INFO, 0);
1618 if (options[OPT_FUNCTION_STARTS].selected)
1619 dump_load_commands (abfd, BFD_MACH_O_LC_FUNCTION_STARTS, 0);
1620 if (options[OPT_COMPACT_UNWIND].selected)
1622 dump_section_content (abfd, "__LD", "__compact_unwind",
1623 dump_obj_compact_unwind);
1624 dump_section_content (abfd, "__TEXT", "__unwind_info",
1625 dump_exe_compact_unwind);
1629 /* Vector for Mach-O. */
1631 const struct objdump_private_desc objdump_private_desc_mach_o =