summaryrefslogtreecommitdiff
path: root/bfd/mach-o-i386.c
diff options
context:
space:
mode:
authorTristan Gingold <gingold@adacore.com>2009-06-25 12:39:06 +0000
committerTristan Gingold <gingold@adacore.com>2009-06-25 12:39:06 +0000
commit4a23cd5fd8773c54e8e0ae3b5aa14a2a84b01b08 (patch)
treeef65a5221476e2ab3f3751c8112a0d13eb8db50c /bfd/mach-o-i386.c
parent14798489afb6560d94c0c438b641544628da72a8 (diff)
downloadbinutils-redhat-4a23cd5fd8773c54e8e0ae3b5aa14a2a84b01b08.tar.gz
2009-06-25 Tristan Gingold <gingold@adacore.com>
* mach-o-target.c (bfd_mach_o_get_dynamic_symtab_upper_bound) (bfd_mach_o_canonicalize_dynamic_symtab) (bfd_mach_o_get_synthetic_symtab): Defines. (TARGET_NAME_BACKEND): Add bfd_mach_o_print_thread entry. (TARGET_NAME): Use Mach-O specific functions for dynamic. * mach-o-i386.c (bfd_mach_o_i386_swap_reloc_in): Fix howto indexes for scattered relocations. (bfd_mach_o_i386_print_thread): New function. (bfd_mach_o_print_thread): Define. * mach-o.c (text_section_names_xlat): Add an entry for __const. (bfd_mach_o_canonicalize_one_reloc, bfd_mach_o_canonicalize_relocs): New functions extracted from ... (bfd_mach_o_canonicalize_reloc): ... This. Simplified. (bfd_mach_o_get_dynamic_reloc_upper_bound): New function. (bfd_mach_o_canonicalize_dynamic_reloc): New function. (bfd_mach_o_i386_flavour_string): Adjusted after enum renaming. (bfd_mach_o_ppc_flavour_string): Reindentation. Add 64 bits cases. (bfd_mach_o_scan_read_dylinker): Do not create a section anymore. Set name_str field. (bfd_mach_o_scan_read_dylib): Ditto. (bfd_mach_o_scan_read_thread): Set mdata at declaration. Add comments, reindent. (bfd_mach_o_scan_read_dysymtab): Set mdata at declaration. Correctly decode isym and flags on little endian targets. Set dysymtab field. (bfd_mach_o_scan_start_address): Adjust for enum names. (bfd_mach_o_lookup_section): Do not look for segments anymore. (bfd_mach_o_print_section): Display bfd section name. (bfd_mach_o_print_segment): Display none if no name. (bfd_mach_o_print_dysymtab): Display next index for local, external and undefined symbols. (bfd_mach_o_bfd_print_private_bfd_data): Adjust code by using name_str. Display dylinker name. Display thread and unixthread commands content. (bfd_mach_o_print_thread): New macro. * mach-o.h (bfd_mach_o_mach_header_magic): Align numbers. (bfd_mach_o_ppc_thread_flavour): Ditto. (bfd_mach_o_i386_thread_flavour): Ditto. (BFD_MACH_O_PPC_THREAD_STATE_NONE): New enum. (BFD_MACH_O_x86_THREAD_STATE_NONE): Replaces BFD_MACH_O_THREAD_STATE_NONE. (bfd_mach_o_segment_command): Remove segment field. (bfd_mach_o_thread_flavour): Field offset is now unsigned long. (bfd_mach_o_dylinker_command): Remove section field, add name_str. (bfd_mach_o_prebound_dylib_command): Ditto. (bfd_mach_o_dylib_command): Ditto. (bfd_mach_o_prebound_dylib_command): Remove section field. (mach_o_data_struct): Add dysymtab field. (bfd_mach_o_backend_data): Add _bfd_mach_o_print_thread field. (bfd_mach_o_get_reloc_upper_bound, bfd_mach_o_canonicalize_reloc) (bfd_mach_o_build_commands): Remove parameter names and attributes. (bfd_mach_o_get_dynamic_reloc_upper_bound) (bfd_mach_o_canonicalize_dynamic_reloc): New prototypes.
Diffstat (limited to 'bfd/mach-o-i386.c')
-rw-r--r--bfd/mach-o-i386.c67
1 files changed, 65 insertions, 2 deletions
diff --git a/bfd/mach-o-i386.c b/bfd/mach-o-i386.c
index 02e467bfa9..53de64e826 100644
--- a/bfd/mach-o-i386.c
+++ b/bfd/mach-o-i386.c
@@ -102,14 +102,14 @@ bfd_mach_o_i386_swap_reloc_in (arelent *res, bfd_mach_o_reloc_info *reloc)
case BFD_MACH_O_GENERIC_RELOC_PAIR:
if (reloc->r_length != 2)
return FALSE;
- res->howto = &i386_howto_table[3];
+ res->howto = &i386_howto_table[6];
res->address = res[-1].address;
return TRUE;
case BFD_MACH_O_GENERIC_RELOC_SECTDIFF:
case BFD_MACH_O_GENERIC_RELOC_LOCAL_SECTDIFF:
if (reloc->r_length != 2)
return FALSE;
- res->howto = &i386_howto_table[2];
+ res->howto = &i386_howto_table[5];
return TRUE;
default:
return FALSE;
@@ -217,8 +217,71 @@ bfd_mach_o_i386_bfd_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
return NULL;
}
+static bfd_boolean
+bfd_mach_o_i386_print_thread (bfd *abfd, bfd_mach_o_thread_flavour *thread,
+ void *vfile, char *buf)
+{
+ FILE *file = (FILE *)vfile;
+
+ switch (thread->flavour)
+ {
+ case BFD_MACH_O_x86_THREAD_STATE:
+ if (thread->size < (8 + 16 * 4))
+ return FALSE;
+ fprintf (file, " x86_THREAD_STATE:\n");
+ fprintf (file, " flavor: 0x%08lx count: 0x%08lx\n",
+ (unsigned long)bfd_get_32 (abfd, buf + 0),
+ (unsigned long)bfd_get_32 (abfd, buf + 4));
+ fprintf (file, " eax: %08lx ebx: %08lx ecx: %08lx edx: %08lx\n",
+ (unsigned long)bfd_get_32 (abfd, buf + 8),
+ (unsigned long)bfd_get_32 (abfd, buf + 12),
+ (unsigned long)bfd_get_32 (abfd, buf + 16),
+ (unsigned long)bfd_get_32 (abfd, buf + 20));
+ fprintf (file, " edi: %08lx esi: %08lx ebp: %08lx esp: %08lx\n",
+ (unsigned long)bfd_get_32 (abfd, buf + 24),
+ (unsigned long)bfd_get_32 (abfd, buf + 28),
+ (unsigned long)bfd_get_32 (abfd, buf + 32),
+ (unsigned long)bfd_get_32 (abfd, buf + 36));
+ fprintf (file, " ss: %08lx flg: %08lx eip: %08lx cs: %08lx\n",
+ (unsigned long)bfd_get_32 (abfd, buf + 40),
+ (unsigned long)bfd_get_32 (abfd, buf + 44),
+ (unsigned long)bfd_get_32 (abfd, buf + 48),
+ (unsigned long)bfd_get_32 (abfd, buf + 52));
+ fprintf (file, " ds: %08lx es: %08lx fs: %08lx gs: %08lx\n",
+ (unsigned long)bfd_get_32 (abfd, buf + 56),
+ (unsigned long)bfd_get_32 (abfd, buf + 60),
+ (unsigned long)bfd_get_32 (abfd, buf + 64),
+ (unsigned long)bfd_get_32 (abfd, buf + 68));
+ return TRUE;
+ case BFD_MACH_O_x86_FLOAT_STATE:
+ if (thread->size < 8)
+ return FALSE;
+ fprintf (file, " x86_FLOAT_STATE:\n");
+ fprintf (file, " flavor: 0x%08lx count: 0x%08lx\n",
+ (unsigned long)bfd_get_32 (abfd, buf + 0),
+ (unsigned long)bfd_get_32 (abfd, buf + 4));
+ return TRUE;
+ case BFD_MACH_O_x86_EXCEPTION_STATE:
+ if (thread->size < 8 + 3 * 4)
+ return FALSE;
+ fprintf (file, " x86_EXCEPTION_STATE:\n");
+ fprintf (file, " flavor: 0x%08lx count: 0x%08lx\n",
+ (unsigned long)bfd_get_32 (abfd, buf + 0),
+ (unsigned long)bfd_get_32 (abfd, buf + 4));
+ fprintf (file, " trapno: %08lx err: %08lx faultaddr: %08lx\n",
+ (unsigned long)bfd_get_32 (abfd, buf + 8),
+ (unsigned long)bfd_get_32 (abfd, buf + 12),
+ (unsigned long)bfd_get_32 (abfd, buf + 16));
+ return TRUE;
+ default:
+ break;
+ }
+ return FALSE;
+}
+
#define bfd_mach_o_swap_reloc_in bfd_mach_o_i386_swap_reloc_in
#define bfd_mach_o_swap_reloc_out bfd_mach_o_i386_swap_reloc_out
+#define bfd_mach_o_print_thread bfd_mach_o_i386_print_thread
#define bfd_mach_o_bfd_reloc_type_lookup bfd_mach_o_i386_bfd_reloc_type_lookup
#define bfd_mach_o_bfd_reloc_name_lookup bfd_mach_o_i386_bfd_reloc_name_lookup