/* od-macho.c -- dump information about an Mach-O object file.
- Copyright (C) 2011-2018 Free Software Foundation, Inc.
+ Copyright (C) 2011-2022 Free Software Foundation, Inc.
Written by Tristan Gingold, Adacore.
This file is part of GNU Binutils.
#include "bfd.h"
#include "objdump.h"
#include "bucomm.h"
+#include "elfcomm.h"
#include "dwarf.h"
#include "bfdlink.h"
#include "mach-o.h"
{ "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}
};
printf ("-");
}
-/* Print a bfd_uint64_t, using a platform independent style. */
-
-static void
-printf_uint64 (bfd_uint64_t v)
-{
- printf ("0x%08lx%08lx",
- (unsigned long)((v >> 16) >> 16), (unsigned long)(v & 0xffffffffUL));
-}
-
static const char *
bfd_mach_o_get_name_or_null (const bfd_mach_o_xlat_name *table,
unsigned long val)
seg = &cmd->command.segment;
printf ("[Segment %-16s ", seg->segname);
- printf_vma (seg->vmaddr);
+ bfd_printf_vma (abfd, seg->vmaddr);
putchar ('-');
- printf_vma (seg->vmaddr + seg->vmsize - 1);
+ bfd_printf_vma (abfd, seg->vmaddr + seg->vmsize - 1);
putchar (' ');
disp_segment_prot (seg->initprot);
printf ("]\n");
{
printf ("%02u: %-16s %-16s ", ++sec_nbr,
sec->segname, sec->sectname);
- printf_vma (sec->addr);
+ bfd_printf_vma (abfd, sec->addr);
putchar (' ');
- printf_vma (sec->size);
+ bfd_printf_vma (abfd, sec->size);
printf (" %08lx\n", sec->flags);
}
}
}
static void
-dump_section_header (bfd *abfd ATTRIBUTE_UNUSED, bfd_mach_o_section *sec)
+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: ");
- printf_vma (sec->addr);
+ bfd_printf_vma (abfd, sec->addr);
printf (" size: ");
- printf_vma (sec->size);
+ bfd_printf_vma (abfd, sec->size);
printf (" offset: ");
- printf_vma (sec->offset);
+ bfd_printf_vma (abfd, sec->offset);
printf ("\n");
printf (" align: %ld", sec->align);
printf (" nreloc: %lu reloff: ", sec->nreloc);
- printf_vma (sec->reloff);
+ 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,
}
static void
-dump_segment (bfd *abfd ATTRIBUTE_UNUSED, bfd_mach_o_load_command *cmd)
+dump_segment (bfd *abfd, bfd_mach_o_load_command *cmd)
{
bfd_mach_o_segment_command *seg = &cmd->command.segment;
bfd_mach_o_section *sec;
disp_segment_prot (seg->maxprot);
printf ("\n");
printf (" vmaddr: ");
- printf_vma (seg->vmaddr);
+ bfd_printf_vma (abfd, seg->vmaddr);
printf (" vmsize: ");
- printf_vma (seg->vmsize);
+ bfd_printf_vma (abfd, seg->vmsize);
printf ("\n");
printf (" fileoff: ");
- printf_vma (seg->fileoff);
+ bfd_printf_vma (abfd, seg->fileoff);
printf (" filesize: ");
- printf_vma ((bfd_vma)seg->filesize);
+ bfd_printf_vma (abfd, (bfd_vma) seg->filesize);
printf (" endoff: ");
- printf_vma ((bfd_vma)(seg->fileoff + seg->filesize));
+ 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, bfd_boolean verbose)
+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);
printf (" term: idx: %8u num: %u\n",
module->iterm, module->nterm);
printf (" objc_module_info: addr: ");
- printf_vma (module->objc_module_info_addr);
+ bfd_printf_vma (abfd, module->objc_module_info_addr);
printf (" size: %lu\n", module->objc_module_info_size);
}
unsigned int isym = dysymtab->indirect_syms[j];
printf (" ");
- printf_vma (addr);
+ bfd_printf_vma (abfd, addr);
printf (" %5u: 0x%08x", j, isym);
if (isym & BFD_MACH_O_INDIRECT_SYMBOL_LOCAL)
printf (" LOCAL");
}
-static bfd_boolean
+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;
+ return true;
buf = xmalloc (len);
&& bfd_bread (buf, len, abfd) == len)
dump (abfd, buf, len, off);
else
- return FALSE;
+ return false;
free (buf);
- return TRUE;
+ return true;
}
static const bfd_mach_o_xlat_name bfd_mach_o_dyld_rebase_type_name[] =
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, &leblen, 0, buf + len);
+ 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, &leblen, 0, buf + len);
+ leb = read_leb128 (buf + i, buf + len, 0, &leblen, NULL);
printf ("add addr uleb: 0x%08x\n", (unsigned) leb);
i += leblen;
break;
printf ("rebase imm times: %u\n", imm);
break;
case BFD_MACH_O_REBASE_OPCODE_DO_REBASE_ULEB_TIMES:
- leb = read_leb128 (buf + i, &leblen, 0, buf + len);
+ 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, &leblen, 0, buf + len);
+ 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, &leblen, 0, buf + len);
+ leb = read_leb128 (buf + i, buf + len, 0, &leblen, NULL);
printf ("rebase uleb times (%u)", (unsigned) leb);
i += leblen;
- leb = read_leb128 (buf + i, &leblen, 0, buf + len);
+ leb = read_leb128 (buf + i, buf + len, 0, &leblen, NULL);
printf (" skipping uleb (%u)\n", (unsigned) leb);
i += leblen;
break;
printf ("set dylib ordinal imm: %u\n", imm);
break;
case BFD_MACH_O_BIND_OPCODE_SET_DYLIB_ORDINAL_ULEB:
- leb = read_leb128 (buf + i, &leblen, 0, buf + len);
+ 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_ADDEND_SLEB:
{
bfd_signed_vma svma;
- svma = read_leb128 (buf + i, &leblen, 0, buf + len);
+ 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, &leblen, 0, buf + len);
+ 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, &leblen, 0, buf + len);
+ leb = read_leb128 (buf + i, buf + len, 0, &leblen, NULL);
printf ("add addr uleb: 0x%08x\n", (unsigned) leb);
i += leblen;
break;
printf ("do bind\n");
break;
case BFD_MACH_O_BIND_OPCODE_DO_BIND_ADD_ADDR_ULEB:
- leb = read_leb128 (buf + i, &leblen, 0, buf + len);
+ leb = read_leb128 (buf + i, buf + len, 0, &leblen, NULL);
printf ("do bind add addr uleb: 0x%08x\n", (unsigned) leb);
i += leblen;
break;
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, &leblen, 0, buf + len);
+ 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, &leblen, 0, buf + len);
+ leb = read_leb128 (buf + i, buf + len, 0, &leblen, NULL);
printf (" skipping uleb (%u)\n", (unsigned) leb);
i += leblen;
break;
unsigned int child_count;
unsigned int i;
- size = read_leb128 (buf + off, &leblen, 0, buf + len);
+ 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, &leblen, 0, buf + len);
+ flags = read_leb128 (buf + off, buf + len, 0, &leblen, NULL);
off += leblen;
fputs (" ", stdout);
{
bfd_vma lib;
- lib = read_leb128 (buf + off, &leblen, 0, buf + len);
+ lib = read_leb128 (buf + off, buf + len, 0, &leblen, NULL);
off += leblen;
fputs (" [reexport] ", stdout);
bfd_vma offset;
bfd_vma resolv = 0;
- offset = read_leb128 (buf + off, &leblen, 0, buf + len);
+ 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, &leblen, 0, buf + len);
+ resolv = read_leb128 (buf + off, buf + len, 0, &leblen, NULL);
off += leblen;
}
}
}
- child_count = read_leb128 (buf + off, &leblen, 0, buf + len);
+ child_count = read_leb128 (buf + off, buf + len, 0, &leblen, NULL);
off += leblen;
for (i = 0; i < child_count; i++)
off += strlen ((const char *)buf + off) + 1;
- sub_off = read_leb128 (buf + off, &leblen, 0, buf + len);
+ 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 (bfd *abfd, bfd_mach_o_load_command *cmd,
- bfd_boolean verbose)
+ bool verbose)
{
bfd_mach_o_dyld_info_command *dinfo = &cmd->command.dyld_info;
}
for (p = buf + 1; *p != 0; p += len)
{
- addr += read_leb128 (p, &len, 0, buf + cmd->datasize);
+ addr += read_leb128 (p, buf + cmd->datasize, 0, &len, NULL);
fputs (" ", stdout);
bfd_printf_vma (abfd, addr);
putchar ('\n');
static void
dump_load_command (bfd *abfd, bfd_mach_o_load_command *cmd,
- unsigned int idx, bfd_boolean verbose)
+ unsigned int idx, bool verbose)
{
bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
const char *cmd_name;
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
}
case BFD_MACH_O_LC_MAIN:
{
- bfd_mach_o_main_command *entry = &cmd->command.main;
- printf (" entry offset: ");
- printf_uint64 (entry->entryoff);
- printf ("\n"
- " stack size: ");
- printf_uint64 (entry->stacksize);
- printf ("\n");
- break;
+ 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", note->data_owner);
- printf (" offset: ");
- printf_uint64 (note->offset);
- printf ("\n"
- " size: ");
- printf_uint64 (note->size);
- printf ("\n");
- break;
+ 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);
for (cmd = mdata->first_command, i = 0; cmd != NULL; cmd = cmd->next, i++)
{
if (cmd32 == 0)
- dump_load_command (abfd, cmd, i, FALSE);
+ dump_load_command (abfd, cmd, i, false);
else if (cmd->type == cmd32 || cmd->type == cmd64)
- dump_load_command (abfd, cmd, i, TRUE);
+ dump_load_command (abfd, cmd, i, true);
}
}
{
e = (struct mach_o_compact_unwind_64 *) p;
- putchar (' ');
- printf_uint64 (bfd_get_64 (abfd, e->start));
- printf (" %08lx", bfd_get_32 (abfd, e->length));
- putchar (' ');
- printf_uint64 (bfd_get_64 (abfd, e->personality));
- putchar (' ');
- printf_uint64 (bfd_get_64 (abfd, e->lsda));
- putchar ('\n');
+ 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));
asection *bfdsec = sec->bfdsection;
unsigned char *content;
- size = bfd_get_section_size (bfdsec);
+ size = bfd_section_size (bfdsec);
content = (unsigned char *) xmalloc (size);
bfd_get_section_contents (abfd, bfdsec, content, 0, size);