diff options
author | Tristan Gingold <gingold@adacore.com> | 2009-06-25 12:39:06 +0000 |
---|---|---|
committer | Tristan Gingold <gingold@adacore.com> | 2009-06-25 12:39:06 +0000 |
commit | b32e07d7d744d2acc7fc04d96f2d67eef6f35b87 (patch) | |
tree | 8c7aa39ffc9a6685d9b1e739e4b1aa0606918970 /bfd/mach-o-i386.c | |
parent | c41ba836f2cfd3e9abe2e7b19613eb96e6428feb (diff) | |
download | gdb-b32e07d7d744d2acc7fc04d96f2d67eef6f35b87.zip gdb-b32e07d7d744d2acc7fc04d96f2d67eef6f35b87.tar.gz gdb-b32e07d7d744d2acc7fc04d96f2d67eef6f35b87.tar.bz2 |
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.c | 67 |
1 files changed, 65 insertions, 2 deletions
diff --git a/bfd/mach-o-i386.c b/bfd/mach-o-i386.c index 02e467b..53de64e 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 |