/* od-macho.c -- dump information about an Mach-O object file.
   Copyright (C) 2011-2022 Free Software Foundation, Inc.
   Written by Tristan Gingold, Adacore.

   This file is part of GNU Binutils.

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3, or (at your option)
   any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   Foundation, 51 Franklin Street - Fifth Floor, Boston,
   MA 02110-1301, USA.  */

#include "sysdep.h"
#include <stddef.h>
#include <time.h>
#include "safe-ctype.h"
#include "bfd.h"
#include "objdump.h"
#include "bucomm.h"
#include "elfcomm.h"
#include "dwarf.h"
#include "bfdlink.h"
#include "mach-o.h"
#include "mach-o/external.h"
#include "mach-o/codesign.h"
#include "mach-o/unwind.h"

/* Index of the options in the options[] array.  */
#define OPT_HEADER 0
#define OPT_SECTION 1
#define OPT_MAP 2
#define OPT_LOAD 3
#define OPT_DYSYMTAB 4
#define OPT_CODESIGN 5
#define OPT_SEG_SPLIT_INFO 6
#define OPT_COMPACT_UNWIND 7
#define OPT_FUNCTION_STARTS 8
#define OPT_DATA_IN_CODE 9
#define OPT_TWOLEVEL_HINTS 10
#define OPT_DYLD_INFO 11

/* List of actions.  */
static struct objdump_private_option options[] =
  {
    { "header", 0 },
    { "section", 0 },
    { "map", 0 },
    { "load", 0 },
    { "dysymtab", 0 },
    { "codesign", 0 },
    { "seg_split_info", 0 },
    { "compact_unwind", 0 },
    { "function_starts", 0 },
    { "data_in_code", 0 },
    { "twolevel_hints", 0 },
    { "dyld_info", 0 },
    { NULL, 0 }
  };

/* Display help.  */

static void
mach_o_help (FILE *stream)
{
  fprintf (stream, _("\
For Mach-O files:\n\
  header           Display the file header\n\
  section          Display the segments and sections commands\n\
  map              Display the section map\n\
  load             Display the load commands\n\
  dysymtab         Display the dynamic symbol table\n\
  codesign         Display code signature\n\
  seg_split_info   Display segment split info\n\
  compact_unwind   Display compact unwinding info\n\
  function_starts  Display start address of functions\n\
  data_in_code     Display data in code entries\n\
  twolevel_hints   Display the two-level namespace lookup hints table\n\
  dyld_info        Display dyld information\n\
"));
}

/* Return TRUE if ABFD is handled.  */

static int
mach_o_filter (bfd *abfd)
{
  return bfd_get_flavour (abfd) == bfd_target_mach_o_flavour;
}

static const bfd_mach_o_xlat_name bfd_mach_o_cpu_name[] =
{
  { "vax", BFD_MACH_O_CPU_TYPE_VAX },
  { "mc680x0", BFD_MACH_O_CPU_TYPE_MC680x0 },
  { "i386", BFD_MACH_O_CPU_TYPE_I386 },
  { "mips", BFD_MACH_O_CPU_TYPE_MIPS },
  { "mc98000", BFD_MACH_O_CPU_TYPE_MC98000 },
  { "hppa", BFD_MACH_O_CPU_TYPE_HPPA },
  { "arm", BFD_MACH_O_CPU_TYPE_ARM },
  { "mc88000", BFD_MACH_O_CPU_TYPE_MC88000 },
  { "sparc", BFD_MACH_O_CPU_TYPE_SPARC },
  { "alpha", BFD_MACH_O_CPU_TYPE_ALPHA },
  { "powerpc", BFD_MACH_O_CPU_TYPE_POWERPC },
  { "powerpc_64", BFD_MACH_O_CPU_TYPE_POWERPC_64 },
  { "x86_64", BFD_MACH_O_CPU_TYPE_X86_64 },
  { "arm64", BFD_MACH_O_CPU_TYPE_ARM64 },
  { NULL, 0}
};

static const bfd_mach_o_xlat_name bfd_mach_o_filetype_name[] =
{
  { "object", BFD_MACH_O_MH_OBJECT },
  { "execute", BFD_MACH_O_MH_EXECUTE },
  { "fvmlib", BFD_MACH_O_MH_FVMLIB },
  { "core", BFD_MACH_O_MH_CORE },
  { "preload", BFD_MACH_O_MH_PRELOAD },
  { "dylib", BFD_MACH_O_MH_DYLIB },
  { "dylinker", BFD_MACH_O_MH_DYLINKER },
  { "bundle", BFD_MACH_O_MH_BUNDLE },
  { "dylib_stub", BFD_MACH_O_MH_DYLIB_STUB },
  { "dym", BFD_MACH_O_MH_DSYM },
  { "kext_bundle", BFD_MACH_O_MH_KEXT_BUNDLE },
  { NULL, 0}
};

static const bfd_mach_o_xlat_name bfd_mach_o_header_flags_name[] =
{
  { "noundefs", BFD_MACH_O_MH_NOUNDEFS },
  { "incrlink", BFD_MACH_O_MH_INCRLINK },
  { "dyldlink", BFD_MACH_O_MH_DYLDLINK },
  { "bindatload", BFD_MACH_O_MH_BINDATLOAD },
  { "prebound", BFD_MACH_O_MH_PREBOUND },
  { "split_segs", BFD_MACH_O_MH_SPLIT_SEGS },
  { "lazy_init", BFD_MACH_O_MH_LAZY_INIT },
  { "twolevel", BFD_MACH_O_MH_TWOLEVEL },
  { "force_flat", BFD_MACH_O_MH_FORCE_FLAT },
  { "nomultidefs", BFD_MACH_O_MH_NOMULTIDEFS },
  { "nofixprebinding", BFD_MACH_O_MH_NOFIXPREBINDING },
  { "prebindable", BFD_MACH_O_MH_PREBINDABLE },
  { "allmodsbound", BFD_MACH_O_MH_ALLMODSBOUND },
  { "subsections_via_symbols", BFD_MACH_O_MH_SUBSECTIONS_VIA_SYMBOLS },
  { "canonical", BFD_MACH_O_MH_CANONICAL },
  { "weak_defines", BFD_MACH_O_MH_WEAK_DEFINES },
  { "binds_to_weak", BFD_MACH_O_MH_BINDS_TO_WEAK },
  { "allow_stack_execution", BFD_MACH_O_MH_ALLOW_STACK_EXECUTION },
  { "root_safe", BFD_MACH_O_MH_ROOT_SAFE },
  { "setuid_safe", BFD_MACH_O_MH_SETUID_SAFE },
  { "no_reexported_dylibs", BFD_MACH_O_MH_NO_REEXPORTED_DYLIBS },
  { "pie", BFD_MACH_O_MH_PIE },
  { "dead_strippable_dylib", BFD_MACH_O_MH_DEAD_STRIPPABLE_DYLIB },
  { "has_tlv", BFD_MACH_O_MH_HAS_TLV_DESCRIPTORS },
  { "no_heap_execution", BFD_MACH_O_MH_NO_HEAP_EXECUTION },
  { "app_extension_safe", BFD_MACH_O_MH_APP_EXTENSION_SAFE },
  { NULL, 0}
};

static const bfd_mach_o_xlat_name bfd_mach_o_load_command_name[] =
{
  { "segment", BFD_MACH_O_LC_SEGMENT},
  { "symtab", BFD_MACH_O_LC_SYMTAB},
  { "symseg", BFD_MACH_O_LC_SYMSEG},
  { "thread", BFD_MACH_O_LC_THREAD},
  { "unixthread", BFD_MACH_O_LC_UNIXTHREAD},
  { "loadfvmlib", BFD_MACH_O_LC_LOADFVMLIB},
  { "idfvmlib", BFD_MACH_O_LC_IDFVMLIB},
  { "ident", BFD_MACH_O_LC_IDENT},
  { "fvmfile", BFD_MACH_O_LC_FVMFILE},
  { "prepage", BFD_MACH_O_LC_PREPAGE},
  { "dysymtab", BFD_MACH_O_LC_DYSYMTAB},
  { "load_dylib", BFD_MACH_O_LC_LOAD_DYLIB},
  { "id_dylib", BFD_MACH_O_LC_ID_DYLIB},
  { "load_dylinker", BFD_MACH_O_LC_LOAD_DYLINKER},
  { "id_dylinker", BFD_MACH_O_LC_ID_DYLINKER},
  { "prebound_dylib", BFD_MACH_O_LC_PREBOUND_DYLIB},
  { "routines", BFD_MACH_O_LC_ROUTINES},
  { "sub_framework", BFD_MACH_O_LC_SUB_FRAMEWORK},
  { "sub_umbrella", BFD_MACH_O_LC_SUB_UMBRELLA},
  { "sub_client", BFD_MACH_O_LC_SUB_CLIENT},
  { "sub_library", BFD_MACH_O_LC_SUB_LIBRARY},
  { "twolevel_hints", BFD_MACH_O_LC_TWOLEVEL_HINTS},
  { "prebind_cksum", BFD_MACH_O_LC_PREBIND_CKSUM},
  { "load_weak_dylib", BFD_MACH_O_LC_LOAD_WEAK_DYLIB},
  { "segment_64", BFD_MACH_O_LC_SEGMENT_64},
  { "routines_64", BFD_MACH_O_LC_ROUTINES_64},
  { "uuid", BFD_MACH_O_LC_UUID},
  { "rpath", BFD_MACH_O_LC_RPATH},
  { "code_signature", BFD_MACH_O_LC_CODE_SIGNATURE},
  { "segment_split_info", BFD_MACH_O_LC_SEGMENT_SPLIT_INFO},
  { "reexport_dylib", BFD_MACH_O_LC_REEXPORT_DYLIB},
  { "lazy_load_dylib", BFD_MACH_O_LC_LAZY_LOAD_DYLIB},
  { "encryption_info", BFD_MACH_O_LC_ENCRYPTION_INFO},
  { "dyld_info", BFD_MACH_O_LC_DYLD_INFO},
  { "load_upward_lib", BFD_MACH_O_LC_LOAD_UPWARD_DYLIB},
  { "version_min_macosx", BFD_MACH_O_LC_VERSION_MIN_MACOSX},
  { "version_min_iphoneos", BFD_MACH_O_LC_VERSION_MIN_IPHONEOS},
  { "function_starts", BFD_MACH_O_LC_FUNCTION_STARTS},
  { "dyld_environment", BFD_MACH_O_LC_DYLD_ENVIRONMENT},
  { "main", BFD_MACH_O_LC_MAIN},
  { "data_in_code", BFD_MACH_O_LC_DATA_IN_CODE},
  { "source_version", BFD_MACH_O_LC_SOURCE_VERSION},
  { "dylib_code_sign_drs", BFD_MACH_O_LC_DYLIB_CODE_SIGN_DRS},
  { "encryption_info_64", BFD_MACH_O_LC_ENCRYPTION_INFO_64},
  { "linker_options", BFD_MACH_O_LC_LINKER_OPTIONS},
  { "linker_optimization_hint", BFD_MACH_O_LC_LINKER_OPTIMIZATION_HINT},
  { "version_min_tvos", BFD_MACH_O_LC_VERSION_MIN_TVOS},
  { "version_min_watchos", BFD_MACH_O_LC_VERSION_MIN_WATCHOS},
  { "note", BFD_MACH_O_LC_NOTE},
  { "build_version", BFD_MACH_O_LC_BUILD_VERSION},
  { "exports_trie", BFD_MACH_O_LC_DYLD_EXPORTS_TRIE},
  { "chained_fixups", BFD_MACH_O_LC_DYLD_CHAINED_FIXUPS},
  { NULL, 0}
};

static const bfd_mach_o_xlat_name bfd_mach_o_thread_x86_name[] =
{
  { "thread_state32", BFD_MACH_O_x86_THREAD_STATE32},
  { "float_state32", BFD_MACH_O_x86_FLOAT_STATE32},
  { "exception_state32", BFD_MACH_O_x86_EXCEPTION_STATE32},
  { "thread_state64", BFD_MACH_O_x86_THREAD_STATE64},
  { "float_state64", BFD_MACH_O_x86_FLOAT_STATE64},
  { "exception_state64", BFD_MACH_O_x86_EXCEPTION_STATE64},
  { "thread_state", BFD_MACH_O_x86_THREAD_STATE},
  { "float_state", BFD_MACH_O_x86_FLOAT_STATE},
  { "exception_state", BFD_MACH_O_x86_EXCEPTION_STATE},
  { "debug_state32", BFD_MACH_O_x86_DEBUG_STATE32},
  { "debug_state64", BFD_MACH_O_x86_DEBUG_STATE64},
  { "debug_state", BFD_MACH_O_x86_DEBUG_STATE},
  { "state_none", BFD_MACH_O_x86_THREAD_STATE_NONE},
  { NULL, 0 }
};

static const bfd_mach_o_xlat_name bfd_mach_o_platform_name[] =
{
  { "macos", BFD_MACH_O_PLATFORM_MACOS},
  { "ios", BFD_MACH_O_PLATFORM_IOS},
  { "tvos", BFD_MACH_O_PLATFORM_TVOS},
  { "watchos", BFD_MACH_O_PLATFORM_WATCHOS},
  { "bridgeos", BFD_MACH_O_PLATFORM_BRIDGEOS},
  { NULL, 0 }
};

static const bfd_mach_o_xlat_name bfd_mach_o_tool_name[] =
{
  { "clang", BFD_MACH_O_TOOL_CLANG},
  { "swift", BFD_MACH_O_TOOL_SWIFT},
  { "ld", BFD_MACH_O_TOOL_LD},
  { NULL, 0 }
};

static void
bfd_mach_o_print_flags (const bfd_mach_o_xlat_name *table,
                        unsigned long val)
{
  int first = 1;

  for (; table->name; table++)
    {
      if (table->val & val)
        {
          if (!first)
            printf ("+");
          printf ("%s", table->name);
          val &= ~table->val;
          first = 0;
        }
    }
  if (val)
    {
      if (!first)
        printf ("+");
      printf ("0x%lx", val);
      return;
    }
  if (first)
    printf ("-");
}

static const char *
bfd_mach_o_get_name_or_null (const bfd_mach_o_xlat_name *table,
                             unsigned long val)
{
  for (; table->name; table++)
    if (table->val == val)
      return table->name;
  return NULL;
}

static const char *
bfd_mach_o_get_name (const bfd_mach_o_xlat_name *table, unsigned long val)
{
  const char *res = bfd_mach_o_get_name_or_null (table, val);

  if (res == NULL)
    return "*UNKNOWN*";
  else
    return res;
}

static void
dump_header (bfd *abfd)
{
  bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
  bfd_mach_o_header *h = &mdata->header;

  fputs (_("Mach-O header:\n"), stdout);
  printf (_(" magic     : %08lx\n"), h->magic);
  printf (_(" cputype   : %08lx (%s)\n"), h->cputype,
          bfd_mach_o_get_name (bfd_mach_o_cpu_name, h->cputype));
  printf (_(" cpusubtype: %08lx\n"), h->cpusubtype);
  printf (_(" filetype  : %08lx (%s)\n"),
          h->filetype,
          bfd_mach_o_get_name (bfd_mach_o_filetype_name, h->filetype));
  printf (_(" ncmds     : %08lx (%lu)\n"), h->ncmds, h->ncmds);
  printf (_(" sizeofcmds: %08lx (%lu)\n"), h->sizeofcmds, h->sizeofcmds);
  printf (_(" flags     : %08lx ("), h->flags);
  bfd_mach_o_print_flags (bfd_mach_o_header_flags_name, h->flags);
  fputs (_(")\n"), stdout);
  printf (_(" reserved  : %08x\n"), h->reserved);
  putchar ('\n');
}

static void
disp_segment_prot (unsigned int prot)
{
  putchar (prot & BFD_MACH_O_PROT_READ ? 'r' : '-');
  putchar (prot & BFD_MACH_O_PROT_WRITE ? 'w' : '-');
  putchar (prot & BFD_MACH_O_PROT_EXECUTE ? 'x' : '-');
}

static void
dump_section_map (bfd *abfd)
{
  bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
  bfd_mach_o_load_command *cmd;
  unsigned int sec_nbr = 0;

  fputs (_("Segments and Sections:\n"), stdout);
  fputs (_(" #: Segment name     Section name     Address\n"), stdout);

  for (cmd = mdata->first_command; cmd != NULL; cmd = cmd->next)
    {
      bfd_mach_o_segment_command *seg;
      bfd_mach_o_section *sec;

      if (cmd->type != BFD_MACH_O_LC_SEGMENT
	  && cmd->type != BFD_MACH_O_LC_SEGMENT_64)
	continue;

      seg = &cmd->command.segment;

      printf ("[Segment %-16s ", seg->segname);
      bfd_printf_vma (abfd, seg->vmaddr);
      putchar ('-');
      bfd_printf_vma (abfd, seg->vmaddr + seg->vmsize - 1);
      putchar (' ');
      disp_segment_prot (seg->initprot);
      printf ("]\n");

      for (sec = seg->sect_head; sec != NULL; sec = sec->next)
	{
	  printf ("%02u: %-16s %-16s ", ++sec_nbr,
                  sec->segname, sec->sectname);
	  bfd_printf_vma (abfd, sec->addr);
	  putchar (' ');
	  bfd_printf_vma (abfd, sec->size);
	  printf (" %08lx\n", sec->flags);
	}
    }
}

static void
dump_section_header (bfd *abfd, bfd_mach_o_section *sec)
{
  printf (" Section: %-16s %-16s (bfdname: %s)\n",
           sec->sectname, sec->segname, sec->bfdsection->name);
  printf ("  addr: ");
  bfd_printf_vma (abfd, sec->addr);
  printf (" size: ");
  bfd_printf_vma (abfd, sec->size);
  printf (" offset: ");
  bfd_printf_vma (abfd, sec->offset);
  printf ("\n");
  printf ("  align: %ld", sec->align);
  printf ("  nreloc: %lu  reloff: ", sec->nreloc);
  bfd_printf_vma (abfd, sec->reloff);
  printf ("\n");
  printf ("  flags: %08lx (type: %s", sec->flags,
          bfd_mach_o_get_name (bfd_mach_o_section_type_name,
                               sec->flags & BFD_MACH_O_SECTION_TYPE_MASK));
  printf (" attr: ");
  bfd_mach_o_print_flags (bfd_mach_o_section_attribute_name,
                          sec->flags & BFD_MACH_O_SECTION_ATTRIBUTES_MASK);
  printf (")\n");
  switch (sec->flags & BFD_MACH_O_SECTION_TYPE_MASK)
    {
    case BFD_MACH_O_S_NON_LAZY_SYMBOL_POINTERS:
    case BFD_MACH_O_S_LAZY_SYMBOL_POINTERS:
    case BFD_MACH_O_S_SYMBOL_STUBS:
      printf ("  first indirect sym: %lu", sec->reserved1);
      printf (" (%u entries)",
               bfd_mach_o_section_get_nbr_indirect (abfd, sec));
      break;
    default:
      printf ("  reserved1: 0x%lx", sec->reserved1);
      break;
    }
  switch (sec->flags & BFD_MACH_O_SECTION_TYPE_MASK)
    {
    case BFD_MACH_O_S_SYMBOL_STUBS:
      printf ("  stub size: %lu", sec->reserved2);
      break;
    default:
      printf ("  reserved2: 0x%lx", sec->reserved2);
      break;
    }
  printf ("  reserved3: 0x%lx\n", sec->reserved3);
}

static void
dump_segment (bfd *abfd, bfd_mach_o_load_command *cmd)
{
  bfd_mach_o_segment_command *seg = &cmd->command.segment;
  bfd_mach_o_section *sec;

  printf ("     name: %16s", *seg->segname ? seg->segname : "*none*");
  printf ("  nsects: %lu", seg->nsects);
  printf ("  flags: %lx", seg->flags);
  printf ("  initprot: ");
  disp_segment_prot (seg->initprot);
  printf ("  maxprot: ");
  disp_segment_prot (seg->maxprot);
  printf ("\n");
  printf ("   vmaddr: ");
  bfd_printf_vma (abfd, seg->vmaddr);
  printf ("   vmsize: ");
  bfd_printf_vma (abfd, seg->vmsize);
  printf ("\n");
  printf ("  fileoff: ");
  bfd_printf_vma (abfd, seg->fileoff);
  printf (" filesize: ");
  bfd_printf_vma (abfd, (bfd_vma) seg->filesize);
  printf (" endoff: ");
  bfd_printf_vma (abfd, (bfd_vma) (seg->fileoff + seg->filesize));
  printf ("\n");
  for (sec = seg->sect_head; sec != NULL; sec = sec->next)
    dump_section_header (abfd, sec);
}

static void
dump_dysymtab (bfd *abfd, bfd_mach_o_load_command *cmd, bool verbose)
{
  bfd_mach_o_dysymtab_command *dysymtab = &cmd->command.dysymtab;
  bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
  unsigned int i;

  printf ("              local symbols: idx: %10lu  num: %-8lu",
          dysymtab->ilocalsym, dysymtab->nlocalsym);
  printf (" (nxtidx: %lu)\n",
          dysymtab->ilocalsym + dysymtab->nlocalsym);
  printf ("           external symbols: idx: %10lu  num: %-8lu",
          dysymtab->iextdefsym, dysymtab->nextdefsym);
  printf (" (nxtidx: %lu)\n",
          dysymtab->iextdefsym + dysymtab->nextdefsym);
  printf ("          undefined symbols: idx: %10lu  num: %-8lu",
          dysymtab->iundefsym, dysymtab->nundefsym);
  printf (" (nxtidx: %lu)\n",
          dysymtab->iundefsym + dysymtab->nundefsym);
  printf ("           table of content: off: 0x%08lx  num: %-8lu",
          dysymtab->tocoff, dysymtab->ntoc);
  printf (" (endoff: 0x%08lx)\n",
          dysymtab->tocoff + dysymtab->ntoc * BFD_MACH_O_TABLE_OF_CONTENT_SIZE);
  printf ("               module table: off: 0x%08lx  num: %-8lu",
          dysymtab->modtaboff, dysymtab->nmodtab);
  printf (" (endoff: 0x%08lx)\n",
          dysymtab->modtaboff + dysymtab->nmodtab
          * (mdata->header.version == 2 ?
             BFD_MACH_O_DYLIB_MODULE_64_SIZE : BFD_MACH_O_DYLIB_MODULE_SIZE));
  printf ("   external reference table: off: 0x%08lx  num: %-8lu",
          dysymtab->extrefsymoff, dysymtab->nextrefsyms);
  printf (" (endoff: 0x%08lx)\n",
          dysymtab->extrefsymoff
          + dysymtab->nextrefsyms * BFD_MACH_O_REFERENCE_SIZE);
  printf ("      indirect symbol table: off: 0x%08lx  num: %-8lu",
          dysymtab->indirectsymoff, dysymtab->nindirectsyms);
  printf (" (endoff: 0x%08lx)\n",
          dysymtab->indirectsymoff
          + dysymtab->nindirectsyms * BFD_MACH_O_INDIRECT_SYMBOL_SIZE);
  printf ("  external relocation table: off: 0x%08lx  num: %-8lu",
          dysymtab->extreloff, dysymtab->nextrel);
  printf (" (endoff: 0x%08lx)\n",
          dysymtab->extreloff + dysymtab->nextrel * BFD_MACH_O_RELENT_SIZE);
  printf ("     local relocation table: off: 0x%08lx  num: %-8lu",
          dysymtab->locreloff, dysymtab->nlocrel);
  printf (" (endoff: 0x%08lx)\n",
          dysymtab->locreloff + dysymtab->nlocrel * BFD_MACH_O_RELENT_SIZE);

  if (!verbose)
    return;

  if (dysymtab->ntoc > 0
      || dysymtab->nindirectsyms > 0
      || dysymtab->nextrefsyms > 0)
    {
      /* Try to read the symbols to display the toc or indirect symbols.  */
      bfd_mach_o_read_symtab_symbols (abfd);
    }
  else if (dysymtab->nmodtab > 0)
    {
      /* Try to read the strtab to display modules name.  */
      bfd_mach_o_read_symtab_strtab (abfd);
    }

  for (i = 0; i < dysymtab->nmodtab; i++)
    {
      bfd_mach_o_dylib_module *module = &dysymtab->dylib_module[i];
      printf ("  module %u:\n", i);
      printf ("   name: %lu", module->module_name_idx);
      if (mdata->symtab && mdata->symtab->strtab)
        printf (": %s",
                 mdata->symtab->strtab + module->module_name_idx);
      printf ("\n");
      printf ("   extdefsym: idx: %8lu  num: %lu\n",
               module->iextdefsym, module->nextdefsym);
      printf ("      refsym: idx: %8lu  num: %lu\n",
               module->irefsym, module->nrefsym);
      printf ("    localsym: idx: %8lu  num: %lu\n",
               module->ilocalsym, module->nlocalsym);
      printf ("      extrel: idx: %8lu  num: %lu\n",
               module->iextrel, module->nextrel);
      printf ("        init: idx: %8u  num: %u\n",
               module->iinit, module->ninit);
      printf ("        term: idx: %8u  num: %u\n",
               module->iterm, module->nterm);
      printf ("   objc_module_info: addr: ");
      bfd_printf_vma (abfd, module->objc_module_info_addr);
      printf ("  size: %lu\n", module->objc_module_info_size);
    }

  if (dysymtab->ntoc > 0)
    {
      bfd_mach_o_symtab_command *symtab = mdata->symtab;

      printf ("  table of content: (symbol/module)\n");
      for (i = 0; i < dysymtab->ntoc; i++)
        {
          bfd_mach_o_dylib_table_of_content *toc = &dysymtab->dylib_toc[i];

          printf ("   %4u: ", i);
          if (symtab && symtab->symbols && toc->symbol_index < symtab->nsyms)
            {
              const char *name = symtab->symbols[toc->symbol_index].symbol.name;
              printf ("%s (%lu)", name ? name : "*invalid*",
                       toc->symbol_index);
            }
          else
            printf ("%lu", toc->symbol_index);

          printf (" / ");
          if (symtab && symtab->strtab
              && toc->module_index < dysymtab->nmodtab)
            {
              bfd_mach_o_dylib_module *mod;
              mod = &dysymtab->dylib_module[toc->module_index];
              printf ("%s (%lu)",
                       symtab->strtab + mod->module_name_idx,
                       toc->module_index);
            }
          else
            printf ("%lu", toc->module_index);

          printf ("\n");
        }
    }

  if (dysymtab->nindirectsyms != 0)
    {
      printf ("  indirect symbols:\n");

      for (i = 0; i < mdata->nsects; i++)
        {
          bfd_mach_o_section *sec = mdata->sections[i];
          unsigned int j, first, last;
          bfd_mach_o_symtab_command *symtab = mdata->symtab;
          bfd_vma addr;
          bfd_vma entry_size;

          switch (sec->flags & BFD_MACH_O_SECTION_TYPE_MASK)
            {
            case BFD_MACH_O_S_NON_LAZY_SYMBOL_POINTERS:
            case BFD_MACH_O_S_LAZY_SYMBOL_POINTERS:
            case BFD_MACH_O_S_SYMBOL_STUBS:
              first = sec->reserved1;
              last = first + bfd_mach_o_section_get_nbr_indirect (abfd, sec);
              addr = sec->addr;
              entry_size = bfd_mach_o_section_get_entry_size (abfd, sec);
              printf ("  for section %s.%s:\n",
                       sec->segname, sec->sectname);
              for (j = first; j < last; j++)
                {
                  unsigned int isym = dysymtab->indirect_syms[j];

                  printf ("   ");
                  bfd_printf_vma (abfd, addr);
                  printf (" %5u: 0x%08x", j, isym);
                  if (isym & BFD_MACH_O_INDIRECT_SYMBOL_LOCAL)
                    printf (" LOCAL");
                  if (isym & BFD_MACH_O_INDIRECT_SYMBOL_ABS)
                    printf (" ABSOLUTE");
                  if (symtab && symtab->symbols
                      && isym < symtab->nsyms
                      && symtab->symbols[isym].symbol.name)
                    printf (" %s", symtab->symbols[isym].symbol.name);
                  printf ("\n");
                  addr += entry_size;
                }
              break;
            default:
              break;
            }
        }
    }
  if (dysymtab->nextrefsyms > 0)
    {
      bfd_mach_o_symtab_command *symtab = mdata->symtab;

      printf ("  external reference table: (symbol flags)\n");
      for (i = 0; i < dysymtab->nextrefsyms; i++)
        {
          bfd_mach_o_dylib_reference *ref = &dysymtab->ext_refs[i];

          printf ("   %4u: %5lu 0x%02lx", i, ref->isym, ref->flags);
          if (symtab && symtab->symbols
              && ref->isym < symtab->nsyms
              && symtab->symbols[ref->isym].symbol.name)
            printf (" %s", symtab->symbols[ref->isym].symbol.name);
          printf ("\n");
        }
    }

}

static bool
load_and_dump (bfd *abfd, ufile_ptr off, unsigned int len,
	       void (*dump)(bfd *abfd, unsigned char *buf, unsigned int len,
			    ufile_ptr off))
{
  unsigned char *buf;

  if (len == 0)
    return true;

  buf = xmalloc (len);

  if (bfd_seek (abfd, off, SEEK_SET) == 0
      && bfd_bread (buf, len, abfd) == len)
    dump (abfd, buf, len, off);
  else
    return false;

  free (buf);
  return true;
}

static const bfd_mach_o_xlat_name bfd_mach_o_dyld_rebase_type_name[] =
{
  { "pointer",      BFD_MACH_O_REBASE_TYPE_POINTER },
  { "text_abs32",   BFD_MACH_O_REBASE_TYPE_TEXT_ABSOLUTE32 },
  { "text_pcrel32", BFD_MACH_O_REBASE_TYPE_TEXT_PCREL32 },
  { NULL, 0 }
};

static void
dump_dyld_info_rebase (bfd *abfd, unsigned char *buf, unsigned int len,
		       ufile_ptr off ATTRIBUTE_UNUSED)
{
  unsigned int i;
  bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
  unsigned int ptrsize = mdata->header.version == 2 ? 8 : 4;

  for (i = 0; i < len; )
    {
      unsigned char b = buf[i++];
      unsigned char imm = b & BFD_MACH_O_REBASE_IMMEDIATE_MASK;
      bfd_vma leb;
      unsigned int leblen;

      printf ("   [0x%04x] 0x%02x: ", i, b);
      switch (b & BFD_MACH_O_REBASE_OPCODE_MASK)
	{
	case BFD_MACH_O_REBASE_OPCODE_DONE:
	  printf ("done\n");
	  return;
	case BFD_MACH_O_REBASE_OPCODE_SET_TYPE_IMM:
	  printf ("set_type %s\n",
		  bfd_mach_o_get_name (bfd_mach_o_dyld_rebase_type_name, imm));
	  break;
	case BFD_MACH_O_REBASE_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB:
	  leb = read_leb128 (buf + i, buf + len, 0, &leblen, NULL);
	  printf ("set segment: %u and offset: 0x%08x\n",
		  imm, (unsigned) leb);
	  i += leblen;
	  break;
	case BFD_MACH_O_REBASE_OPCODE_ADD_ADDR_ULEB:
	  leb = read_leb128 (buf + i, buf + len, 0, &leblen, NULL);
	  printf ("add addr uleb: 0x%08x\n", (unsigned) leb);
	  i += leblen;
	  break;
	case BFD_MACH_O_REBASE_OPCODE_ADD_ADDR_IMM_SCALED:
	  printf ("add addr imm scaled: %u\n", imm * ptrsize);
	  break;
	case BFD_MACH_O_REBASE_OPCODE_DO_REBASE_IMM_TIMES:
	  printf ("rebase imm times: %u\n", imm);
	  break;
	case BFD_MACH_O_REBASE_OPCODE_DO_REBASE_ULEB_TIMES:
	  leb = read_leb128 (buf + i, buf + len, 0, &leblen, NULL);
	  printf ("rebase uleb times: %u\n", (unsigned) leb);
	  i += leblen;
	  break;
	case BFD_MACH_O_REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB:
	  leb = read_leb128 (buf + i, buf + len, 0, &leblen, NULL);
	  printf ("rebase add addr uleb: %u\n", (unsigned) leb);
	  i += leblen;
	  break;
	case BFD_MACH_O_REBASE_OPCODE_DO_REBASE_ULEB_TIMES_SKIPPING_ULEB:
	  leb = read_leb128 (buf + i, buf + len, 0, &leblen, NULL);
	  printf ("rebase uleb times (%u)", (unsigned) leb);
	  i += leblen;
	  leb = read_leb128 (buf + i, buf + len, 0, &leblen, NULL);
	  printf (" skipping uleb (%u)\n", (unsigned) leb);
	  i += leblen;
	  break;
	default:
	  printf ("unknown\n");
	  return;
	}
    }
  printf ("   rebase commands without end!\n");
}

static void
dump_dyld_info_bind (bfd *abfd, unsigned char *buf, unsigned int len,
		     ufile_ptr off ATTRIBUTE_UNUSED)
{
  unsigned int i;
  bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
  unsigned int ptrsize = mdata->header.version == 2 ? 8 : 4;

  for (i = 0; i < len; )
    {
      unsigned char b = buf[i++];
      unsigned char imm = b & BFD_MACH_O_BIND_IMMEDIATE_MASK;
      bfd_vma leb;
      unsigned int leblen;

      printf ("   [0x%04x] 0x%02x: ", i, b);
      switch (b & BFD_MACH_O_BIND_OPCODE_MASK)
	{
	case BFD_MACH_O_BIND_OPCODE_DONE:
	  printf ("done\n");
	  return;
	case BFD_MACH_O_BIND_OPCODE_SET_DYLIB_ORDINAL_IMM:
	  printf ("set dylib ordinal imm: %u\n", imm);
	  break;
	case BFD_MACH_O_BIND_OPCODE_SET_DYLIB_ORDINAL_ULEB:
	  leb = read_leb128 (buf + i, buf + len, 0, &leblen, NULL);
	  printf ("set dylib ordinal uleb: %u\n", imm);
	  i += leblen;
	  break;
	case BFD_MACH_O_BIND_OPCODE_SET_DYLIB_SPECIAL_IMM:
	  imm = (imm != 0) ? imm | BFD_MACH_O_BIND_OPCODE_MASK : imm;
	  printf ("set dylib special imm: %d\n", imm);
	  break;
	case BFD_MACH_O_BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM:
	  printf ("set symbol trailing flags imm: 0x%02x, ", imm);
	  for (; i < len && buf[i] != 0; i++)
	    putchar (buf[i] >= ' ' && buf[i] < 0x7f ? buf[i] : '?');
	  putchar ('\n');
	  i++;
	  break;
	case BFD_MACH_O_BIND_OPCODE_SET_TYPE_IMM:
	  /* Kludge: use the same table as rebase type.  */
	  printf ("set_type %s\n",
		  bfd_mach_o_get_name (bfd_mach_o_dyld_rebase_type_name, imm));
	  break;
	case BFD_MACH_O_BIND_OPCODE_SET_ADDEND_SLEB:
	  {
	    bfd_signed_vma svma;
	    svma = read_leb128 (buf + i, buf + len, 0, &leblen, NULL);
	    printf ("set addend sleb: 0x%08x\n", (unsigned) svma);
	    i += leblen;
	  }
	  break;
	case BFD_MACH_O_BIND_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB:
	  leb = read_leb128 (buf + i, buf + len, 0, &leblen, NULL);
	  printf ("set segment: %u and offset: 0x%08x\n",
		  imm, (unsigned) leb);
	  i += leblen;
	  break;
	case BFD_MACH_O_BIND_OPCODE_ADD_ADDR_ULEB:
	  leb = read_leb128 (buf + i, buf + len, 0, &leblen, NULL);
	  printf ("add addr uleb: 0x%08x\n", (unsigned) leb);
	  i += leblen;
	  break;
	case BFD_MACH_O_BIND_OPCODE_DO_BIND:
	  printf ("do bind\n");
	  break;
	case BFD_MACH_O_BIND_OPCODE_DO_BIND_ADD_ADDR_ULEB:
	  leb = read_leb128 (buf + i, buf + len, 0, &leblen, NULL);
	  printf ("do bind add addr uleb: 0x%08x\n", (unsigned) leb);
	  i += leblen;
	  break;
	case BFD_MACH_O_BIND_OPCODE_DO_BIND_ADD_ADDR_IMM_SCALED:
	  printf ("do bind add addr imm scaled: %u\n", imm * ptrsize);
	  break;
	case BFD_MACH_O_BIND_OPCODE_DO_BIND_ULEB_TIMES_SKIPPING_ULEB:
	  leb = read_leb128 (buf + i, buf + len, 0, &leblen, NULL);
	  printf ("do bind uleb times (%u)", (unsigned) leb);
	  i += leblen;
	  leb = read_leb128 (buf + i, buf + len, 0, &leblen, NULL);
	  printf (" skipping uleb (%u)\n", (unsigned) leb);
	  i += leblen;
	  break;
	default:
	  printf ("unknown\n");
	  return;
	}
    }
  printf ("   bind commands without end!\n");
}

struct export_info_data
{
  const unsigned char *name;
  struct export_info_data *next;
};

static void
dump_dyld_info_export_1 (bfd *abfd, unsigned char *buf, unsigned int len,
			 unsigned int off, struct export_info_data *parent,
			 struct export_info_data *base)
{
  bfd_vma size;
  unsigned int leblen;
  unsigned int child_count;
  unsigned int i;

  size = read_leb128 (buf + off, buf + len, 0, &leblen, NULL);
  off += leblen;

  if (size != 0)
    {
      bfd_vma flags;
      struct export_info_data *d;

      flags = read_leb128 (buf + off, buf + len, 0, &leblen, NULL);
      off += leblen;

      fputs ("   ", stdout);
      switch (flags & BFD_MACH_O_EXPORT_SYMBOL_FLAGS_KIND_MASK)
	{
	case BFD_MACH_O_EXPORT_SYMBOL_FLAGS_KIND_REGULAR:
	  putchar ('-');
	  break;
	case BFD_MACH_O_EXPORT_SYMBOL_FLAGS_KIND_THREAD_LOCAL:
	  putchar ('T');
	  break;
	default:
	  putchar ('?');
	  break;
	}
      putchar ((flags & BFD_MACH_O_EXPORT_SYMBOL_FLAGS_WEAK_DEFINITION) ?
	       'W' : '-');

      if (flags & BFD_MACH_O_EXPORT_SYMBOL_FLAGS_REEXPORT)
	{
	  bfd_vma lib;

	  lib = read_leb128 (buf + off, buf + len, 0, &leblen, NULL);
	  off += leblen;

	  fputs (" [reexport] ", stdout);
	  for (d = base; d != NULL; d = d->next)
	    printf ("%s", d->name);

	  fputs (" (", stdout);
	  if (buf[off] != 0)
	    {
	      fputs ((const char *)buf + off, stdout);
	      putchar (' ');
	      off += strlen ((const char *)buf + off);
	    }
	  printf ("from dylib %u)\n", (unsigned) lib);
	  off++;
	}
      else
	{
	  bfd_vma offset;
	  bfd_vma resolv = 0;

	  offset = read_leb128 (buf + off, buf + len, 0, &leblen, NULL);
	  off += leblen;

	  if (flags & BFD_MACH_O_EXPORT_SYMBOL_FLAGS_STUB_AND_RESOLVER)
	    {
	      resolv = read_leb128 (buf + off, buf + len, 0, &leblen, NULL);
	      off += leblen;
	    }

	  printf (" 0x%08x ", (unsigned) offset);
	  for (d = base; d != NULL; d = d->next)
	    printf ("%s", d->name);
	  if (flags & BFD_MACH_O_EXPORT_SYMBOL_FLAGS_STUB_AND_RESOLVER)
	    printf (" [resolv: 0x%08x]", (unsigned) resolv);
	  printf ("\n");
	}
    }

  child_count = read_leb128 (buf + off, buf + len, 0, &leblen, NULL);
  off += leblen;

  for (i = 0; i < child_count; i++)
    {
      struct export_info_data sub_data;
      bfd_vma sub_off;

      sub_data.name = buf + off;
      sub_data.next = NULL;
      parent->next = &sub_data;

      off += strlen ((const char *)buf + off) + 1;

      sub_off = read_leb128 (buf + off, buf + len, 0, &leblen, NULL);
      off += leblen;

      dump_dyld_info_export_1 (abfd, buf, len, sub_off, &sub_data, base);
    }
}

static void
dump_dyld_info_export (bfd *abfd, unsigned char *buf, unsigned int len,
		       ufile_ptr off ATTRIBUTE_UNUSED)
{
  struct export_info_data data;

  data.name = (const unsigned char *) "";
  data.next = NULL;

  printf ("   fl offset     sym        (Flags: Tls Weak)\n");
  dump_dyld_info_export_1 (abfd, buf, len, 0, &data, &data);
}

static void
dump_dyld_info (bfd *abfd, bfd_mach_o_load_command *cmd,
		bool verbose)
{
  bfd_mach_o_dyld_info_command *dinfo = &cmd->command.dyld_info;

  printf ("       rebase: off: 0x%08x  size: %-8u   (endoff: 0x%08x)\n",
	  dinfo->rebase_off, dinfo->rebase_size,
	  dinfo->rebase_off + dinfo->rebase_size);
  printf ("         bind: off: 0x%08x  size: %-8u   (endoff: 0x%08x)\n",
	  dinfo->bind_off, dinfo->bind_size,
	  dinfo->bind_off + dinfo->bind_size);
  printf ("    weak bind: off: 0x%08x  size: %-8u   (endoff: 0x%08x)\n",
	  dinfo->weak_bind_off, dinfo->weak_bind_size,
	  dinfo->weak_bind_off + dinfo->weak_bind_size);
  printf ("    lazy bind: off: 0x%08x  size: %-8u   (endoff: 0x%08x)\n",
	  dinfo->lazy_bind_off, dinfo->lazy_bind_size,
	  dinfo->lazy_bind_off + dinfo->lazy_bind_size);
  printf ("       export: off: 0x%08x  size: %-8u   (endoff: 0x%08x)\n",
	  dinfo->export_off, dinfo->export_size,
	  dinfo->export_off + dinfo->export_size);

  if (!verbose)
    return;

  printf ("   rebase:\n");
  if (!load_and_dump (abfd, dinfo->rebase_off, dinfo->rebase_size,
		      dump_dyld_info_rebase))
    non_fatal (_("cannot read rebase dyld info"));

  printf ("   bind:\n");
  if (!load_and_dump (abfd, dinfo->bind_off, dinfo->bind_size,
		      dump_dyld_info_bind))
    non_fatal (_("cannot read bind dyld info"));

  printf ("   weak bind:\n");
  if (!load_and_dump (abfd, dinfo->weak_bind_off, dinfo->weak_bind_size,
		      dump_dyld_info_bind))
    non_fatal (_("cannot read weak bind dyld info"));

  printf ("   lazy bind:\n");
  if (!load_and_dump (abfd, dinfo->lazy_bind_off, dinfo->lazy_bind_size,
		      dump_dyld_info_bind))
    non_fatal (_("cannot read lazy bind dyld info"));

  printf ("   exported symbols:\n");
  if (!load_and_dump (abfd, dinfo->export_off, dinfo->export_size,
		      dump_dyld_info_export))
    non_fatal (_("cannot read export symbols dyld info"));
}

static void
dump_thread (bfd *abfd, bfd_mach_o_load_command *cmd)
{
  bfd_mach_o_thread_command *thread = &cmd->command.thread;
  unsigned int j;
  bfd_mach_o_backend_data *bed = bfd_mach_o_get_backend_data (abfd);
  bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);

  printf (" nflavours: %lu\n", thread->nflavours);
  for (j = 0; j < thread->nflavours; j++)
    {
      bfd_mach_o_thread_flavour *flavour = &thread->flavours[j];
      const bfd_mach_o_xlat_name *name_table;

      printf ("  %2u: flavour: 0x%08lx", j, flavour->flavour);
      switch (mdata->header.cputype)
        {
        case BFD_MACH_O_CPU_TYPE_I386:
        case BFD_MACH_O_CPU_TYPE_X86_64:
          name_table = bfd_mach_o_thread_x86_name;
          break;
        default:
          name_table = NULL;
          break;
        }
      if (name_table != NULL)
        printf (": %s", bfd_mach_o_get_name (name_table, flavour->flavour));
      putchar ('\n');

      printf ("       offset: 0x%08lx  size: 0x%08lx\n",
              flavour->offset, flavour->size);
      if (bed->_bfd_mach_o_print_thread)
        {
          char *buf = xmalloc (flavour->size);

          if (bfd_seek (abfd, flavour->offset, SEEK_SET) == 0
              && bfd_bread (buf, flavour->size, abfd) == flavour->size)
            (*bed->_bfd_mach_o_print_thread)(abfd, flavour, stdout, buf);

          free (buf);
        }
    }
}

static const bfd_mach_o_xlat_name bfd_mach_o_cs_magic[] =
{
  { "embedded signature", BFD_MACH_O_CS_MAGIC_EMBEDDED_SIGNATURE },
  { "requirement", BFD_MACH_O_CS_MAGIC_REQUIREMENT },
  { "requirements", BFD_MACH_O_CS_MAGIC_REQUIREMENTS },
  { "code directory", BFD_MACH_O_CS_MAGIC_CODEDIRECTORY },
  { "embedded entitlements", BFD_MACH_O_CS_MAGIC_EMBEDDED_ENTITLEMENTS },
  { "blob wrapper", BFD_MACH_O_CS_MAGIC_BLOB_WRAPPER },
  { NULL, 0 }
};

static const bfd_mach_o_xlat_name bfd_mach_o_cs_hash_type[] =
{
  { "no-hash", BFD_MACH_O_CS_NO_HASH },
  { "sha1", BFD_MACH_O_CS_HASH_SHA1 },
  { "sha256", BFD_MACH_O_CS_HASH_SHA256 },
  { "skein 160", BFD_MACH_O_CS_HASH_PRESTANDARD_SKEIN_160x256 },
  { "skein 256", BFD_MACH_O_CS_HASH_PRESTANDARD_SKEIN_256x512 },
  { NULL, 0 }
};

static unsigned int
dump_code_signature_blob (bfd *abfd, const unsigned char *buf, unsigned int len);

static void
dump_code_signature_superblob (bfd *abfd ATTRIBUTE_UNUSED,
                               const unsigned char *buf, unsigned int len)
{
  unsigned int count;
  unsigned int i;

  if (len < 12)
    {
      printf (_("  [bad block length]\n"));
      return;
    }
  count = bfd_getb32 (buf + 8);
  printf (ngettext ("  %u index entry:\n",
		    "  %u index entries:\n",
		    count),
	  count);
  if (len < 12 + 8 * count)
    {
      printf (_("  [bad block length]\n"));
      return;
    }
  for (i = 0; i < count; i++)
    {
      unsigned int type;
      unsigned int off;

      type = bfd_getb32 (buf + 12 + 8 * i);
      off = bfd_getb32 (buf + 12 + 8 * i + 4);
      printf (_("  index entry %u: type: %08x, offset: %08x\n"),
              i, type, off);

      dump_code_signature_blob (abfd, buf + off, len - off);
    }
}

static void
swap_code_codedirectory_v1_in
  (const struct mach_o_codesign_codedirectory_external_v1 *src,
   struct mach_o_codesign_codedirectory_v1 *dst)
{
  dst->version = bfd_getb32 (src->version);
  dst->flags = bfd_getb32 (src->flags);
  dst->hash_offset = bfd_getb32 (src->hash_offset);
  dst->ident_offset = bfd_getb32 (src->ident_offset);
  dst->nbr_special_slots = bfd_getb32 (src->nbr_special_slots);
  dst->nbr_code_slots = bfd_getb32 (src->nbr_code_slots);
  dst->code_limit = bfd_getb32 (src->code_limit);
  dst->hash_size = src->hash_size[0];
  dst->hash_type = src->hash_type[0];
  dst->spare1 = src->spare1[0];
  dst->page_size = src->page_size[0];
  dst->spare2 = bfd_getb32 (src->spare2);
}

static void
hexdump (unsigned int start, unsigned int len,
         const unsigned char *buf)
{
  unsigned int i, j;

  for (i = 0; i < len; i += 16)
    {
      printf ("%08x:", start + i);
      for (j = 0; j < 16; j++)
        {
          fputc (j == 8 ? '-' : ' ', stdout);
          if (i + j < len)
            printf ("%02x", buf[i + j]);
          else
            fputs ("  ", stdout);
        }
      fputc (' ', stdout);
      for (j = 0; j < 16; j++)
        {
          if (i + j < len)
            fputc (ISPRINT (buf[i + j]) ? buf[i + j] : '.', stdout);
          else
            fputc (' ', stdout);
        }
      fputc ('\n', stdout);
    }
}

static void
dump_code_signature_codedirectory (bfd *abfd ATTRIBUTE_UNUSED,
                                   const unsigned char *buf, unsigned int len)
{
  struct mach_o_codesign_codedirectory_v1 cd;
  const char *id;

  if (len < sizeof (struct mach_o_codesign_codedirectory_external_v1))
    {
      printf (_("  [bad block length]\n"));
      return;
    }

  swap_code_codedirectory_v1_in
    ((const struct mach_o_codesign_codedirectory_external_v1 *) (buf + 8), &cd);

  printf (_("  version:           %08x\n"), cd.version);
  printf (_("  flags:             %08x\n"), cd.flags);
  printf (_("  hash offset:       %08x\n"), cd.hash_offset);
  id = (const char *) buf + cd.ident_offset;
  printf (_("  ident offset:      %08x (- %08x)\n"),
          cd.ident_offset, cd.ident_offset + (unsigned) strlen (id) + 1);
  printf (_("   identity: %s\n"), id);
  printf (_("  nbr special slots: %08x (at offset %08x)\n"),
          cd.nbr_special_slots,
          cd.hash_offset - cd.nbr_special_slots * cd.hash_size);
  printf (_("  nbr code slots:    %08x\n"), cd.nbr_code_slots);
  printf (_("  code limit:        %08x\n"), cd.code_limit);
  printf (_("  hash size:         %02x\n"), cd.hash_size);
  printf (_("  hash type:         %02x (%s)\n"),
          cd.hash_type,
          bfd_mach_o_get_name (bfd_mach_o_cs_hash_type, cd.hash_type));
  printf (_("  spare1:            %02x\n"), cd.spare1);
  printf (_("  page size:         %02x\n"), cd.page_size);
  printf (_("  spare2:            %08x\n"), cd.spare2);
  if (cd.version >= 0x20100)
    printf (_("  scatter offset:    %08x\n"),
            (unsigned) bfd_getb32 (buf + 44));
}

static unsigned int
dump_code_signature_blob (bfd *abfd, const unsigned char *buf, unsigned int len)
{
  unsigned int magic;
  unsigned int length;

  if (len < 8)
    {
      printf (_("  [truncated block]\n"));
      return 0;
    }
  magic = bfd_getb32 (buf);
  length = bfd_getb32 (buf + 4);
  if (magic == 0 || length == 0)
    return 0;

  printf (_(" magic : %08x (%s)\n"), magic,
          bfd_mach_o_get_name (bfd_mach_o_cs_magic, magic));
  printf (_(" length: %08x\n"), length);
  if (length > len)
    {
      printf (_("  [bad block length]\n"));
      return 0;
    }

  switch (magic)
    {
    case BFD_MACH_O_CS_MAGIC_EMBEDDED_SIGNATURE:
      dump_code_signature_superblob (abfd, buf, length);
      break;
    case BFD_MACH_O_CS_MAGIC_CODEDIRECTORY:
      dump_code_signature_codedirectory (abfd, buf, length);
      break;
    default:
      hexdump (0, length - 8, buf + 8);
      break;
    }
  return length;
}

static void
dump_code_signature (bfd *abfd, bfd_mach_o_linkedit_command *cmd)
{
  unsigned char *buf = xmalloc (cmd->datasize);
  unsigned int off;

  if (bfd_seek (abfd, cmd->dataoff, SEEK_SET) != 0
      || bfd_bread (buf, cmd->datasize, abfd) != cmd->datasize)
    {
      non_fatal (_("cannot read code signature data"));
      free (buf);
      return;
    }
  for (off = 0; off < cmd->datasize;)
    {
      unsigned int len;

      len = dump_code_signature_blob (abfd, buf + off, cmd->datasize - off);

      if (len == 0)
        break;
      off += len;
    }
  free (buf);
}

static void
dump_segment_split_info (bfd *abfd, bfd_mach_o_linkedit_command *cmd)
{
  unsigned char *buf = xmalloc (cmd->datasize);
  unsigned char *p;
  unsigned int len;
  bfd_vma addr = 0;

  if (bfd_seek (abfd, cmd->dataoff, SEEK_SET) != 0
      || bfd_bread (buf, cmd->datasize, abfd) != cmd->datasize)
    {
      non_fatal (_("cannot read segment split info"));
      free (buf);
      return;
    }
  if (buf[cmd->datasize - 1] != 0)
    {
      non_fatal (_("segment split info is not nul terminated"));
      free (buf);
      return;
    }

  switch (buf[0])
    {
    case 0:
      printf (_("  32 bit pointers:\n"));
      break;
    case 1:
      printf (_("  64 bit pointers:\n"));
      break;
    case 2:
      printf (_("  PPC hi-16:\n"));
      break;
    default:
      printf (_("  Unhandled location type %u\n"), buf[0]);
      break;
    }
  for (p = buf + 1; *p != 0; p += len)
    {
      addr += read_leb128 (p, buf + cmd->datasize, 0, &len, NULL);
      fputs ("    ", stdout);
      bfd_printf_vma (abfd, addr);
      putchar ('\n');
    }
  free (buf);
}

static void
dump_function_starts (bfd *abfd, bfd_mach_o_linkedit_command *cmd)
{
  unsigned char *buf = xmalloc (cmd->datasize);
  unsigned char *end_buf = buf + cmd->datasize;
  unsigned char *p;
  bfd_vma addr;

  if (bfd_seek (abfd, cmd->dataoff, SEEK_SET) != 0
      || bfd_bread (buf, cmd->datasize, abfd) != cmd->datasize)
    {
      non_fatal (_("cannot read function starts"));
      free (buf);
      return;
    }

  /* Function starts are delta encoded, starting from the base address.  */
  addr = bfd_mach_o_get_base_address (abfd);

  for (p = buf; ;)
    {
      bfd_vma delta = 0;
      unsigned int shift = 0;

      if (*p == 0 || p == end_buf)
	break;
      while (1)
	{
	  unsigned char b = *p++;

	  delta |= (b & 0x7f) << shift;
	  if ((b & 0x80) == 0)
	    break;
	  if (p == end_buf)
	    {
	      fputs ("   [truncated]\n", stdout);
	      break;
	    }
	  shift += 7;
	}

      addr += delta;
      fputs ("    ", stdout);
      bfd_printf_vma (abfd, addr);
      putchar ('\n');
    }
  free (buf);
}

static const bfd_mach_o_xlat_name data_in_code_kind_name[] =
{
  { "data", BFD_MACH_O_DICE_KIND_DATA },
  { "1 byte jump table", BFD_MACH_O_DICE_JUMP_TABLES8 },
  { "2 bytes jump table", BFD_MACH_O_DICE_JUMP_TABLES16 },
  { "4 bytes jump table", BFD_MACH_O_DICE_JUMP_TABLES32 },
  { "4 bytes abs jump table", BFD_MACH_O_DICE_ABS_JUMP_TABLES32 },
  { NULL, 0 }
};

static void
dump_data_in_code (bfd *abfd, bfd_mach_o_linkedit_command *cmd)
{
  unsigned char *buf;
  unsigned char *p;

  if (cmd->datasize == 0)
    {
      printf ("   no data_in_code entries\n");
      return;
    }

  buf = xmalloc (cmd->datasize);
  if (bfd_seek (abfd, cmd->dataoff, SEEK_SET) != 0
      || bfd_bread (buf, cmd->datasize, abfd) != cmd->datasize)
    {
      non_fatal (_("cannot read data_in_code"));
      free (buf);
      return;
    }

  printf ("   offset     length kind\n");
  for (p = buf; p < buf + cmd->datasize; )
    {
      struct mach_o_data_in_code_entry_external *dice;
      unsigned int offset;
      unsigned int length;
      unsigned int kind;

      dice = (struct mach_o_data_in_code_entry_external *) p;

      offset = bfd_get_32 (abfd, dice->offset);
      length = bfd_get_16 (abfd, dice->length);
      kind = bfd_get_16 (abfd, dice->kind);

      printf ("   0x%08x 0x%04x 0x%04x %s\n", offset, length, kind,
	      bfd_mach_o_get_name (data_in_code_kind_name, kind));

      p += sizeof (*dice);
    }
  free (buf);
}

static void
dump_twolevel_hints (bfd *abfd, bfd_mach_o_twolevel_hints_command *cmd)
{
  size_t sz = 4 * cmd->nhints;
  unsigned char *buf;
  unsigned char *p;

  buf = xmalloc (sz);
  if (bfd_seek (abfd, cmd->offset, SEEK_SET) != 0
      || bfd_bread (buf, sz, abfd) != sz)
    {
      non_fatal (_("cannot read twolevel hints"));
      free (buf);
      return;
    }

  for (p = buf; p < buf + sz; p += 4)
    {
      unsigned int v;
      unsigned int isub_image;
      unsigned int itoc;

      v = bfd_get_32 (abfd, p);
      if (bfd_big_endian (abfd))
	{
	  isub_image = (v >> 24) & 0xff;
	  itoc = v & 0xffffff;
	}
      else
	{
	  isub_image = v & 0xff;
	  itoc = (v >> 8) & 0xffffff;
	}

      printf ("  %3u %8u\n", isub_image, itoc);
    }
  free (buf);
}

static void
printf_version (uint32_t version)
{
  uint32_t maj, min, upd;

  maj = (version >> 16) & 0xffff;
  min = (version >> 8) & 0xff;
  upd = version & 0xff;

  printf ("%u.%u.%u", maj, min, upd);
}

static void
dump_build_version (bfd *abfd, bfd_mach_o_load_command *cmd)
{
  const char *platform_name;
  size_t tools_len, tools_offset;
  bfd_mach_o_build_version_tool *tools, *tool;
  bfd_mach_o_build_version_command *ver = &cmd->command.build_version;
  uint32_t i;

  platform_name = bfd_mach_o_get_name_or_null
    (bfd_mach_o_platform_name, ver->platform);
  if (platform_name == NULL)
    printf ("   platform: 0x%08x\n", ver->platform);
  else
    printf ("   platform: %s\n", platform_name);
  printf ("   os:       ");
  printf_version (ver->minos);
  printf ("\n   sdk:      ");
  printf_version (ver->sdk);
  printf ("\n   ntools:   %u\n", ver->ntools);

  tools_len = sizeof (bfd_mach_o_build_version_tool) * ver->ntools;
  tools_offset = cmd->offset + cmd->len - tools_len;

  tools = xmalloc (tools_len);
  if (bfd_seek (abfd, tools_offset, SEEK_SET) != 0
      || bfd_bread (tools, tools_len, abfd) != tools_len)
    {
      non_fatal (_("cannot read build tools"));
      free (tools);
      return;
    }

  for (i = 0, tool = tools; i < ver->ntools; i++, tool++)
    {
      const char * tool_name;

      tool_name = bfd_mach_o_get_name_or_null
	(bfd_mach_o_tool_name, tool->tool);
      if (tool_name == NULL)
	printf ("   tool:     0x%08x\n", tool->tool);
      else
	printf ("   tool:     %s\n", tool_name);
      printf ("   version:  ");
      printf_version (tool->version);
      printf ("\n");
    }
  free (tools);
}

static void
dump_load_command (bfd *abfd, bfd_mach_o_load_command *cmd,
                   unsigned int idx, bool verbose)
{
  bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
  const char *cmd_name;

  cmd_name = bfd_mach_o_get_name_or_null
    (bfd_mach_o_load_command_name, cmd->type);
  printf ("Load command #%-2u (size: %3u, offset: %4u): ",
	  idx, cmd->len, cmd->offset);
  if (cmd_name == NULL)
    printf ("0x%02x\n", cmd->type);
  else
    printf ("%s\n", cmd_name);

  switch (cmd->type)
    {
    case BFD_MACH_O_LC_SEGMENT:
    case BFD_MACH_O_LC_SEGMENT_64:
      dump_segment (abfd, cmd);
      break;
    case BFD_MACH_O_LC_UUID:
      {
        bfd_mach_o_uuid_command *uuid = &cmd->command.uuid;
        unsigned int j;

	printf ("   ");
        for (j = 0; j < sizeof (uuid->uuid); j ++)
          printf (" %02x", uuid->uuid[j]);
        putchar ('\n');
      }
      break;
    case BFD_MACH_O_LC_LOAD_DYLIB:
    case BFD_MACH_O_LC_LAZY_LOAD_DYLIB:
    case BFD_MACH_O_LC_LOAD_WEAK_DYLIB:
    case BFD_MACH_O_LC_REEXPORT_DYLIB:
    case BFD_MACH_O_LC_ID_DYLIB:
    case BFD_MACH_O_LC_LOAD_UPWARD_DYLIB:
      {
        bfd_mach_o_dylib_command *dylib = &cmd->command.dylib;
        printf ("  name: %s\n", dylib->name_str);
        printf ("            time stamp: 0x%08lx\n",
                dylib->timestamp);
        printf ("       current version: 0x%08lx\n",
                dylib->current_version);
        printf ("  comptibility version: 0x%08lx\n",
                dylib->compatibility_version);
      }
      break;
    case BFD_MACH_O_LC_LOAD_DYLINKER:
    case BFD_MACH_O_LC_ID_DYLINKER:
      printf ("    %s\n", cmd->command.dylinker.name_str);
      break;
    case BFD_MACH_O_LC_DYLD_ENVIRONMENT:
      printf ("    %s\n", cmd->command.dylinker.name_str);
      break;
    case BFD_MACH_O_LC_SYMTAB:
      {
        bfd_mach_o_symtab_command *symtab = &cmd->command.symtab;
        printf ("   symoff: 0x%08x    nsyms: %8u  (endoff: 0x%08x)\n",
                symtab->symoff, symtab->nsyms,
                symtab->symoff + symtab->nsyms
                * (mdata->header.version == 2
                   ? BFD_MACH_O_NLIST_64_SIZE : BFD_MACH_O_NLIST_SIZE));
        printf ("   stroff: 0x%08x  strsize: %8u  (endoff: 0x%08x)\n",
                symtab->stroff, symtab->strsize,
                symtab->stroff + symtab->strsize);
        break;
      }
    case BFD_MACH_O_LC_DYSYMTAB:
      dump_dysymtab (abfd, cmd, verbose);
      break;
    case BFD_MACH_O_LC_LOADFVMLIB:
    case BFD_MACH_O_LC_IDFVMLIB:
      {
        bfd_mach_o_fvmlib_command *fvmlib = &cmd->command.fvmlib;
        printf ("                fvmlib: %s\n", fvmlib->name_str);
        printf ("         minor version: 0x%08x\n", fvmlib->minor_version);
        printf ("        header address: 0x%08x\n", fvmlib->header_addr);
      }
      break;
    case BFD_MACH_O_LC_CODE_SIGNATURE:
    case BFD_MACH_O_LC_SEGMENT_SPLIT_INFO:
    case BFD_MACH_O_LC_FUNCTION_STARTS:
    case BFD_MACH_O_LC_DATA_IN_CODE:
    case BFD_MACH_O_LC_DYLIB_CODE_SIGN_DRS:
    case BFD_MACH_O_LC_DYLD_EXPORTS_TRIE:
    case BFD_MACH_O_LC_DYLD_CHAINED_FIXUPS:
      {
        bfd_mach_o_linkedit_command *linkedit = &cmd->command.linkedit;
        printf
          ("  dataoff: 0x%08lx  datasize: 0x%08lx  (endoff: 0x%08lx)\n",
           linkedit->dataoff, linkedit->datasize,
           linkedit->dataoff + linkedit->datasize);

	if (verbose)
	  switch (cmd->type)
	    {
	    case BFD_MACH_O_LC_CODE_SIGNATURE:
	      dump_code_signature (abfd, linkedit);
	      break;
	    case BFD_MACH_O_LC_SEGMENT_SPLIT_INFO:
	      dump_segment_split_info (abfd, linkedit);
	      break;
	    case BFD_MACH_O_LC_FUNCTION_STARTS:
	      dump_function_starts (abfd, linkedit);
	      break;
	    case BFD_MACH_O_LC_DATA_IN_CODE:
	      dump_data_in_code (abfd, linkedit);
	      break;
	    default:
	      break;
	    }
      }
      break;
    case BFD_MACH_O_LC_SUB_FRAMEWORK:
    case BFD_MACH_O_LC_SUB_UMBRELLA:
    case BFD_MACH_O_LC_SUB_LIBRARY:
    case BFD_MACH_O_LC_SUB_CLIENT:
    case BFD_MACH_O_LC_RPATH:
      {
        bfd_mach_o_str_command *strc = &cmd->command.str;
        printf ("    %s\n", strc->str);
        break;
      }
    case BFD_MACH_O_LC_THREAD:
    case BFD_MACH_O_LC_UNIXTHREAD:
      dump_thread (abfd, cmd);
      break;
    case BFD_MACH_O_LC_ENCRYPTION_INFO:
      {
        bfd_mach_o_encryption_info_command *cryp =
          &cmd->command.encryption_info;
        printf ("  cryptoff: 0x%08x  cryptsize: 0x%08x (endoff 0x%08x)"
		" cryptid: %u\n",
		cryp->cryptoff, cryp->cryptsize,
		cryp->cryptoff + cryp->cryptsize,
		cryp->cryptid);
      }
      break;
    case BFD_MACH_O_LC_DYLD_INFO:
      dump_dyld_info (abfd, cmd, verbose);
      break;
    case BFD_MACH_O_LC_VERSION_MIN_MACOSX:
    case BFD_MACH_O_LC_VERSION_MIN_IPHONEOS:
    case BFD_MACH_O_LC_VERSION_MIN_WATCHOS:
    case BFD_MACH_O_LC_VERSION_MIN_TVOS:
      {
        bfd_mach_o_version_min_command *ver = &cmd->command.version_min;

        printf ("   os: ");
        printf_version (ver->version);
        printf ("\n   sdk: ");
        printf_version (ver->sdk);
        printf ("\n");
      }
      break;
    case BFD_MACH_O_LC_SOURCE_VERSION:
      {
        bfd_mach_o_source_version_command *version =
	  &cmd->command.source_version;
        printf ("   version a.b.c.d.e: %u.%u.%u.%u.%u\n",
		version->a, version->b, version->c, version->d, version->e);
        break;
      }
    case BFD_MACH_O_LC_PREBOUND_DYLIB:
      {
        bfd_mach_o_prebound_dylib_command *pbdy = &cmd->command.prebound_dylib;
	unsigned char *lm = pbdy->linked_modules;
	unsigned int j;
	unsigned int last;

        printf ("      dylib: %s\n", pbdy->name_str);
        printf ("   nmodules: %u\n", pbdy->nmodules);
	printf ("   linked modules (at %u): ",
		pbdy->linked_modules_offset - cmd->offset);
	last = pbdy->nmodules > 32 ? 32 : pbdy->nmodules;
	for (j = 0; j < last; j++)
	  printf ("%u", (lm[j >> 3] >> (j & 7)) & 1);
	if (last < pbdy->nmodules)
	  printf ("...");
	putchar ('\n');
        break;
      }
    case BFD_MACH_O_LC_PREBIND_CKSUM:
      {
        bfd_mach_o_prebind_cksum_command *cksum = &cmd->command.prebind_cksum;
        printf ("   0x%08x\n", cksum->cksum);
        break;
      }
    case BFD_MACH_O_LC_TWOLEVEL_HINTS:
      {
        bfd_mach_o_twolevel_hints_command *hints =
	  &cmd->command.twolevel_hints;

        printf ("   table offset: 0x%08x  nbr hints: %u\n",
		hints->offset, hints->nhints);
	if (verbose)
	  dump_twolevel_hints (abfd, hints);
        break;
      }
    case BFD_MACH_O_LC_MAIN:
      {
	bfd_mach_o_main_command *entry = &cmd->command.main;
	printf ("   entry offset: %#016" PRIx64 "\n"
		"   stack size:   %#016" PRIx64 "\n",
		entry->entryoff, entry->stacksize);
	break;
      }
    case BFD_MACH_O_LC_NOTE:
      {
	bfd_mach_o_note_command *note = &cmd->command.note;
	printf ("   data owner: %.16s\n"
		"   offset:     %#016" PRIx64 "\n"
		"   size:       %#016" PRIx64 "\n",
		note->data_owner, note->offset, note->size);
	break;
      }
    case BFD_MACH_O_LC_BUILD_VERSION:
      dump_build_version (abfd, cmd);
      break;
    default:
      break;
    }
  putchar ('\n');
}

static void
dump_load_commands (bfd *abfd, unsigned int cmd32, unsigned int cmd64)
{
  bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
  bfd_mach_o_load_command *cmd;
  unsigned int i;

  for (cmd = mdata->first_command, i = 0; cmd != NULL; cmd = cmd->next, i++)
    {
      if (cmd32 == 0)
        dump_load_command (abfd, cmd, i, false);
      else if (cmd->type == cmd32 || cmd->type == cmd64)
        dump_load_command (abfd, cmd, i, true);
    }
}

static const char * const unwind_x86_64_regs[] =
  {"", "rbx", "r12", "r13", "r14", "r15", "rbp", "???" };

static const char * const unwind_x86_regs[] =
  {"", "ebx", "ecx", "edx", "edi", "edi", "ebp", "???" };

/* Dump x86 or x86-64 compact unwind encoding.  Works for both architecture,
   as the encoding is the same (but not register names).  */

static void
dump_unwind_encoding_x86 (unsigned int encoding, unsigned int sz,
			  const char * const regs_name[])
{
  unsigned int mode;

  mode = encoding & MACH_O_UNWIND_X86_64_MODE_MASK;
  switch (mode)
    {
    case MACH_O_UNWIND_X86_64_MODE_RBP_FRAME:
      {
	unsigned int regs;
	char pfx = sz == 8 ? 'R' : 'E';

	regs = encoding & MACH_O_UNWIND_X86_64_RBP_FRAME_REGISTERS;
	printf (" %cSP frame", pfx);
	if (regs != 0)
	  {
	    unsigned int offset;
	    int i;

	    offset = (encoding & MACH_O_UNWIND_X86_64_RBP_FRAME_OFFSET) >> 16;
	    printf (" at %cBP-%u:", pfx, offset * sz);
	    for (i = 0; i < 5; i++)
	      {
		unsigned int reg = (regs >> (i * 3)) & 0x7;
		if (reg != MACH_O_UNWIND_X86_64_REG_NONE)
		  printf (" %s", regs_name[reg]);
	      }
	  }
      }
      break;
    case MACH_O_UNWIND_X86_64_MODE_STACK_IMMD:
    case MACH_O_UNWIND_X86_64_MODE_STACK_IND:
      {
	unsigned int stack_size;
	unsigned int reg_count;
	unsigned int reg_perm;
	unsigned int regs[6];
	int i, j;

	printf (" frameless");
	stack_size =
	  (encoding & MACH_O_UNWIND_X86_64_FRAMELESS_STACK_SIZE) >> 16;
	reg_count =
	  (encoding & MACH_O_UNWIND_X86_64_FRAMELESS_REG_COUNT) >> 10;
	reg_perm = encoding & MACH_O_UNWIND_X86_64_FRAMELESS_REG_PERMUTATION;

	if (mode == MACH_O_UNWIND_X86_64_MODE_STACK_IMMD)
	  printf (" size: 0x%03x", stack_size * sz);
	else
	  {
	    unsigned int stack_adj;

	    stack_adj =
	      (encoding & MACH_O_UNWIND_X86_64_FRAMELESS_STACK_ADJUST) >> 13;
	    printf (" size at 0x%03x + 0x%02x", stack_size, stack_adj * sz);
	  }
	/* Registers are coded using arithmetic compression: the register
	   is indexed in range 0-6, the second in range 0-5, the third in
	   range 0-4, etc.  Already used registers are removed in next
	   ranges.  */
#define DO_PERM(R, NUM) R = reg_perm / NUM; reg_perm -= R * NUM
	switch (reg_count)
	  {
	  case 6:
	  case 5:
	    DO_PERM (regs[0], 120);
	    DO_PERM (regs[1], 24);
	    DO_PERM (regs[2], 6);
	    DO_PERM (regs[3], 2);
	    DO_PERM (regs[4], 1);
	    regs[5] = 0; /* Not used if reg_count = 5.  */
	    break;
	  case 4:
	    DO_PERM (regs[0], 60);
	    DO_PERM (regs[1], 12);
	    DO_PERM (regs[2], 3);
	    DO_PERM (regs[3], 1);
	    break;
	  case 3:
	    DO_PERM (regs[0], 20);
	    DO_PERM (regs[1], 4);
	    DO_PERM (regs[2], 1);
	    break;
	  case 2:
	    DO_PERM (regs[0], 5);
	    DO_PERM (regs[1], 1);
	    break;
	  case 1:
	    DO_PERM (regs[0], 1);
	    break;
	  case 0:
	    break;
	  default:
	    printf (" [bad reg count]");
	    return;
	  }
#undef DO_PERM
	/* Renumber.  */
	for (i = reg_count - 1; i >= 0; i--)
	  {
	    unsigned int inc = 1;
	    for (j = 0; j < i; j++)
	      if (regs[i] >= regs[j])
		inc++;
	    regs[i] += inc;
	  }
	/* Display.  */
	for (i = 0; i < (int) reg_count; i++)
	  printf (" %s", regs_name[regs[i]]);
      }
      break;
    case MACH_O_UNWIND_X86_64_MODE_DWARF:
      printf (" Dwarf offset: 0x%06x",
	      encoding & MACH_O_UNWIND_X86_64_DWARF_SECTION_OFFSET);
      break;
    default:
      printf (" [unhandled mode]");
      break;
    }
}

/* Dump arm64 compact unwind entries.  */

static void
dump_unwind_encoding_arm64 (unsigned int encoding)
{
  switch (encoding & MACH_O_UNWIND_ARM64_MODE_MASK)
    {
    case MACH_O_UNWIND_ARM64_MODE_FRAMELESS:
      printf (" frameless");
      break;
    case MACH_O_UNWIND_ARM64_MODE_DWARF:
      printf (" Dwarf offset: 0x%06x",
	      encoding & MACH_O_UNWIND_ARM64_DWARF_SECTION_OFFSET);
      return;
    case MACH_O_UNWIND_ARM64_MODE_FRAME:
      printf (" frame");
      break;
    default:
      printf (" [unhandled mode]");
      return;
    }
  switch (encoding & MACH_O_UNWIND_ARM64_MODE_MASK)
    {
    case MACH_O_UNWIND_ARM64_MODE_FRAMELESS:
    case MACH_O_UNWIND_ARM64_MODE_FRAME:
      if (encoding & MACH_O_UNWIND_ARM64_FRAME_X19_X20_PAIR)
	printf (" x19-x20");
      if (encoding & MACH_O_UNWIND_ARM64_FRAME_X21_X22_PAIR)
	printf (" x21-x22");
      if (encoding & MACH_O_UNWIND_ARM64_FRAME_X23_X24_PAIR)
	printf (" x23-x24");
      if (encoding & MACH_O_UNWIND_ARM64_FRAME_X25_X26_PAIR)
	printf (" x25-x26");
      if (encoding & MACH_O_UNWIND_ARM64_FRAME_X27_X28_PAIR)
	printf (" x27-x28");
      break;
    }
  switch (encoding & MACH_O_UNWIND_ARM64_MODE_MASK)
    {
    case MACH_O_UNWIND_ARM64_MODE_FRAME:
      if (encoding & MACH_O_UNWIND_ARM64_FRAME_D8_D9_PAIR)
	printf (" d8-d9");
      if (encoding & MACH_O_UNWIND_ARM64_FRAME_D10_D11_PAIR)
	printf (" d10-d11");
      if (encoding & MACH_O_UNWIND_ARM64_FRAME_D12_D13_PAIR)
	printf (" d12-d13");
      if (encoding & MACH_O_UNWIND_ARM64_FRAME_D14_D15_PAIR)
	printf (" d14-d15");
      break;
    case MACH_O_UNWIND_ARM64_MODE_FRAMELESS:
      printf (" size: %u",
	      (encoding & MACH_O_UNWIND_ARM64_FRAMELESS_STACK_SIZE_MASK) >> 8);
      break;
    }
}

static void
dump_unwind_encoding (bfd_mach_o_data_struct *mdata, unsigned int encoding)
{
  printf ("0x%08x", encoding);
  if (encoding == 0)
    return;

  switch (mdata->header.cputype)
    {
    case BFD_MACH_O_CPU_TYPE_X86_64:
      dump_unwind_encoding_x86 (encoding, 8, unwind_x86_64_regs);
      break;
    case BFD_MACH_O_CPU_TYPE_I386:
      dump_unwind_encoding_x86 (encoding, 4, unwind_x86_regs);
      break;
    case BFD_MACH_O_CPU_TYPE_ARM64:
      dump_unwind_encoding_arm64 (encoding);
      break;
    default:
      printf (" [unhandled cpu]");
      break;
    }
  if (encoding & MACH_O_UNWIND_HAS_LSDA)
    printf (" LSDA");
  if (encoding & MACH_O_UNWIND_PERSONALITY_MASK)
    printf (" PERS(%u)",
	    ((encoding & MACH_O_UNWIND_PERSONALITY_MASK)
	     >> MACH_O_UNWIND_PERSONALITY_SHIFT));
}

static void
dump_obj_compact_unwind (bfd *abfd,
			 const unsigned char *content, bfd_size_type size)
{
  bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
  int is_64 = mdata->header.version == 2;
  const unsigned char *p;

  printf ("Compact unwind info:\n");
  printf (" start            length   personality      lsda\n");

  if (is_64)
    {
      struct mach_o_compact_unwind_64 *e =
	(struct mach_o_compact_unwind_64 *) content;

      for (p = content; p < content + size; p += sizeof (*e))
	{
	  e = (struct mach_o_compact_unwind_64 *) p;

	  printf (" %#016" PRIx64 " %#08x %#016" PRIx64 " %#016" PRIx64 "\n",
		  (uint64_t) bfd_get_64 (abfd, e->start),
		  (unsigned int) bfd_get_32 (abfd, e->length),
		  (uint64_t) bfd_get_64 (abfd, e->personality),
		  (uint64_t) bfd_get_64 (abfd, e->lsda));

	  printf ("  encoding: ");
	  dump_unwind_encoding (mdata, bfd_get_32 (abfd, e->encoding));
	  putchar ('\n');
	}
    }
  else
    {
      printf ("unhandled\n");
    }
}

static void
dump_exe_compact_unwind (bfd *abfd,
			 const unsigned char *content, bfd_size_type size)
{
  bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
  struct mach_o_unwind_info_header *hdr;
  unsigned int version;
  unsigned int encodings_offset;
  unsigned int encodings_count;
  unsigned int personality_offset;
  unsigned int personality_count;
  unsigned int index_offset;
  unsigned int index_count;
  struct mach_o_unwind_index_entry *index_entry;
  unsigned int i;

  /* The header.  */
  printf ("Compact unwind info:\n");

  hdr = (struct mach_o_unwind_info_header *) content;
  if (size < sizeof (*hdr))
    {
      printf ("  truncated!\n");
      return;
    }

  version = bfd_get_32 (abfd, hdr->version);
  if (version != MACH_O_UNWIND_SECTION_VERSION)
    {
      printf ("  unknown version: %u\n", version);
      return;
    }
  encodings_offset = bfd_get_32 (abfd, hdr->encodings_array_offset);
  encodings_count = bfd_get_32 (abfd, hdr->encodings_array_count);
  personality_offset = bfd_get_32 (abfd, hdr->personality_array_offset);
  personality_count = bfd_get_32 (abfd, hdr->personality_array_count);
  index_offset = bfd_get_32 (abfd, hdr->index_offset);
  index_count = bfd_get_32 (abfd, hdr->index_count);
  printf ("   %u encodings, %u personalities, %u level-1 indexes:\n",
	  encodings_count, personality_count, index_count);

  /* Personality.  */
  if (personality_count > 0)
    {
      const unsigned char *pers = content + personality_offset;

      printf ("   personalities\n");
      for (i = 0; i < personality_count; i++)
	printf ("     %u: 0x%08x\n", i,
		(unsigned) bfd_get_32 (abfd, pers + 4 * i));
    }

  /* Level-1 index.  */
  printf ("   idx function   level2 off lsda off\n");

  index_entry = (struct mach_o_unwind_index_entry *) (content + index_offset);
  for (i = 0; i < index_count; i++)
    {
      unsigned int func_offset;
      unsigned int level2_offset;
      unsigned int lsda_offset;

      func_offset = bfd_get_32 (abfd, index_entry->function_offset);
      level2_offset = bfd_get_32 (abfd, index_entry->second_level_offset);
      lsda_offset = bfd_get_32 (abfd, index_entry->lsda_index_offset);
      printf ("   %3u 0x%08x 0x%08x 0x%08x\n",
	      i, func_offset, level2_offset, lsda_offset);
      index_entry++;
    }

  /* Level-1 index.  */
  index_entry = (struct mach_o_unwind_index_entry *) (content + index_offset);
  for (i = 0; i < index_count; i++)
    {
      unsigned int func_offset;
      unsigned int level2_offset;
      const unsigned char *level2;
      unsigned int kind;

      func_offset = bfd_get_32 (abfd, index_entry->function_offset);
      level2_offset = bfd_get_32 (abfd, index_entry->second_level_offset);

      /* No level-2 for this index (should be the last index).  */
      if (level2_offset == 0)
	continue;

      level2 = content + level2_offset;
      kind = bfd_get_32 (abfd, level2);
      switch (kind)
	{
	case MACH_O_UNWIND_SECOND_LEVEL_COMPRESSED:
	  {
	    struct mach_o_unwind_compressed_second_level_page_header *l2;
	    unsigned int entry_offset;
	    unsigned int entry_count;
	    unsigned int l2_encodings_offset;
	    unsigned int l2_encodings_count;
	    const unsigned char *en;
	    unsigned int j;

	    l2 = (struct mach_o_unwind_compressed_second_level_page_header *)
	      level2;
	    entry_offset = bfd_get_16 (abfd, l2->entry_page_offset);
	    entry_count = bfd_get_16 (abfd, l2->entry_count);
	    l2_encodings_offset = bfd_get_16 (abfd, l2->encodings_offset);
	    l2_encodings_count = bfd_get_16 (abfd, l2->encodings_count);

	    printf ("   index %2u: compressed second level: "
		    "%u entries, %u encodings (at 0x%08x)\n",
		    i, entry_count, l2_encodings_count, l2_encodings_offset);
	    printf ("   #    function   eidx  encoding\n");

	    en = level2 + entry_offset;
	    for (j = 0; j < entry_count; j++)
	      {
		unsigned int entry;
		unsigned int en_func;
		unsigned int enc_idx;
		unsigned int encoding;
		const unsigned char *enc_addr;

		entry = bfd_get_32 (abfd, en);
		en_func =
		  MACH_O_UNWIND_INFO_COMPRESSED_ENTRY_FUNC_OFFSET (entry);
		enc_idx =
		  MACH_O_UNWIND_INFO_COMPRESSED_ENTRY_ENCODING_INDEX (entry);
		if (enc_idx < encodings_count)
		  enc_addr = content + encodings_offset
		    + 4 * enc_idx;
		else
		  enc_addr = level2 + l2_encodings_offset
		    + 4 * (enc_idx - encodings_count);
		encoding = bfd_get_32 (abfd, enc_addr);

		printf ("   %4u 0x%08x [%3u] ", j,
			func_offset + en_func, enc_idx);
		dump_unwind_encoding (mdata, encoding);
		putchar ('\n');

		en += 4;
	      }
	  }
	  break;

	case MACH_O_UNWIND_SECOND_LEVEL_REGULAR:
	  {
	    struct mach_o_unwind_regular_second_level_page_header *l2;
	    struct mach_o_unwind_regular_second_level_entry *en;
	    unsigned int entry_offset;
	    unsigned int entry_count;
	    unsigned int j;

	    l2 = (struct mach_o_unwind_regular_second_level_page_header *)
	      level2;

	    entry_offset = bfd_get_16 (abfd, l2->entry_page_offset);
	    entry_count = bfd_get_16 (abfd, l2->entry_count);
	    printf ("   index %2u: regular level 2 at 0x%04x, %u entries\n",
		    i, entry_offset, entry_count);
	    printf ("   #    function   encoding\n");

	    en = (struct mach_o_unwind_regular_second_level_entry *)
	      (level2 + entry_offset);
	    for (j = 0; j < entry_count; j++)
	      {
		unsigned int en_func;
		unsigned int encoding;

		en_func = bfd_get_32 (abfd, en->function_offset);
		encoding = bfd_get_32 (abfd, en->encoding);
		printf ("   %-4u 0x%08x ", j, en_func);
		dump_unwind_encoding (mdata, encoding);
		putchar ('\n');
		en++;
	      }
	  }
	  break;

	default:
	  printf ("   index %2u: unhandled second level format (%u)\n",
		  i, kind);
	  break;
	}

      {
	struct mach_o_unwind_lsda_index_entry *lsda;
	unsigned int lsda_offset;
	unsigned int next_lsda_offset;
	unsigned int nbr_lsda;
	unsigned int j;

	lsda_offset = bfd_get_32 (abfd, index_entry->lsda_index_offset);
	next_lsda_offset = bfd_get_32 (abfd, index_entry[1].lsda_index_offset);
	lsda = (struct mach_o_unwind_lsda_index_entry *)
	  (content + lsda_offset);
	nbr_lsda = (next_lsda_offset - lsda_offset) / sizeof (*lsda);
	for (j = 0; j < nbr_lsda; j++)
	  {
	    printf ("   lsda %3u: function 0x%08x lsda 0x%08x\n",
		    j, (unsigned int) bfd_get_32 (abfd, lsda->function_offset),
		    (unsigned int) bfd_get_32 (abfd, lsda->lsda_offset));
	    lsda++;
	  }
      }
      index_entry++;
    }
}

static void
dump_section_content (bfd *abfd,
		      const char *segname, const char *sectname,
		      void (*dump)(bfd*, const unsigned char*, bfd_size_type))
{
  bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
  bfd_mach_o_load_command *cmd;

  for (cmd = mdata->first_command; cmd != NULL; cmd = cmd->next)
    {
      if (cmd->type == BFD_MACH_O_LC_SEGMENT
	  || cmd->type == BFD_MACH_O_LC_SEGMENT_64)
	{
	  bfd_mach_o_segment_command *seg = &cmd->command.segment;
	  bfd_mach_o_section *sec;
	  for (sec = seg->sect_head; sec != NULL; sec = sec->next)
	    if (strcmp (sec->segname, segname) == 0
		&& strcmp (sec->sectname, sectname) == 0)
	      {
		bfd_size_type size;
		asection *bfdsec = sec->bfdsection;
		unsigned char *content;

		size = bfd_section_size (bfdsec);
		content = (unsigned char *) xmalloc (size);
		bfd_get_section_contents (abfd, bfdsec, content, 0, size);

		(*dump)(abfd, content, size);

		free (content);
	      }
	}
    }
}

/* Dump ABFD (according to the options[] array).  */

static void
mach_o_dump (bfd *abfd)
{
  if (options[OPT_HEADER].selected)
    dump_header (abfd);
  if (options[OPT_SECTION].selected)
    dump_load_commands (abfd, BFD_MACH_O_LC_SEGMENT, BFD_MACH_O_LC_SEGMENT_64);
  if (options[OPT_MAP].selected)
    dump_section_map (abfd);
  if (options[OPT_LOAD].selected)
    dump_load_commands (abfd, 0, 0);
  if (options[OPT_DYSYMTAB].selected)
    dump_load_commands (abfd, BFD_MACH_O_LC_DYSYMTAB, 0);
  if (options[OPT_CODESIGN].selected)
    dump_load_commands (abfd, BFD_MACH_O_LC_CODE_SIGNATURE, 0);
  if (options[OPT_SEG_SPLIT_INFO].selected)
    dump_load_commands (abfd, BFD_MACH_O_LC_SEGMENT_SPLIT_INFO, 0);
  if (options[OPT_FUNCTION_STARTS].selected)
    dump_load_commands (abfd, BFD_MACH_O_LC_FUNCTION_STARTS, 0);
  if (options[OPT_DATA_IN_CODE].selected)
    dump_load_commands (abfd, BFD_MACH_O_LC_DATA_IN_CODE, 0);
  if (options[OPT_TWOLEVEL_HINTS].selected)
    dump_load_commands (abfd, BFD_MACH_O_LC_TWOLEVEL_HINTS, 0);
  if (options[OPT_COMPACT_UNWIND].selected)
    {
      dump_section_content (abfd, "__LD", "__compact_unwind",
			    dump_obj_compact_unwind);
      dump_section_content (abfd, "__TEXT", "__unwind_info",
			    dump_exe_compact_unwind);
    }
  if (options[OPT_DYLD_INFO].selected)
    dump_load_commands (abfd, BFD_MACH_O_LC_DYLD_INFO, 0);
}

/* Vector for Mach-O.  */

const struct objdump_private_desc objdump_private_desc_mach_o =
{
 mach_o_help,
 mach_o_filter,
 mach_o_dump,
 options
};
