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.
This commit is contained in:
Tristan Gingold
2009-09-16 13:30:32 +00:00
parent 5cca3659ec
commit afecc97cf6
3 changed files with 87 additions and 51 deletions

View File

@ -1,3 +1,17 @@
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.
2009-09-14 Nick Clifton <nickc@redhat.com> 2009-09-14 Nick Clifton <nickc@redhat.com>
* po/fi.po: Updated Finnish translation. * po/fi.po: Updated Finnish translation.

View File

@ -3081,33 +3081,36 @@ bfd_mach_o_get_name (const bfd_mach_o_xlat_name *table, unsigned long val)
static bfd_mach_o_xlat_name bfd_mach_o_cpu_name[] = static bfd_mach_o_xlat_name bfd_mach_o_cpu_name[] =
{ {
{ "vax", BFD_MACH_O_CPU_TYPE_VAX}, { "vax", BFD_MACH_O_CPU_TYPE_VAX },
{ "mc680x0", BFD_MACH_O_CPU_TYPE_MC680x0}, { "mc680x0", BFD_MACH_O_CPU_TYPE_MC680x0 },
{ "i386", BFD_MACH_O_CPU_TYPE_I386}, { "i386", BFD_MACH_O_CPU_TYPE_I386 },
{ "mips", BFD_MACH_O_CPU_TYPE_MIPS}, { "mips", BFD_MACH_O_CPU_TYPE_MIPS },
{ "mc98000", BFD_MACH_O_CPU_TYPE_MC98000}, { "mc98000", BFD_MACH_O_CPU_TYPE_MC98000 },
{ "hppa", BFD_MACH_O_CPU_TYPE_HPPA}, { "hppa", BFD_MACH_O_CPU_TYPE_HPPA },
{ "arm", BFD_MACH_O_CPU_TYPE_ARM}, { "arm", BFD_MACH_O_CPU_TYPE_ARM },
{ "mc88000", BFD_MACH_O_CPU_TYPE_MC88000}, { "mc88000", BFD_MACH_O_CPU_TYPE_MC88000 },
{ "sparc", BFD_MACH_O_CPU_TYPE_SPARC}, { "sparc", BFD_MACH_O_CPU_TYPE_SPARC },
{ "i860", BFD_MACH_O_CPU_TYPE_I860}, { "i860", BFD_MACH_O_CPU_TYPE_I860 },
{ "alpha", BFD_MACH_O_CPU_TYPE_ALPHA}, { "alpha", BFD_MACH_O_CPU_TYPE_ALPHA },
{ "powerpc", BFD_MACH_O_CPU_TYPE_POWERPC}, { "powerpc", BFD_MACH_O_CPU_TYPE_POWERPC },
{ "powerpc_64", BFD_MACH_O_CPU_TYPE_POWERPC_64}, { "powerpc_64", BFD_MACH_O_CPU_TYPE_POWERPC_64 },
{ "x86_64", BFD_MACH_O_CPU_TYPE_X86_64}, { "x86_64", BFD_MACH_O_CPU_TYPE_X86_64 },
{ NULL, 0} { NULL, 0}
}; };
static bfd_mach_o_xlat_name bfd_mach_o_filetype_name[] = static bfd_mach_o_xlat_name bfd_mach_o_filetype_name[] =
{ {
{ "object", BFD_MACH_O_MH_OBJECT}, { "object", BFD_MACH_O_MH_OBJECT },
{ "execute", BFD_MACH_O_MH_EXECUTE}, { "execute", BFD_MACH_O_MH_EXECUTE },
{ "fvmlib", BFD_MACH_O_MH_FVMLIB}, { "fvmlib", BFD_MACH_O_MH_FVMLIB },
{ "core", BFD_MACH_O_MH_CORE}, { "core", BFD_MACH_O_MH_CORE },
{ "preload", BFD_MACH_O_MH_PRELOAD}, { "preload", BFD_MACH_O_MH_PRELOAD },
{ "dylib", BFD_MACH_O_MH_DYLIB}, { "dylib", BFD_MACH_O_MH_DYLIB },
{ "dylinker", BFD_MACH_O_MH_DYLINKER}, { "dylinker", BFD_MACH_O_MH_DYLINKER },
{ "bundle", BFD_MACH_O_MH_BUNDLE}, { "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} { NULL, 0}
}; };
@ -3220,7 +3223,7 @@ bfd_mach_o_print_private_header (bfd *abfd, FILE *file)
bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd); bfd_mach_o_data_struct *mdata = bfd_mach_o_get_data (abfd);
bfd_mach_o_header *h = &mdata->header; bfd_mach_o_header *h = &mdata->header;
fprintf (file, _("Mach-O header:\n")); fputs (_("Mach-O header:\n"), file);
fprintf (file, _(" magic : %08lx\n"), h->magic); fprintf (file, _(" magic : %08lx\n"), h->magic);
fprintf (file, _(" cputype : %08lx (%s)\n"), h->cputype, fprintf (file, _(" cputype : %08lx (%s)\n"), h->cputype,
bfd_mach_o_get_name (bfd_mach_o_cpu_name, h->cputype)); bfd_mach_o_get_name (bfd_mach_o_cpu_name, h->cputype));
@ -3232,7 +3235,7 @@ bfd_mach_o_print_private_header (bfd *abfd, FILE *file)
fprintf (file, _(" sizeofcmds: %08lx\n"), h->sizeofcmds); fprintf (file, _(" sizeofcmds: %08lx\n"), h->sizeofcmds);
fprintf (file, _(" flags : %08lx ("), h->flags); fprintf (file, _(" flags : %08lx ("), h->flags);
bfd_mach_o_print_flags (bfd_mach_o_header_flags_name, h->flags, file); bfd_mach_o_print_flags (bfd_mach_o_header_flags_name, h->flags, file);
fprintf (file, _(")\n")); fputs (_(")\n"), file);
fprintf (file, _(" reserved : %08x\n"), h->reserved); fprintf (file, _(" reserved : %08x\n"), h->reserved);
} }
@ -3243,8 +3246,8 @@ bfd_mach_o_print_section_map (bfd *abfd, FILE *file)
unsigned int i, j; unsigned int i, j;
unsigned int sec_nbr = 0; unsigned int sec_nbr = 0;
fprintf (file, _("Segments and Sections:\n")); fputs (_("Segments and Sections:\n"), file);
fprintf (file, _(" #: Segment name Section name Address\n")); fputs (_(" #: Segment name Section name Address\n"), file);
for (i = 0; i < mdata->header.ncmds; i++) for (i = 0; i < mdata->header.ncmds; i++)
{ {
@ -3278,6 +3281,26 @@ bfd_mach_o_print_section_map (bfd *abfd, FILE *file)
} }
} }
/* 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. /* Return the number of indirect symbols for a section.
Must be called only for symbol pointer section and symbol stubs Must be called only for symbol pointer section and symbol stubs
sections. */ sections. */
@ -3287,22 +3310,11 @@ bfd_mach_o_section_get_nbr_indirect (bfd *abfd, bfd_mach_o_section *sec)
{ {
unsigned int elsz; unsigned int elsz;
switch (sec->flags & BFD_MACH_O_SECTION_TYPE_MASK) elsz = bfd_mach_o_section_get_entry_size (abfd, sec);
{ if (elsz == 0)
case BFD_MACH_O_S_NON_LAZY_SYMBOL_POINTERS: return 0;
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 else
return 0; return sec->size / elsz;
default:
BFD_FAIL ();
return 0;
}
} }
static void static void
@ -3515,6 +3527,8 @@ bfd_mach_o_print_dysymtab (bfd *abfd ATTRIBUTE_UNUSED,
bfd_mach_o_section *sec = mdata->sections[i]; bfd_mach_o_section *sec = mdata->sections[i];
unsigned int j, first, last; unsigned int j, first, last;
bfd_mach_o_symtab_command *symtab = mdata->symtab; bfd_mach_o_symtab_command *symtab = mdata->symtab;
bfd_vma addr;
bfd_vma entry_size;
switch (sec->flags & BFD_MACH_O_SECTION_TYPE_MASK) switch (sec->flags & BFD_MACH_O_SECTION_TYPE_MASK)
{ {
@ -3523,13 +3537,17 @@ bfd_mach_o_print_dysymtab (bfd *abfd ATTRIBUTE_UNUSED,
case BFD_MACH_O_S_SYMBOL_STUBS: case BFD_MACH_O_S_SYMBOL_STUBS:
first = sec->reserved1; first = sec->reserved1;
last = first + bfd_mach_o_section_get_nbr_indirect (abfd, sec); 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", fprintf (file, " for section %s.%s:\n",
sec->segname, sec->sectname); sec->segname, sec->sectname);
for (j = first; j < last; j++) for (j = first; j < last; j++)
{ {
unsigned int isym = dysymtab->indirect_syms[j]; unsigned int isym = dysymtab->indirect_syms[j];
fprintf (file, " %5u: 0x%08x (%u)", j, isym, isym); fprintf (file, " ");
fprintf_vma (file, addr);
fprintf (file, " %5u: 0x%08x", j, isym);
if (isym & BFD_MACH_O_INDIRECT_SYMBOL_LOCAL) if (isym & BFD_MACH_O_INDIRECT_SYMBOL_LOCAL)
fprintf (file, " LOCAL"); fprintf (file, " LOCAL");
if (isym & BFD_MACH_O_INDIRECT_SYMBOL_ABS) if (isym & BFD_MACH_O_INDIRECT_SYMBOL_ABS)
@ -3539,6 +3557,7 @@ bfd_mach_o_print_dysymtab (bfd *abfd ATTRIBUTE_UNUSED,
&& symtab->symbols[isym].symbol.name) && symtab->symbols[isym].symbol.name)
fprintf (file, " %s", symtab->symbols[isym].symbol.name); fprintf (file, " %s", symtab->symbols[isym].symbol.name);
fprintf (file, "\n"); fprintf (file, "\n");
addr += entry_size;
} }
break; break;
default: default:

View File

@ -166,14 +166,17 @@ bfd_mach_o_cpu_subtype;
typedef enum bfd_mach_o_filetype typedef enum bfd_mach_o_filetype
{ {
BFD_MACH_O_MH_OBJECT = 1, BFD_MACH_O_MH_OBJECT = 0x01,
BFD_MACH_O_MH_EXECUTE = 2, BFD_MACH_O_MH_EXECUTE = 0x02,
BFD_MACH_O_MH_FVMLIB = 3, BFD_MACH_O_MH_FVMLIB = 0x03,
BFD_MACH_O_MH_CORE = 4, BFD_MACH_O_MH_CORE = 0x04,
BFD_MACH_O_MH_PRELOAD = 5, BFD_MACH_O_MH_PRELOAD = 0x05,
BFD_MACH_O_MH_DYLIB = 6, BFD_MACH_O_MH_DYLIB = 0x06,
BFD_MACH_O_MH_DYLINKER = 7, BFD_MACH_O_MH_DYLINKER = 0x07,
BFD_MACH_O_MH_BUNDLE = 8 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; bfd_mach_o_filetype;