This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
[Patch] bfd darwin: add new filetypes
- From: Tristan Gingold <gingold at adacore dot com>
- To: Binutils <binutils at sourceware dot org>
- Date: Wed, 16 Sep 2009 15:30:23 +0200
- Subject: [Patch] bfd darwin: add new filetypes
Hi,
darwin10 (aka Snow Leopard) has added a few new filetypes.
objdump -p will also now display the address of indirect symbols.
I will commit this on mainline.
Tristan.
bfd/
2009-09-16 Tristan Gingold <gingold@adacore.com>
* mach-o.h (bfd_mach_o_filetype): Add new constants from darwin10.
Reindent.
* mach-o.c (bfd_mach_o_cpu_name): Reindent.
(bfd_mach_o_filetype_name): Complete with new constants. Reindent.
(bfd_mach_o_print_private_header): Use fputs instead of fprintf
when possible to avoid warnings.
(bfd_mach_o_print_section_map): Ditto.
(bfd_mach_o_section_get_entry_size): New function.
(bfd_mach_o_section_get_nbr_indirect): Simplify using the newly
added function.
(bfd_mach_o_print_dysymtab): Print address of indirect symbols.
Index: mach-o.c
===================================================================
RCS file: /cvs/src/src/bfd/mach-o.c,v
retrieving revision 1.42
diff -c -r1.42 mach-o.c
*** mach-o.c 9 Sep 2009 14:58:12 -0000 1.42
--- mach-o.c 16 Sep 2009 13:26:45 -0000
***************
*** 3081,3113 ****
static 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},
! { "i860", BFD_MACH_O_CPU_TYPE_I860},
! { "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},
{ NULL, 0}
};
static 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},
{ NULL, 0}
};
--- 3081,3116 ----
static 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 },
! { "i860", BFD_MACH_O_CPU_TYPE_I860 },
! { "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 },
{ NULL, 0}
};
static 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}
};
***************
*** 3220,3226 ****
bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
bfd_mach_o_header *h = &mdata->header;
! fprintf (file, _("Mach-O header:\n"));
fprintf (file, _(" magic : %08lx\n"), h->magic);
fprintf (file, _(" cputype : %08lx (%s)\n"), h->cputype,
bfd_mach_o_get_name (bfd_mach_o_cpu_name, h->cputype));
--- 3223,3229 ----
bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
bfd_mach_o_header *h = &mdata->header;
! fputs (_("Mach-O header:\n"), file);
fprintf (file, _(" magic : %08lx\n"), h->magic);
fprintf (file, _(" cputype : %08lx (%s)\n"), h->cputype,
bfd_mach_o_get_name (bfd_mach_o_cpu_name, h->cputype));
***************
*** 3232,3238 ****
fprintf (file, _(" sizeofcmds: %08lx\n"), h->sizeofcmds);
fprintf (file, _(" flags : %08lx ("), h->flags);
bfd_mach_o_print_flags (bfd_mach_o_header_flags_name, h->flags,
file);
! fprintf (file, _(")\n"));
fprintf (file, _(" reserved : %08x\n"), h->reserved);
}
--- 3235,3241 ----
fprintf (file, _(" sizeofcmds: %08lx\n"), h->sizeofcmds);
fprintf (file, _(" flags : %08lx ("), h->flags);
bfd_mach_o_print_flags (bfd_mach_o_header_flags_name, h->flags,
file);
! fputs (_(")\n"), file);
fprintf (file, _(" reserved : %08x\n"), h->reserved);
}
***************
*** 3243,3250 ****
unsigned int i, j;
unsigned int sec_nbr = 0;
! fprintf (file, _("Segments and Sections:\n"));
! fprintf (file, _(" #: Segment name Section name Address
\n"));
for (i = 0; i < mdata->header.ncmds; i++)
{
--- 3246,3253 ----
unsigned int i, j;
unsigned int sec_nbr = 0;
! fputs (_("Segments and Sections:\n"), file);
! fputs (_(" #: Segment name Section name Address\n"), file);
for (i = 0; i < mdata->header.ncmds; i++)
{
***************
*** 3278,3310 ****
}
}
! /* Return the number of indirect symbols for a section.
Must be called only for symbol pointer section and symbol stubs
sections. */
static unsigned int
! bfd_mach_o_section_get_nbr_indirect (bfd *abfd, bfd_mach_o_section
*sec)
{
- unsigned int elsz;
-
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:
! elsz = bfd_mach_o_wide_p (abfd) ? 8 : 4;
! return sec->size / elsz;
case BFD_MACH_O_S_SYMBOL_STUBS:
! elsz = sec->reserved2;
! if (elsz)
! return sec->size / elsz;
! else
! return 0;
default:
BFD_FAIL ();
return 0;
}
}
static void
bfd_mach_o_print_section (bfd *abfd ATTRIBUTE_UNUSED,
bfd_mach_o_section *sec, FILE *file)
--- 3281,3322 ----
}
}
! /* Return the size of an entry for section SEC.
Must be called only for symbol pointer section and symbol stubs
sections. */
static unsigned int
! bfd_mach_o_section_get_entry_size (bfd *abfd, bfd_mach_o_section *sec)
{
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:
! return bfd_mach_o_wide_p (abfd) ? 8 : 4;
case BFD_MACH_O_S_SYMBOL_STUBS:
! return sec->reserved2;
default:
BFD_FAIL ();
return 0;
}
}
+ /* Return the number of indirect symbols for a section.
+ Must be called only for symbol pointer section and symbol stubs
+ sections. */
+
+ static unsigned int
+ bfd_mach_o_section_get_nbr_indirect (bfd *abfd, bfd_mach_o_section
*sec)
+ {
+ unsigned int elsz;
+
+ elsz = bfd_mach_o_section_get_entry_size (abfd, sec);
+ if (elsz == 0)
+ return 0;
+ else
+ return sec->size / elsz;
+ }
+
static void
bfd_mach_o_print_section (bfd *abfd ATTRIBUTE_UNUSED,
bfd_mach_o_section *sec, FILE *file)
***************
*** 3515,3520 ****
--- 3527,3534 ----
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)
{
***************
*** 3523,3535 ****
case BFD_MACH_O_S_SYMBOL_STUBS:
first = sec->reserved1;
last = first + bfd_mach_o_section_get_nbr_indirect
(abfd, sec);
fprintf (file, " for section %s.%s:\n",
sec->segname, sec->sectname);
for (j = first; j < last; j++)
{
unsigned int isym = dysymtab->indirect_syms[j];
! fprintf (file, " %5u: 0x%08x (%u)", j, isym, isym);
if (isym & BFD_MACH_O_INDIRECT_SYMBOL_LOCAL)
fprintf (file, " LOCAL");
if (isym & BFD_MACH_O_INDIRECT_SYMBOL_ABS)
--- 3537,3553 ----
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);
fprintf (file, " for section %s.%s:\n",
sec->segname, sec->sectname);
for (j = first; j < last; j++)
{
unsigned int isym = dysymtab->indirect_syms[j];
! fprintf (file, " ");
! fprintf_vma (file, addr);
! fprintf (file, " %5u: 0x%08x", j, isym);
if (isym & BFD_MACH_O_INDIRECT_SYMBOL_LOCAL)
fprintf (file, " LOCAL");
if (isym & BFD_MACH_O_INDIRECT_SYMBOL_ABS)
***************
*** 3539,3544 ****
--- 3557,3563 ----
&& symtab->symbols[isym].symbol.name)
fprintf (file, " %s", symtab->symbols
[isym].symbol.name);
fprintf (file, "\n");
+ addr += entry_size;
}
break;
default:
Index: mach-o.h
===================================================================
RCS file: /cvs/src/src/bfd/mach-o.h,v
retrieving revision 1.18
diff -c -r1.18 mach-o.h
*** mach-o.h 9 Sep 2009 14:58:12 -0000 1.18
--- mach-o.h 16 Sep 2009 13:26:45 -0000
***************
*** 166,179 ****
typedef enum bfd_mach_o_filetype
{
! BFD_MACH_O_MH_OBJECT = 1,
! BFD_MACH_O_MH_EXECUTE = 2,
! BFD_MACH_O_MH_FVMLIB = 3,
! BFD_MACH_O_MH_CORE = 4,
! BFD_MACH_O_MH_PRELOAD = 5,
! BFD_MACH_O_MH_DYLIB = 6,
! BFD_MACH_O_MH_DYLINKER = 7,
! BFD_MACH_O_MH_BUNDLE = 8
}
bfd_mach_o_filetype;
--- 166,182 ----
typedef enum bfd_mach_o_filetype
{
! BFD_MACH_O_MH_OBJECT = 0x01,
! BFD_MACH_O_MH_EXECUTE = 0x02,
! BFD_MACH_O_MH_FVMLIB = 0x03,
! BFD_MACH_O_MH_CORE = 0x04,
! BFD_MACH_O_MH_PRELOAD = 0x05,
! BFD_MACH_O_MH_DYLIB = 0x06,
! BFD_MACH_O_MH_DYLINKER = 0x07,
! BFD_MACH_O_MH_BUNDLE = 0x08,
! BFD_MACH_O_MH_DYLIB_STUB = 0x09,
! BFD_MACH_O_MH_DSYM = 0x0a,
! BFD_MACH_O_MH_KEXT_BUNDLE = 0x0b
}
bfd_mach_o_filetype;