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
46 /* List of actions. */
47 static struct objdump_private_option options[] =
55 { "seg_split_info", 0 },
56 { "compact_unwind", 0 },
63 mach_o_help (FILE *stream)
67 header Display the file header\n\
68 section Display the segments and sections commands\n\
69 map Display the section map\n\
70 load Display the load commands\n\
71 dysymtab Display the dynamic symbol table\n\
72 codesign Display code signature\n\
73 seg_split_info Display segment split info\n\
74 compact_unwind Display compact unwinding info\n\
78 /* Return TRUE if ABFD is handled. */
81 mach_o_filter (bfd *abfd)
83 return bfd_get_flavour (abfd) == bfd_target_mach_o_flavour;
86 static const bfd_mach_o_xlat_name bfd_mach_o_cpu_name[] =
88 { "vax", BFD_MACH_O_CPU_TYPE_VAX },
89 { "mc680x0", BFD_MACH_O_CPU_TYPE_MC680x0 },
90 { "i386", BFD_MACH_O_CPU_TYPE_I386 },
91 { "mips", BFD_MACH_O_CPU_TYPE_MIPS },
92 { "mc98000", BFD_MACH_O_CPU_TYPE_MC98000 },
93 { "hppa", BFD_MACH_O_CPU_TYPE_HPPA },
94 { "arm", BFD_MACH_O_CPU_TYPE_ARM },
95 { "mc88000", BFD_MACH_O_CPU_TYPE_MC88000 },
96 { "sparc", BFD_MACH_O_CPU_TYPE_SPARC },
97 { "i860", BFD_MACH_O_CPU_TYPE_I860 },
98 { "alpha", BFD_MACH_O_CPU_TYPE_ALPHA },
99 { "powerpc", BFD_MACH_O_CPU_TYPE_POWERPC },
100 { "powerpc_64", BFD_MACH_O_CPU_TYPE_POWERPC_64 },
101 { "x86_64", BFD_MACH_O_CPU_TYPE_X86_64 },
102 { "arm64", BFD_MACH_O_CPU_TYPE_ARM64 },
106 static const bfd_mach_o_xlat_name bfd_mach_o_filetype_name[] =
108 { "object", BFD_MACH_O_MH_OBJECT },
109 { "execute", BFD_MACH_O_MH_EXECUTE },
110 { "fvmlib", BFD_MACH_O_MH_FVMLIB },
111 { "core", BFD_MACH_O_MH_CORE },
112 { "preload", BFD_MACH_O_MH_PRELOAD },
113 { "dylib", BFD_MACH_O_MH_DYLIB },
114 { "dylinker", BFD_MACH_O_MH_DYLINKER },
115 { "bundle", BFD_MACH_O_MH_BUNDLE },
116 { "dylib_stub", BFD_MACH_O_MH_DYLIB_STUB },
117 { "dym", BFD_MACH_O_MH_DSYM },
118 { "kext_bundle", BFD_MACH_O_MH_KEXT_BUNDLE },
122 static const bfd_mach_o_xlat_name bfd_mach_o_header_flags_name[] =
124 { "noundefs", BFD_MACH_O_MH_NOUNDEFS },
125 { "incrlink", BFD_MACH_O_MH_INCRLINK },
126 { "dyldlink", BFD_MACH_O_MH_DYLDLINK },
127 { "bindatload", BFD_MACH_O_MH_BINDATLOAD },
128 { "prebound", BFD_MACH_O_MH_PREBOUND },
129 { "split_segs", BFD_MACH_O_MH_SPLIT_SEGS },
130 { "lazy_init", BFD_MACH_O_MH_LAZY_INIT },
131 { "twolevel", BFD_MACH_O_MH_TWOLEVEL },
132 { "force_flat", BFD_MACH_O_MH_FORCE_FLAT },
133 { "nomultidefs", BFD_MACH_O_MH_NOMULTIDEFS },
134 { "nofixprebinding", BFD_MACH_O_MH_NOFIXPREBINDING },
135 { "prebindable", BFD_MACH_O_MH_PREBINDABLE },
136 { "allmodsbound", BFD_MACH_O_MH_ALLMODSBOUND },
137 { "subsections_via_symbols", BFD_MACH_O_MH_SUBSECTIONS_VIA_SYMBOLS },
138 { "canonical", BFD_MACH_O_MH_CANONICAL },
139 { "weak_defines", BFD_MACH_O_MH_WEAK_DEFINES },
140 { "binds_to_weak", BFD_MACH_O_MH_BINDS_TO_WEAK },
141 { "allow_stack_execution", BFD_MACH_O_MH_ALLOW_STACK_EXECUTION },
142 { "root_safe", BFD_MACH_O_MH_ROOT_SAFE },
143 { "setuid_safe", BFD_MACH_O_MH_SETUID_SAFE },
144 { "no_reexported_dylibs", BFD_MACH_O_MH_NO_REEXPORTED_DYLIBS },
145 { "pie", BFD_MACH_O_MH_PIE },
149 static const bfd_mach_o_xlat_name bfd_mach_o_load_command_name[] =
151 { "segment", BFD_MACH_O_LC_SEGMENT},
152 { "symtab", BFD_MACH_O_LC_SYMTAB},
153 { "symseg", BFD_MACH_O_LC_SYMSEG},
154 { "thread", BFD_MACH_O_LC_THREAD},
155 { "unixthread", BFD_MACH_O_LC_UNIXTHREAD},
156 { "loadfvmlib", BFD_MACH_O_LC_LOADFVMLIB},
157 { "idfvmlib", BFD_MACH_O_LC_IDFVMLIB},
158 { "ident", BFD_MACH_O_LC_IDENT},
159 { "fvmfile", BFD_MACH_O_LC_FVMFILE},
160 { "prepage", BFD_MACH_O_LC_PREPAGE},
161 { "dysymtab", BFD_MACH_O_LC_DYSYMTAB},
162 { "load_dylib", BFD_MACH_O_LC_LOAD_DYLIB},
163 { "id_dylib", BFD_MACH_O_LC_ID_DYLIB},
164 { "load_dylinker", BFD_MACH_O_LC_LOAD_DYLINKER},
165 { "id_dylinker", BFD_MACH_O_LC_ID_DYLINKER},
166 { "prebound_dylib", BFD_MACH_O_LC_PREBOUND_DYLIB},
167 { "routines", BFD_MACH_O_LC_ROUTINES},
168 { "sub_framework", BFD_MACH_O_LC_SUB_FRAMEWORK},
169 { "sub_umbrella", BFD_MACH_O_LC_SUB_UMBRELLA},
170 { "sub_client", BFD_MACH_O_LC_SUB_CLIENT},
171 { "sub_library", BFD_MACH_O_LC_SUB_LIBRARY},
172 { "twolevel_hints", BFD_MACH_O_LC_TWOLEVEL_HINTS},
173 { "prebind_cksum", BFD_MACH_O_LC_PREBIND_CKSUM},
174 { "load_weak_dylib", BFD_MACH_O_LC_LOAD_WEAK_DYLIB},
175 { "segment_64", BFD_MACH_O_LC_SEGMENT_64},
176 { "routines_64", BFD_MACH_O_LC_ROUTINES_64},
177 { "uuid", BFD_MACH_O_LC_UUID},
178 { "rpath", BFD_MACH_O_LC_RPATH},
179 { "code_signature", BFD_MACH_O_LC_CODE_SIGNATURE},
180 { "segment_split_info", BFD_MACH_O_LC_SEGMENT_SPLIT_INFO},
181 { "reexport_dylib", BFD_MACH_O_LC_REEXPORT_DYLIB},
182 { "lazy_load_dylib", BFD_MACH_O_LC_LAZY_LOAD_DYLIB},
183 { "encryption_info", BFD_MACH_O_LC_ENCRYPTION_INFO},
184 { "dyld_info", BFD_MACH_O_LC_DYLD_INFO},
185 { "load_upward_lib", BFD_MACH_O_LC_LOAD_UPWARD_DYLIB},
186 { "version_min_macosx", BFD_MACH_O_LC_VERSION_MIN_MACOSX},
187 { "version_min_iphoneos", BFD_MACH_O_LC_VERSION_MIN_IPHONEOS},
188 { "function_starts", BFD_MACH_O_LC_FUNCTION_STARTS},
189 { "dyld_environment", BFD_MACH_O_LC_DYLD_ENVIRONMENT},
190 { "main", BFD_MACH_O_LC_MAIN},
191 { "data_in_code", BFD_MACH_O_LC_DATA_IN_CODE},
192 { "source_version", BFD_MACH_O_LC_SOURCE_VERSION},
193 { "dylib_code_sign_drs", BFD_MACH_O_LC_DYLIB_CODE_SIGN_DRS},
197 static const bfd_mach_o_xlat_name bfd_mach_o_thread_x86_name[] =
199 { "thread_state32", BFD_MACH_O_x86_THREAD_STATE32},
200 { "float_state32", BFD_MACH_O_x86_FLOAT_STATE32},
201 { "exception_state32", BFD_MACH_O_x86_EXCEPTION_STATE32},
202 { "thread_state64", BFD_MACH_O_x86_THREAD_STATE64},
203 { "float_state64", BFD_MACH_O_x86_FLOAT_STATE64},
204 { "exception_state64", BFD_MACH_O_x86_EXCEPTION_STATE64},
205 { "thread_state", BFD_MACH_O_x86_THREAD_STATE},
206 { "float_state", BFD_MACH_O_x86_FLOAT_STATE},
207 { "exception_state", BFD_MACH_O_x86_EXCEPTION_STATE},
208 { "debug_state32", BFD_MACH_O_x86_DEBUG_STATE32},
209 { "debug_state64", BFD_MACH_O_x86_DEBUG_STATE64},
210 { "debug_state", BFD_MACH_O_x86_DEBUG_STATE},
211 { "state_none", BFD_MACH_O_x86_THREAD_STATE_NONE},
216 bfd_mach_o_print_flags (const bfd_mach_o_xlat_name *table,
221 for (; table->name; table++)
223 if (table->val & val)
227 printf ("%s", table->name);
236 printf ("0x%lx", val);
244 bfd_mach_o_get_name_or_null (const bfd_mach_o_xlat_name *table,
247 for (; table->name; table++)
248 if (table->val == val)
254 bfd_mach_o_get_name (const bfd_mach_o_xlat_name *table, unsigned long val)
256 const char *res = bfd_mach_o_get_name_or_null (table, val);
265 dump_header (bfd *abfd)
267 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
268 bfd_mach_o_header *h = &mdata->header;
270 fputs (_("Mach-O header:\n"), stdout);
271 printf (_(" magic : %08lx\n"), h->magic);
272 printf (_(" cputype : %08lx (%s)\n"), h->cputype,
273 bfd_mach_o_get_name (bfd_mach_o_cpu_name, h->cputype));
274 printf (_(" cpusubtype: %08lx\n"), h->cpusubtype);
275 printf (_(" filetype : %08lx (%s)\n"),
277 bfd_mach_o_get_name (bfd_mach_o_filetype_name, h->filetype));
278 printf (_(" ncmds : %08lx (%lu)\n"), h->ncmds, h->ncmds);
279 printf (_(" sizeofcmds: %08lx\n"), h->sizeofcmds);
280 printf (_(" flags : %08lx ("), h->flags);
281 bfd_mach_o_print_flags (bfd_mach_o_header_flags_name, h->flags);
282 fputs (_(")\n"), stdout);
283 printf (_(" reserved : %08x\n"), h->reserved);
287 dump_section_map (bfd *abfd)
289 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
291 unsigned int sec_nbr = 0;
293 fputs (_("Segments and Sections:\n"), stdout);
294 fputs (_(" #: Segment name Section name Address\n"), stdout);
296 for (i = 0; i < mdata->header.ncmds; i++)
298 bfd_mach_o_segment_command *seg;
299 bfd_mach_o_section *sec;
301 if (mdata->commands[i].type != BFD_MACH_O_LC_SEGMENT
302 && mdata->commands[i].type != BFD_MACH_O_LC_SEGMENT_64)
305 seg = &mdata->commands[i].command.segment;
307 printf ("[Segment %-16s ", seg->segname);
308 printf_vma (seg->vmaddr);
310 printf_vma (seg->vmaddr + seg->vmsize - 1);
312 putchar (seg->initprot & BFD_MACH_O_PROT_READ ? 'r' : '-');
313 putchar (seg->initprot & BFD_MACH_O_PROT_WRITE ? 'w' : '-');
314 putchar (seg->initprot & BFD_MACH_O_PROT_EXECUTE ? 'x' : '-');
317 for (sec = seg->sect_head; sec != NULL; sec = sec->next)
319 printf ("%02u: %-16s %-16s ", ++sec_nbr,
320 sec->segname, sec->sectname);
321 printf_vma (sec->addr);
323 printf_vma (sec->size);
324 printf (" %08lx\n", sec->flags);
330 dump_section_header (bfd *abfd ATTRIBUTE_UNUSED, bfd_mach_o_section *sec)
332 printf (" Section: %-16s %-16s (bfdname: %s)\n",
333 sec->sectname, sec->segname, sec->bfdsection->name);
335 printf_vma (sec->addr);
337 printf_vma (sec->size);
338 printf (" offset: ");
339 printf_vma (sec->offset);
341 printf (" align: %ld", sec->align);
342 printf (" nreloc: %lu reloff: ", sec->nreloc);
343 printf_vma (sec->reloff);
345 printf (" flags: %08lx (type: %s", sec->flags,
346 bfd_mach_o_get_name (bfd_mach_o_section_type_name,
347 sec->flags & BFD_MACH_O_SECTION_TYPE_MASK));
349 bfd_mach_o_print_flags (bfd_mach_o_section_attribute_name,
350 sec->flags & BFD_MACH_O_SECTION_ATTRIBUTES_MASK);
352 switch (sec->flags & BFD_MACH_O_SECTION_TYPE_MASK)
354 case BFD_MACH_O_S_NON_LAZY_SYMBOL_POINTERS:
355 case BFD_MACH_O_S_LAZY_SYMBOL_POINTERS:
356 case BFD_MACH_O_S_SYMBOL_STUBS:
357 printf (" first indirect sym: %lu", sec->reserved1);
358 printf (" (%u entries)",
359 bfd_mach_o_section_get_nbr_indirect (abfd, sec));
362 printf (" reserved1: 0x%lx", sec->reserved1);
365 switch (sec->flags & BFD_MACH_O_SECTION_TYPE_MASK)
367 case BFD_MACH_O_S_SYMBOL_STUBS:
368 printf (" stub size: %lu", sec->reserved2);
371 printf (" reserved2: 0x%lx", sec->reserved2);
374 printf (" reserved3: 0x%lx\n", sec->reserved3);
378 dump_segment (bfd *abfd ATTRIBUTE_UNUSED, bfd_mach_o_load_command *cmd)
380 bfd_mach_o_segment_command *seg = &cmd->command.segment;
381 bfd_mach_o_section *sec;
383 printf (" name: %s\n", *seg->segname ? seg->segname : "*none*");
384 printf (" vmaddr: ");
385 printf_vma (seg->vmaddr);
386 printf (" vmsize: ");
387 printf_vma (seg->vmsize);
389 printf (" fileoff: ");
390 printf_vma (seg->fileoff);
391 printf (" filesize: ");
392 printf_vma ((bfd_vma)seg->filesize);
393 printf (" endoff: ");
394 printf_vma ((bfd_vma)(seg->fileoff + seg->filesize));
396 printf (" nsects: %lu ", seg->nsects);
397 printf (" flags: %lx\n", seg->flags);
398 for (sec = seg->sect_head; sec != NULL; sec = sec->next)
399 dump_section_header (abfd, sec);
403 dump_dysymtab (bfd *abfd, bfd_mach_o_load_command *cmd, bfd_boolean verbose)
405 bfd_mach_o_dysymtab_command *dysymtab = &cmd->command.dysymtab;
406 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
409 printf (" local symbols: idx: %10lu num: %-8lu",
410 dysymtab->ilocalsym, dysymtab->nlocalsym);
411 printf (" (nxtidx: %lu)\n",
412 dysymtab->ilocalsym + dysymtab->nlocalsym);
413 printf (" external symbols: idx: %10lu num: %-8lu",
414 dysymtab->iextdefsym, dysymtab->nextdefsym);
415 printf (" (nxtidx: %lu)\n",
416 dysymtab->iextdefsym + dysymtab->nextdefsym);
417 printf (" undefined symbols: idx: %10lu num: %-8lu",
418 dysymtab->iundefsym, dysymtab->nundefsym);
419 printf (" (nxtidx: %lu)\n",
420 dysymtab->iundefsym + dysymtab->nundefsym);
421 printf (" table of content: off: 0x%08lx num: %-8lu",
422 dysymtab->tocoff, dysymtab->ntoc);
423 printf (" (endoff: 0x%08lx)\n",
424 dysymtab->tocoff + dysymtab->ntoc * BFD_MACH_O_TABLE_OF_CONTENT_SIZE);
425 printf (" module table: off: 0x%08lx num: %-8lu",
426 dysymtab->modtaboff, dysymtab->nmodtab);
427 printf (" (endoff: 0x%08lx)\n",
428 dysymtab->modtaboff + dysymtab->nmodtab
429 * (mdata->header.version == 2 ?
430 BFD_MACH_O_DYLIB_MODULE_64_SIZE : BFD_MACH_O_DYLIB_MODULE_SIZE));
431 printf (" external reference table: off: 0x%08lx num: %-8lu",
432 dysymtab->extrefsymoff, dysymtab->nextrefsyms);
433 printf (" (endoff: 0x%08lx)\n",
434 dysymtab->extrefsymoff
435 + dysymtab->nextrefsyms * BFD_MACH_O_REFERENCE_SIZE);
436 printf (" indirect symbol table: off: 0x%08lx num: %-8lu",
437 dysymtab->indirectsymoff, dysymtab->nindirectsyms);
438 printf (" (endoff: 0x%08lx)\n",
439 dysymtab->indirectsymoff
440 + dysymtab->nindirectsyms * BFD_MACH_O_INDIRECT_SYMBOL_SIZE);
441 printf (" external relocation table: off: 0x%08lx num: %-8lu",
442 dysymtab->extreloff, dysymtab->nextrel);
443 printf (" (endoff: 0x%08lx)\n",
444 dysymtab->extreloff + dysymtab->nextrel * BFD_MACH_O_RELENT_SIZE);
445 printf (" local relocation table: off: 0x%08lx num: %-8lu",
446 dysymtab->locreloff, dysymtab->nlocrel);
447 printf (" (endoff: 0x%08lx)\n",
448 dysymtab->locreloff + dysymtab->nlocrel * BFD_MACH_O_RELENT_SIZE);
453 if (dysymtab->ntoc > 0
454 || dysymtab->nindirectsyms > 0
455 || dysymtab->nextrefsyms > 0)
457 /* Try to read the symbols to display the toc or indirect symbols. */
458 bfd_mach_o_read_symtab_symbols (abfd);
460 else if (dysymtab->nmodtab > 0)
462 /* Try to read the strtab to display modules name. */
463 bfd_mach_o_read_symtab_strtab (abfd);
466 for (i = 0; i < dysymtab->nmodtab; i++)
468 bfd_mach_o_dylib_module *module = &dysymtab->dylib_module[i];
469 printf (" module %u:\n", i);
470 printf (" name: %lu", module->module_name_idx);
471 if (mdata->symtab && mdata->symtab->strtab)
473 mdata->symtab->strtab + module->module_name_idx);
475 printf (" extdefsym: idx: %8lu num: %lu\n",
476 module->iextdefsym, module->nextdefsym);
477 printf (" refsym: idx: %8lu num: %lu\n",
478 module->irefsym, module->nrefsym);
479 printf (" localsym: idx: %8lu num: %lu\n",
480 module->ilocalsym, module->nlocalsym);
481 printf (" extrel: idx: %8lu num: %lu\n",
482 module->iextrel, module->nextrel);
483 printf (" init: idx: %8u num: %u\n",
484 module->iinit, module->ninit);
485 printf (" term: idx: %8u num: %u\n",
486 module->iterm, module->nterm);
487 printf (" objc_module_info: addr: ");
488 printf_vma (module->objc_module_info_addr);
489 printf (" size: %lu\n", module->objc_module_info_size);
492 if (dysymtab->ntoc > 0)
494 bfd_mach_o_symtab_command *symtab = mdata->symtab;
496 printf (" table of content: (symbol/module)\n");
497 for (i = 0; i < dysymtab->ntoc; i++)
499 bfd_mach_o_dylib_table_of_content *toc = &dysymtab->dylib_toc[i];
501 printf (" %4u: ", i);
502 if (symtab && symtab->symbols && toc->symbol_index < symtab->nsyms)
504 const char *name = symtab->symbols[toc->symbol_index].symbol.name;
505 printf ("%s (%lu)", name ? name : "*invalid*",
509 printf ("%lu", toc->symbol_index);
512 if (symtab && symtab->strtab
513 && toc->module_index < dysymtab->nmodtab)
515 bfd_mach_o_dylib_module *mod;
516 mod = &dysymtab->dylib_module[toc->module_index];
518 symtab->strtab + mod->module_name_idx,
522 printf ("%lu", toc->module_index);
528 if (dysymtab->nindirectsyms != 0)
530 printf (" indirect symbols:\n");
532 for (i = 0; i < mdata->nsects; i++)
534 bfd_mach_o_section *sec = mdata->sections[i];
535 unsigned int j, first, last;
536 bfd_mach_o_symtab_command *symtab = mdata->symtab;
540 switch (sec->flags & BFD_MACH_O_SECTION_TYPE_MASK)
542 case BFD_MACH_O_S_NON_LAZY_SYMBOL_POINTERS:
543 case BFD_MACH_O_S_LAZY_SYMBOL_POINTERS:
544 case BFD_MACH_O_S_SYMBOL_STUBS:
545 first = sec->reserved1;
546 last = first + bfd_mach_o_section_get_nbr_indirect (abfd, sec);
548 entry_size = bfd_mach_o_section_get_entry_size (abfd, sec);
549 printf (" for section %s.%s:\n",
550 sec->segname, sec->sectname);
551 for (j = first; j < last; j++)
553 unsigned int isym = dysymtab->indirect_syms[j];
557 printf (" %5u: 0x%08x", j, isym);
558 if (isym & BFD_MACH_O_INDIRECT_SYMBOL_LOCAL)
560 if (isym & BFD_MACH_O_INDIRECT_SYMBOL_ABS)
561 printf (" ABSOLUTE");
562 if (symtab && symtab->symbols
563 && isym < symtab->nsyms
564 && symtab->symbols[isym].symbol.name)
565 printf (" %s", symtab->symbols[isym].symbol.name);
575 if (dysymtab->nextrefsyms > 0)
577 bfd_mach_o_symtab_command *symtab = mdata->symtab;
579 printf (" external reference table: (symbol flags)\n");
580 for (i = 0; i < dysymtab->nextrefsyms; i++)
582 bfd_mach_o_dylib_reference *ref = &dysymtab->ext_refs[i];
584 printf (" %4u: %5lu 0x%02lx", i, ref->isym, ref->flags);
585 if (symtab && symtab->symbols
586 && ref->isym < symtab->nsyms
587 && symtab->symbols[ref->isym].symbol.name)
588 printf (" %s", symtab->symbols[ref->isym].symbol.name);
596 dump_dyld_info (bfd *abfd ATTRIBUTE_UNUSED, bfd_mach_o_load_command *cmd)
598 bfd_mach_o_dyld_info_command *info = &cmd->command.dyld_info;
600 printf (" rebase: off: 0x%08x size: %-8u\n",
601 info->rebase_off, info->rebase_size);
602 printf (" bind: off: 0x%08x size: %-8u\n",
603 info->bind_off, info->bind_size);
604 printf (" weak bind: off: 0x%08x size: %-8u\n",
605 info->weak_bind_off, info->weak_bind_size);
606 printf (" lazy bind: off: 0x%08x size: %-8u\n",
607 info->lazy_bind_off, info->lazy_bind_size);
608 printf (" export: off: 0x%08x size: %-8u\n",
609 info->export_off, info->export_size);
613 dump_thread (bfd *abfd, bfd_mach_o_load_command *cmd)
615 bfd_mach_o_thread_command *thread = &cmd->command.thread;
617 bfd_mach_o_backend_data *bed = bfd_mach_o_get_backend_data (abfd);
618 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
620 printf (" nflavours: %lu\n", thread->nflavours);
621 for (j = 0; j < thread->nflavours; j++)
623 bfd_mach_o_thread_flavour *flavour = &thread->flavours[j];
624 const bfd_mach_o_xlat_name *name_table;
626 printf (" %2u: flavour: 0x%08lx", j, flavour->flavour);
627 switch (mdata->header.cputype)
629 case BFD_MACH_O_CPU_TYPE_I386:
630 case BFD_MACH_O_CPU_TYPE_X86_64:
631 name_table = bfd_mach_o_thread_x86_name;
637 if (name_table != NULL)
638 printf (": %s", bfd_mach_o_get_name (name_table, flavour->flavour));
641 printf (" offset: 0x%08lx size: 0x%08lx\n",
642 flavour->offset, flavour->size);
643 if (bed->_bfd_mach_o_print_thread)
645 char *buf = xmalloc (flavour->size);
647 if (bfd_seek (abfd, flavour->offset, SEEK_SET) == 0
648 && bfd_bread (buf, flavour->size, abfd) == flavour->size)
649 (*bed->_bfd_mach_o_print_thread)(abfd, flavour, stdout, buf);
656 static const bfd_mach_o_xlat_name bfd_mach_o_cs_magic[] =
658 { "embedded signature", BFD_MACH_O_CS_MAGIC_EMBEDDED_SIGNATURE },
659 { "requirement", BFD_MACH_O_CS_MAGIC_REQUIREMENT },
660 { "requirements", BFD_MACH_O_CS_MAGIC_REQUIREMENTS },
661 { "code directory", BFD_MACH_O_CS_MAGIC_CODEDIRECTORY },
662 { "embedded entitlements", BFD_MACH_O_CS_MAGIC_EMBEDDED_ENTITLEMENTS },
663 { "blob wrapper", BFD_MACH_O_CS_MAGIC_BLOB_WRAPPER },
667 static const bfd_mach_o_xlat_name bfd_mach_o_cs_hash_type[] =
669 { "no-hash", BFD_MACH_O_CS_NO_HASH },
670 { "sha1", BFD_MACH_O_CS_HASH_SHA1 },
671 { "sha256", BFD_MACH_O_CS_HASH_SHA256 },
672 { "skein 160", BFD_MACH_O_CS_HASH_PRESTANDARD_SKEIN_160x256 },
673 { "skein 256", BFD_MACH_O_CS_HASH_PRESTANDARD_SKEIN_256x512 },
678 dump_code_signature_blob (bfd *abfd, const unsigned char *buf, unsigned int len);
681 dump_code_signature_superblob (bfd *abfd ATTRIBUTE_UNUSED,
682 const unsigned char *buf, unsigned int len)
689 printf (_(" [bad block length]\n"));
692 count = bfd_getb32 (buf + 8);
693 printf (_(" %u index entries:\n"), count);
694 if (len < 12 + 8 * count)
696 printf (_(" [bad block length]\n"));
699 for (i = 0; i < count; i++)
704 type = bfd_getb32 (buf + 12 + 8 * i);
705 off = bfd_getb32 (buf + 12 + 8 * i + 4);
706 printf (_(" index entry %u: type: %08x, offset: %08x\n"),
709 dump_code_signature_blob (abfd, buf + off, len - off);
714 swap_code_codedirectory_v1_in
715 (const struct mach_o_codesign_codedirectory_external_v1 *src,
716 struct mach_o_codesign_codedirectory_v1 *dst)
718 dst->version = bfd_getb32 (src->version);
719 dst->flags = bfd_getb32 (src->flags);
720 dst->hash_offset = bfd_getb32 (src->hash_offset);
721 dst->ident_offset = bfd_getb32 (src->ident_offset);
722 dst->nbr_special_slots = bfd_getb32 (src->nbr_special_slots);
723 dst->nbr_code_slots = bfd_getb32 (src->nbr_code_slots);
724 dst->code_limit = bfd_getb32 (src->code_limit);
725 dst->hash_size = src->hash_size[0];
726 dst->hash_type = src->hash_type[0];
727 dst->spare1 = src->spare1[0];
728 dst->page_size = src->page_size[0];
729 dst->spare2 = bfd_getb32 (src->spare2);
733 hexdump (unsigned int start, unsigned int len,
734 const unsigned char *buf)
738 for (i = 0; i < len; i += 16)
740 printf ("%08x:", start + i);
741 for (j = 0; j < 16; j++)
743 fputc (j == 8 ? '-' : ' ', stdout);
745 printf ("%02x", buf[i + j]);
750 for (j = 0; j < 16; j++)
753 fputc (ISPRINT (buf[i + j]) ? buf[i + j] : '.', stdout);
757 fputc ('\n', stdout);
762 dump_code_signature_codedirectory (bfd *abfd ATTRIBUTE_UNUSED,
763 const unsigned char *buf, unsigned int len)
765 struct mach_o_codesign_codedirectory_v1 cd;
768 if (len < sizeof (struct mach_o_codesign_codedirectory_external_v1))
770 printf (_(" [bad block length]\n"));
774 swap_code_codedirectory_v1_in
775 ((const struct mach_o_codesign_codedirectory_external_v1 *) (buf + 8), &cd);
777 printf (_(" version: %08x\n"), cd.version);
778 printf (_(" flags: %08x\n"), cd.flags);
779 printf (_(" hash offset: %08x\n"), cd.hash_offset);
780 id = (const char *) buf + cd.ident_offset;
781 printf (_(" ident offset: %08x (- %08x)\n"),
782 cd.ident_offset, cd.ident_offset + (unsigned) strlen (id) + 1);
783 printf (_(" identity: %s\n"), id);
784 printf (_(" nbr special slots: %08x (at offset %08x)\n"),
785 cd.nbr_special_slots,
786 cd.hash_offset - cd.nbr_special_slots * cd.hash_size);
787 printf (_(" nbr code slots: %08x\n"), cd.nbr_code_slots);
788 printf (_(" code limit: %08x\n"), cd.code_limit);
789 printf (_(" hash size: %02x\n"), cd.hash_size);
790 printf (_(" hash type: %02x (%s)\n"),
792 bfd_mach_o_get_name (bfd_mach_o_cs_hash_type, cd.hash_type));
793 printf (_(" spare1: %02x\n"), cd.spare1);
794 printf (_(" page size: %02x\n"), cd.page_size);
795 printf (_(" spare2: %08x\n"), cd.spare2);
796 if (cd.version >= 0x20100)
797 printf (_(" scatter offset: %08x\n"),
798 (unsigned) bfd_getb32 (buf + 44));
802 dump_code_signature_blob (bfd *abfd, const unsigned char *buf, unsigned int len)
809 printf (_(" [truncated block]\n"));
812 magic = bfd_getb32 (buf);
813 length = bfd_getb32 (buf + 4);
814 if (magic == 0 || length == 0)
817 printf (_(" magic : %08x (%s)\n"), magic,
818 bfd_mach_o_get_name (bfd_mach_o_cs_magic, magic));
819 printf (_(" length: %08x\n"), length);
822 printf (_(" [bad block length]\n"));
828 case BFD_MACH_O_CS_MAGIC_EMBEDDED_SIGNATURE:
829 dump_code_signature_superblob (abfd, buf, length);
831 case BFD_MACH_O_CS_MAGIC_CODEDIRECTORY:
832 dump_code_signature_codedirectory (abfd, buf, length);
835 hexdump (0, length - 8, buf + 8);
842 dump_code_signature (bfd *abfd, bfd_mach_o_linkedit_command *cmd)
844 unsigned char *buf = xmalloc (cmd->datasize);
847 if (bfd_seek (abfd, cmd->dataoff, SEEK_SET) != 0
848 || bfd_bread (buf, cmd->datasize, abfd) != cmd->datasize)
850 non_fatal (_("cannot read code signature data"));
854 for (off = 0; off < cmd->datasize;)
858 len = dump_code_signature_blob (abfd, buf + off, cmd->datasize - off);
868 dump_segment_split_info (bfd *abfd, bfd_mach_o_linkedit_command *cmd)
870 unsigned char *buf = xmalloc (cmd->datasize);
875 if (bfd_seek (abfd, cmd->dataoff, SEEK_SET) != 0
876 || bfd_bread (buf, cmd->datasize, abfd) != cmd->datasize)
878 non_fatal (_("cannot read segment split info"));
882 if (buf[cmd->datasize - 1] != 0)
884 non_fatal (_("segment split info is not nul terminated"));
892 printf (_(" 32 bit pointers:\n"));
895 printf (_(" 64 bit pointers:\n"));
898 printf (_(" PPC hi-16:\n"));
901 printf (_(" Unhandled location type %u\n"), buf[0]);
904 for (p = buf + 1; *p != 0; p += len)
906 addr += read_unsigned_leb128 (abfd, p, &len);
908 bfd_printf_vma (abfd, addr);
915 dump_load_command (bfd *abfd, bfd_mach_o_load_command *cmd,
918 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
919 const char *cmd_name;
921 cmd_name = bfd_mach_o_get_name_or_null
922 (bfd_mach_o_load_command_name, cmd->type);
923 printf ("Load command ");
924 if (cmd_name == NULL)
925 printf ("0x%02x:", cmd->type);
927 printf ("%s:", cmd_name);
931 case BFD_MACH_O_LC_SEGMENT:
932 case BFD_MACH_O_LC_SEGMENT_64:
933 dump_segment (abfd, cmd);
935 case BFD_MACH_O_LC_UUID:
937 bfd_mach_o_uuid_command *uuid = &cmd->command.uuid;
940 for (j = 0; j < sizeof (uuid->uuid); j ++)
941 printf (" %02x", uuid->uuid[j]);
945 case BFD_MACH_O_LC_LOAD_DYLIB:
946 case BFD_MACH_O_LC_LAZY_LOAD_DYLIB:
947 case BFD_MACH_O_LC_LOAD_WEAK_DYLIB:
948 case BFD_MACH_O_LC_REEXPORT_DYLIB:
949 case BFD_MACH_O_LC_ID_DYLIB:
950 case BFD_MACH_O_LC_LOAD_UPWARD_DYLIB:
952 bfd_mach_o_dylib_command *dylib = &cmd->command.dylib;
953 printf (" %s\n", dylib->name_str);
954 printf (" time stamp: 0x%08lx\n",
956 printf (" current version: 0x%08lx\n",
957 dylib->current_version);
958 printf (" comptibility version: 0x%08lx\n",
959 dylib->compatibility_version);
962 case BFD_MACH_O_LC_LOAD_DYLINKER:
963 case BFD_MACH_O_LC_ID_DYLINKER:
964 printf (" %s\n", cmd->command.dylinker.name_str);
966 case BFD_MACH_O_LC_SYMTAB:
968 bfd_mach_o_symtab_command *symtab = &cmd->command.symtab;
970 " symoff: 0x%08x nsyms: %8u (endoff: 0x%08x)\n",
971 symtab->symoff, symtab->nsyms,
972 symtab->symoff + symtab->nsyms
973 * (mdata->header.version == 2
974 ? BFD_MACH_O_NLIST_64_SIZE : BFD_MACH_O_NLIST_SIZE));
975 printf (" stroff: 0x%08x strsize: %8u (endoff: 0x%08x)\n",
976 symtab->stroff, symtab->strsize,
977 symtab->stroff + symtab->strsize);
980 case BFD_MACH_O_LC_DYSYMTAB:
982 dump_dysymtab (abfd, cmd, verbose);
984 case BFD_MACH_O_LC_LOADFVMLIB:
985 case BFD_MACH_O_LC_IDFVMLIB:
987 bfd_mach_o_fvmlib_command *fvmlib = &cmd->command.fvmlib;
988 printf (" %s\n", fvmlib->name_str);
989 printf (" minor version: 0x%08x\n", fvmlib->minor_version);
990 printf (" header address: 0x%08x\n", fvmlib->header_addr);
993 case BFD_MACH_O_LC_CODE_SIGNATURE:
994 case BFD_MACH_O_LC_SEGMENT_SPLIT_INFO:
995 case BFD_MACH_O_LC_FUNCTION_STARTS:
997 bfd_mach_o_linkedit_command *linkedit = &cmd->command.linkedit;
1000 " dataoff: 0x%08lx datasize: 0x%08lx (endoff: 0x%08lx)\n",
1001 linkedit->dataoff, linkedit->datasize,
1002 linkedit->dataoff + linkedit->datasize);
1004 if (verbose && cmd->type == BFD_MACH_O_LC_CODE_SIGNATURE)
1005 dump_code_signature (abfd, linkedit);
1006 else if (verbose && cmd->type == BFD_MACH_O_LC_SEGMENT_SPLIT_INFO)
1007 dump_segment_split_info (abfd, linkedit);
1010 case BFD_MACH_O_LC_SUB_FRAMEWORK:
1011 case BFD_MACH_O_LC_SUB_UMBRELLA:
1012 case BFD_MACH_O_LC_SUB_LIBRARY:
1013 case BFD_MACH_O_LC_SUB_CLIENT:
1014 case BFD_MACH_O_LC_RPATH:
1016 bfd_mach_o_str_command *str = &cmd->command.str;
1017 printf (" %s\n", str->str);
1020 case BFD_MACH_O_LC_THREAD:
1021 case BFD_MACH_O_LC_UNIXTHREAD:
1022 dump_thread (abfd, cmd);
1024 case BFD_MACH_O_LC_ENCRYPTION_INFO:
1026 bfd_mach_o_encryption_info_command *cryp =
1027 &cmd->command.encryption_info;
1030 " cryptoff: 0x%08x cryptsize: 0x%08x (endoff 0x%08x)"
1032 cryp->cryptoff, cryp->cryptsize,
1033 cryp->cryptoff + cryp->cryptsize,
1037 case BFD_MACH_O_LC_DYLD_INFO:
1039 dump_dyld_info (abfd, cmd);
1041 case BFD_MACH_O_LC_VERSION_MIN_MACOSX:
1042 case BFD_MACH_O_LC_VERSION_MIN_IPHONEOS:
1044 bfd_mach_o_version_min_command *ver = &cmd->command.version_min;
1046 printf (" %u.%u.%u\n", ver->rel, ver->maj, ver->min);
1049 case BFD_MACH_O_LC_SOURCE_VERSION:
1051 bfd_mach_o_source_version_command *version =
1052 &cmd->command.source_version;
1054 " version a.b.c.d.e: %u.%u.%u.%u.%u\n",
1055 version->a, version->b, version->c, version->d, version->e);
1058 case BFD_MACH_O_LC_MAIN:
1060 bfd_mach_o_main_command *entry = &cmd->command.main;
1063 printf_vma (entry->entryoff);
1066 printf_vma (entry->stacksize);
1072 printf (" offset: 0x%08lx\n", (unsigned long)cmd->offset);
1073 printf (" size: 0x%08lx\n", (unsigned long)cmd->len);
1080 dump_load_commands (bfd *abfd, unsigned int cmd32, unsigned int cmd64)
1082 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
1085 for (i = 0; i < mdata->header.ncmds; i++)
1087 bfd_mach_o_load_command *cmd = &mdata->commands[i];
1090 dump_load_command (abfd, cmd, FALSE);
1091 else if (cmd->type == cmd32 || cmd->type == cmd64)
1092 dump_load_command (abfd, cmd, TRUE);
1096 static const char * const unwind_x86_64_regs[] =
1097 {"", "rbx", "r12", "r13", "r14", "r15", "rbp", "???" };
1099 static const char * const unwind_x86_regs[] =
1100 {"", "ebx", "ecx", "edx", "edi", "edi", "ebp", "???" };
1102 /* Dump x86 or x86-64 compact unwind encoding. Works for both architecture,
1103 as the encoding is the same (but not register names). */
1106 dump_unwind_encoding_x86 (unsigned int encoding, unsigned int sz,
1107 const char * const regs_name[])
1111 mode = encoding & MACH_O_UNWIND_X86_64_MODE_MASK;
1114 case MACH_O_UNWIND_X86_64_MODE_RBP_FRAME:
1117 char pfx = sz == 8 ? 'R' : 'E';
1119 regs = encoding & MACH_O_UNWIND_X86_64_RBP_FRAME_REGSITERS;
1120 printf (" %cSP frame", pfx);
1123 unsigned int offset;
1126 offset = (encoding & MACH_O_UNWIND_X86_64_RBP_FRAME_OFFSET) >> 16;
1127 printf (" at %cBP-%u:", pfx, offset * sz);
1128 for (i = 0; i < 5; i++)
1130 unsigned int reg = (regs >> (i * 3)) & 0x7;
1131 if (reg != MACH_O_UNWIND_X86_64_REG_NONE)
1132 printf (" %s", regs_name[reg]);
1137 case MACH_O_UNWIND_X86_64_MODE_STACK_IMMD:
1138 case MACH_O_UNWIND_X86_64_MODE_STACK_IND:
1140 unsigned int stack_size;
1141 unsigned int reg_count;
1142 unsigned int reg_perm;
1143 unsigned int regs[6];
1146 printf (" frameless");
1148 (encoding & MACH_O_UNWIND_X86_64_FRAMELESS_STACK_SIZE) >> 16;
1150 (encoding & MACH_O_UNWIND_X86_64_FRAMELESS_REG_COUNT) >> 10;
1151 reg_perm = encoding & MACH_O_UNWIND_X86_64_FRAMELESS_REG_PERMUTATION;
1153 if (mode == MACH_O_UNWIND_X86_64_MODE_STACK_IMMD)
1154 printf (" size: 0x%03x", stack_size * sz);
1157 unsigned int stack_adj;
1160 (encoding & MACH_O_UNWIND_X86_64_FRAMELESS_STACK_ADJUST) >> 13;
1161 printf (" size at 0x%03x + 0x%02x", stack_size, stack_adj * sz);
1163 /* Registers are coded using arithmetic compression: the register
1164 is indexed in range 0-6, the second in range 0-5, the third in
1165 range 0-4, etc. Already used registers are removed in next
1167 #define DO_PERM(R, NUM) R = reg_perm / NUM; reg_perm -= R * NUM
1172 DO_PERM (regs[0], 120);
1173 DO_PERM (regs[1], 24);
1174 DO_PERM (regs[2], 6);
1175 DO_PERM (regs[3], 2);
1176 DO_PERM (regs[4], 1);
1177 regs[5] = 0; /* Not used if reg_count = 5. */
1180 DO_PERM (regs[0], 60);
1181 DO_PERM (regs[1], 12);
1182 DO_PERM (regs[2], 3);
1183 DO_PERM (regs[3], 1);
1186 DO_PERM (regs[0], 20);
1187 DO_PERM (regs[1], 4);
1188 DO_PERM (regs[2], 1);
1191 DO_PERM (regs[0], 5);
1192 DO_PERM (regs[1], 1);
1195 DO_PERM (regs[0], 1);
1200 printf (" [bad reg count]");
1205 for (i = reg_count - 1; i >= 0; i--)
1207 unsigned int inc = 1;
1208 for (j = 0; j < i; j++)
1209 if (regs[i] >= regs[j])
1214 for (i = 0; i < (int) reg_count; i++)
1215 printf (" %s", regs_name[regs[i]]);
1218 case MACH_O_UNWIND_X86_64_MODE_DWARF:
1219 printf (" Dwarf offset: 0x%06x",
1220 encoding & MACH_O_UNWIND_X86_64_DWARF_SECTION_OFFSET);
1223 printf (" [unhandled mode]");
1229 dump_unwind_encoding (bfd_mach_o_data_struct *mdata, unsigned int encoding)
1231 printf ("0x%08x", encoding);
1235 switch (mdata->header.cputype)
1237 case BFD_MACH_O_CPU_TYPE_X86_64:
1238 dump_unwind_encoding_x86 (encoding, 8, unwind_x86_64_regs);
1240 case BFD_MACH_O_CPU_TYPE_I386:
1241 dump_unwind_encoding_x86 (encoding, 4, unwind_x86_regs);
1244 printf (" [unhandled cpu]");
1247 if (encoding & MACH_O_UNWIND_HAS_LSDA)
1249 if (encoding & MACH_O_UNWIND_PERSONALITY_MASK)
1250 printf (" PERS(%u)",
1251 ((encoding & MACH_O_UNWIND_PERSONALITY_MASK)
1252 >> MACH_O_UNWIND_PERSONALITY_SHIFT));
1256 dump_obj_compact_unwind (bfd *abfd,
1257 const unsigned char *content, bfd_size_type size)
1259 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
1260 int is_64 = mdata->header.version == 2;
1261 const unsigned char *p;
1263 printf (" compact unwind info:\n");
1264 printf (" start length personality lsda\n");
1268 struct mach_o_compact_unwind_64 *e =
1269 (struct mach_o_compact_unwind_64 *) content;
1271 for (p = content; p < content + size; p += sizeof (*e))
1273 e = (struct mach_o_compact_unwind_64 *) p;
1276 fprintf_vma (stdout, bfd_get_64 (abfd, e->start));
1277 printf (" %08lx", bfd_get_32 (abfd, e->length));
1279 fprintf_vma (stdout, bfd_get_64 (abfd, e->personnality));
1281 fprintf_vma (stdout, bfd_get_64 (abfd, e->lsda));
1284 printf (" encoding: ");
1285 dump_unwind_encoding (mdata, bfd_get_32 (abfd, e->encoding));
1291 printf ("unhandled\n");
1296 dump_exe_compact_unwind (bfd *abfd,
1297 const unsigned char *content, bfd_size_type size)
1299 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
1300 struct mach_o_unwind_info_header *hdr;
1301 unsigned int version;
1302 unsigned int encodings_offset;
1303 unsigned int encodings_count;
1304 unsigned int personality_offset;
1305 unsigned int personality_count;
1306 unsigned int index_offset;
1307 unsigned int index_count;
1308 struct mach_o_unwind_index_entry *index_entry;
1312 printf (" compact unwind info:\n");
1314 hdr = (struct mach_o_unwind_info_header *) content;
1315 if (size < sizeof (*hdr))
1317 printf (" truncated!\n");
1321 version = bfd_get_32 (abfd, hdr->version);
1322 if (version != MACH_O_UNWIND_SECTION_VERSION)
1324 printf (" unknown version: %u\n", version);
1327 encodings_offset = bfd_get_32 (abfd, hdr->encodings_array_offset);
1328 encodings_count = bfd_get_32 (abfd, hdr->encodings_array_count);
1329 personality_offset = bfd_get_32 (abfd, hdr->personality_array_offset);
1330 personality_count = bfd_get_32 (abfd, hdr->personality_array_count);
1331 index_offset = bfd_get_32 (abfd, hdr->index_offset);
1332 index_count = bfd_get_32 (abfd, hdr->index_count);
1333 printf (" %u encodings, %u personalities, %u level-1 indexes:\n",
1334 encodings_count, personality_count, index_count);
1336 /* Level-1 index. */
1337 printf (" idx function level2 off lsda off\n");
1339 index_entry = (struct mach_o_unwind_index_entry *) (content + index_offset);
1340 for (i = 0; i < index_count; i++)
1342 unsigned int func_offset;
1343 unsigned int level2_offset;
1344 unsigned int lsda_offset;
1346 func_offset = bfd_get_32 (abfd, index_entry->function_offset);
1347 level2_offset = bfd_get_32 (abfd, index_entry->second_level_offset);
1348 lsda_offset = bfd_get_32 (abfd, index_entry->lsda_index_offset);
1349 printf (" %3u 0x%08x 0x%08x 0x%08x\n",
1350 i, func_offset, level2_offset, lsda_offset);
1354 /* Level-1 index. */
1355 index_entry = (struct mach_o_unwind_index_entry *) (content + index_offset);
1356 for (i = 0; i < index_count; i++)
1358 unsigned int func_offset;
1359 unsigned int level2_offset;
1360 const unsigned char *level2;
1363 func_offset = bfd_get_32 (abfd, index_entry->function_offset);
1364 level2_offset = bfd_get_32 (abfd, index_entry->second_level_offset);
1366 /* No level-2 for this index (should be the last index). */
1367 if (level2_offset == 0)
1370 level2 = content + level2_offset;
1371 kind = bfd_get_32 (abfd, level2);
1374 case MACH_O_UNWIND_SECOND_LEVEL_COMPRESSED:
1376 struct mach_o_unwind_compressed_second_level_page_header *l2;
1377 unsigned int entry_offset;
1378 unsigned int entry_count;
1379 unsigned int l2_encodings_offset;
1380 unsigned int l2_encodings_count;
1381 const unsigned char *en;
1384 l2 = (struct mach_o_unwind_compressed_second_level_page_header *)
1386 entry_offset = bfd_get_16 (abfd, l2->entry_page_offset);
1387 entry_count = bfd_get_16 (abfd, l2->entry_count);
1388 l2_encodings_offset = bfd_get_16 (abfd, l2->encodings_offset);
1389 l2_encodings_count = bfd_get_16 (abfd, l2->encodings_count);
1391 printf (" index %2u: compressed second level: "
1392 "%u entries, %u encodings (at 0x%08x)\n",
1393 i, entry_count, l2_encodings_count, l2_encodings_offset);
1394 printf (" # function eidx encoding\n");
1396 en = level2 + entry_offset;
1397 for (j = 0; j < entry_count; j++)
1400 unsigned int en_func;
1401 unsigned int enc_idx;
1402 unsigned int encoding;
1403 const unsigned char *enc_addr;
1405 entry = bfd_get_32 (abfd, en);
1407 MACH_O_UNWIND_INFO_COMPRESSED_ENTRY_FUNC_OFFSET (entry);
1409 MACH_O_UNWIND_INFO_COMPRESSED_ENTRY_ENCODING_INDEX (entry);
1410 if (enc_idx < encodings_count)
1411 enc_addr = content + encodings_offset
1414 enc_addr = level2 + l2_encodings_offset
1415 + 4 * (enc_idx - encodings_count);
1416 encoding = bfd_get_32 (abfd, enc_addr);
1418 printf (" %-4u 0x%08x [%3u] ", j,
1419 func_offset + en_func, enc_idx);
1420 dump_unwind_encoding (mdata, encoding);
1428 case MACH_O_UNWIND_SECOND_LEVEL_REGULAR:
1430 struct mach_o_unwind_regular_second_level_page_header *l2;
1431 struct mach_o_unwind_regular_second_level_entry *en;
1432 unsigned int entry_offset;
1433 unsigned int entry_count;
1436 l2 = (struct mach_o_unwind_regular_second_level_page_header *)
1439 entry_offset = bfd_get_16 (abfd, l2->entry_page_offset);
1440 entry_count = bfd_get_16 (abfd, l2->entry_count);
1441 printf (" index %2u: regular level 2 at 0x%04x, %u entries\n",
1442 i, entry_offset, entry_count);
1443 printf (" # function encoding\n");
1445 en = (struct mach_o_unwind_regular_second_level_entry *)
1446 (level2 + entry_offset);
1447 for (j = 0; j < entry_count; j++)
1449 unsigned int en_func;
1450 unsigned int encoding;
1452 en_func = bfd_get_32 (abfd, en->function_offset);
1453 encoding = bfd_get_32 (abfd, en->encoding);
1454 printf (" %-4u 0x%08x ", j, en_func);
1455 dump_unwind_encoding (mdata, encoding);
1463 printf (" index %2u: unhandled second level format (%u)\n",
1469 struct mach_o_unwind_lsda_index_entry *lsda;
1470 unsigned int lsda_offset;
1471 unsigned int next_lsda_offset;
1472 unsigned int nbr_lsda;
1475 lsda_offset = bfd_get_32 (abfd, index_entry->lsda_index_offset);
1476 next_lsda_offset = bfd_get_32 (abfd, index_entry[1].lsda_index_offset);
1477 lsda = (struct mach_o_unwind_lsda_index_entry *)
1478 (content + lsda_offset);
1479 nbr_lsda = (next_lsda_offset - lsda_offset) / sizeof (*lsda);
1480 for (j = 0; j < nbr_lsda; j++)
1482 printf (" lsda %3u: function 0x%08x lsda 0x%08x\n",
1483 j, (unsigned int) bfd_get_32 (abfd, lsda->function_offset),
1484 (unsigned int) bfd_get_32 (abfd, lsda->lsda_offset));
1493 dump_section_content (bfd *abfd,
1494 const char *segname, const char *sectname,
1495 void (*dump)(bfd*, const unsigned char*, bfd_size_type))
1497 bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
1500 for (i = 0; i < mdata->header.ncmds; i++)
1502 bfd_mach_o_load_command *cmd = &mdata->commands[i];
1503 if (cmd->type == BFD_MACH_O_LC_SEGMENT
1504 || cmd->type == BFD_MACH_O_LC_SEGMENT_64)
1506 bfd_mach_o_segment_command *seg = &cmd->command.segment;
1507 bfd_mach_o_section *sec;
1508 for (sec = seg->sect_head; sec != NULL; sec = sec->next)
1509 if (strcmp (sec->segname, segname) == 0
1510 && strcmp (sec->sectname, sectname) == 0)
1513 asection *bfdsec = sec->bfdsection;
1514 unsigned char *content;
1516 size = bfd_get_section_size (bfdsec);
1517 content = (unsigned char *) xmalloc (size);
1518 bfd_get_section_contents (abfd, bfdsec, content, 0, size);
1520 (*dump)(abfd, content, size);
1528 /* Dump ABFD (according to the options[] array). */
1531 mach_o_dump (bfd *abfd)
1533 if (options[OPT_HEADER].selected)
1535 if (options[OPT_SECTION].selected)
1536 dump_load_commands (abfd, BFD_MACH_O_LC_SEGMENT, BFD_MACH_O_LC_SEGMENT_64);
1537 if (options[OPT_MAP].selected)
1538 dump_section_map (abfd);
1539 if (options[OPT_LOAD].selected)
1540 dump_load_commands (abfd, 0, 0);
1541 if (options[OPT_DYSYMTAB].selected)
1542 dump_load_commands (abfd, BFD_MACH_O_LC_DYSYMTAB, 0);
1543 if (options[OPT_CODESIGN].selected)
1544 dump_load_commands (abfd, BFD_MACH_O_LC_CODE_SIGNATURE, 0);
1545 if (options[OPT_SEG_SPLIT_INFO].selected)
1546 dump_load_commands (abfd, BFD_MACH_O_LC_SEGMENT_SPLIT_INFO, 0);
1547 if (options[OPT_COMPACT_UNWIND].selected)
1549 dump_section_content (abfd, "__LD", "__compact_unwind",
1550 dump_obj_compact_unwind);
1551 dump_section_content (abfd, "__TEXT", "__unwind_info",
1552 dump_exe_compact_unwind);
1556 /* Vector for Mach-O. */
1558 const struct objdump_private_desc objdump_private_desc_mach_o =