X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=binutils%2Fod-macho.c;h=710dfc33db906a08db83b24c6d6cef9d67f30751;hb=7cc124ae972d328baa1afc704ae8b812191271c1;hp=ada86b52360e2288cea789049d76a6cb43736d76;hpb=fd3619828e94a24a92cddec42cbc0ab33352eeb4;p=binutils-gdb.git diff --git a/binutils/od-macho.c b/binutils/od-macho.c index ada86b52360..710dfc33db9 100644 --- a/binutils/od-macho.c +++ b/binutils/od-macho.c @@ -1,5 +1,5 @@ /* od-macho.c -- dump information about an Mach-O object file. - Copyright (C) 2011-2019 Free Software Foundation, Inc. + Copyright (C) 2011-2022 Free Software Foundation, Inc. Written by Tristan Gingold, Adacore. This file is part of GNU Binutils. @@ -26,6 +26,7 @@ #include "bfd.h" #include "objdump.h" #include "bucomm.h" +#include "elfcomm.h" #include "dwarf.h" #include "bfdlink.h" #include "mach-o.h" @@ -213,6 +214,8 @@ static const bfd_mach_o_xlat_name bfd_mach_o_load_command_name[] = { "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} }; @@ -280,15 +283,6 @@ bfd_mach_o_print_flags (const bfd_mach_o_xlat_name *table, 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) @@ -363,9 +357,9 @@ dump_section_map (bfd *abfd) 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"); @@ -374,29 +368,29 @@ dump_section_map (bfd *abfd) { 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, @@ -431,7 +425,7 @@ dump_section_header (bfd *abfd ATTRIBUTE_UNUSED, bfd_mach_o_section *sec) } 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; @@ -445,23 +439,23 @@ dump_segment (bfd *abfd ATTRIBUTE_UNUSED, bfd_mach_o_load_command *cmd) 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); @@ -546,7 +540,7 @@ dump_dysymtab (bfd *abfd, bfd_mach_o_load_command *cmd, bfd_boolean verbose) 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); } @@ -614,7 +608,7 @@ dump_dysymtab (bfd *abfd, bfd_mach_o_load_command *cmd, bfd_boolean verbose) 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"); @@ -653,7 +647,7 @@ dump_dysymtab (bfd *abfd, bfd_mach_o_load_command *cmd, bfd_boolean verbose) } -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)) @@ -661,7 +655,7 @@ load_and_dump (bfd *abfd, ufile_ptr off, unsigned int len, unsigned char *buf; if (len == 0) - return TRUE; + return true; buf = xmalloc (len); @@ -669,10 +663,10 @@ load_and_dump (bfd *abfd, ufile_ptr off, unsigned int 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[] = @@ -709,13 +703,13 @@ dump_dyld_info_rebase (bfd *abfd, unsigned char *buf, unsigned int len, 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; @@ -726,20 +720,20 @@ dump_dyld_info_rebase (bfd *abfd, unsigned char *buf, unsigned int len, 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; @@ -776,7 +770,7 @@ dump_dyld_info_bind (bfd *abfd, unsigned char *buf, unsigned int len, 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; @@ -799,19 +793,19 @@ dump_dyld_info_bind (bfd *abfd, unsigned char *buf, unsigned int len, 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; @@ -819,7 +813,7 @@ dump_dyld_info_bind (bfd *abfd, unsigned char *buf, unsigned int len, 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; @@ -827,10 +821,10 @@ dump_dyld_info_bind (bfd *abfd, unsigned char *buf, unsigned int len, 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; @@ -858,7 +852,7 @@ dump_dyld_info_export_1 (bfd *abfd, unsigned char *buf, unsigned int len, 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) @@ -866,7 +860,7 @@ dump_dyld_info_export_1 (bfd *abfd, unsigned char *buf, unsigned int len, 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); @@ -889,7 +883,7 @@ dump_dyld_info_export_1 (bfd *abfd, unsigned char *buf, unsigned int len, { 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); @@ -911,12 +905,12 @@ dump_dyld_info_export_1 (bfd *abfd, unsigned char *buf, unsigned int len, 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; } @@ -929,7 +923,7 @@ dump_dyld_info_export_1 (bfd *abfd, unsigned char *buf, unsigned int len, } } - 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++) @@ -943,7 +937,7 @@ dump_dyld_info_export_1 (bfd *abfd, unsigned char *buf, unsigned int len, 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); @@ -965,7 +959,7 @@ dump_dyld_info_export (bfd *abfd, unsigned char *buf, unsigned int len, 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; @@ -1311,7 +1305,7 @@ dump_segment_split_info (bfd *abfd, bfd_mach_o_linkedit_command *cmd) } 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'); @@ -1524,7 +1518,7 @@ dump_build_version (bfd *abfd, bfd_mach_o_load_command *cmd) 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; @@ -1609,6 +1603,8 @@ dump_load_command (bfd *abfd, bfd_mach_o_load_command *cmd, 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 @@ -1724,26 +1720,20 @@ dump_load_command (bfd *abfd, bfd_mach_o_load_command *cmd, } 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); @@ -1764,9 +1754,9 @@ dump_load_commands (bfd *abfd, unsigned int cmd32, unsigned int cmd64) 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); } } @@ -2008,14 +1998,11 @@ dump_obj_compact_unwind (bfd *abfd, { 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));