[Patch] bfd darwin: add new filetypes

Tristan Gingold gingold@adacore.com
Wed Sep 16 13:30:00 GMT 2009


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;




More information about the Binutils mailing list