This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[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;



Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]