diff options
-rw-r--r-- | gdb/ChangeLog | 10 | ||||
-rw-r--r-- | gdb/Makefile.in | 4 | ||||
-rw-r--r-- | gdb/arm-tdep.h | 1 | ||||
-rw-r--r-- | gdb/arm-wince-tdep.c | 42 |
4 files changed, 53 insertions, 4 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 2e9817e..1ca6d28 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,13 @@ +2007-09-03 Pedro Alves <pedro_alves@portugalmail.pt> + + * arm-tdep.h (arm_skip_stub): Declare. + * arm-wince-tdep.c: Don't include "solib-svr4.h". Include + "gdbcore.h". + (arm_pe_skip_trampoline_code): New function. + (arm_wince_init_abi): Register arm_pe_skip_trampoline_code as + gdbarch_skip_trampoline_code callback. + * Makefile.in (arm-wince-tdep.o): Update dependencies. + 2007-09-03 Daniel Jacobowitz <dan@codesourcery.com> * MAINTAINERS: Move Fred Fish to Past Maintainers. diff --git a/gdb/Makefile.in b/gdb/Makefile.in index 95e38bf..a8c7d37 100644 --- a/gdb/Makefile.in +++ b/gdb/Makefile.in @@ -1823,8 +1823,8 @@ arm-tdep.o: arm-tdep.c $(defs_h) $(frame_h) $(inferior_h) $(gdbcmd_h) \ $(gdb_assert_h) $(bfd_in2_h) $(libcoff_h) $(objfiles_h) \ $(dwarf2_frame_h) $(gdbtypes_h) $(prologue_value_h) \ $(target_descriptions_h) $(user_regs_h) -arm-wince-tdep.o: arm-wince-tdep.c $(defs_h) $(osabi_h) $(solib_svr4_h) \ - $(target_h) $(gdb_string_h) $(arm_tdep_h) +arm-wince-tdep.o: arm-wince-tdep.c $(defs_h) $(osabi_h) \ + $(gdbcore_h) $(target_h) $(gdb_string_h) $(arm_tdep_h) auxv.o: auxv.c $(defs_h) $(target_h) $(gdbtypes_h) $(command_h) \ $(inferior_h) $(valprint_h) $(gdb_assert_h) $(auxv_h) \ $(elf_common_h) diff --git a/gdb/arm-tdep.h b/gdb/arm-tdep.h index 5ac35ca..5fa8b62 100644 --- a/gdb/arm-tdep.h +++ b/gdb/arm-tdep.h @@ -180,6 +180,7 @@ struct gdbarch_tdep #define LOWEST_PC (gdbarch_tdep (current_gdbarch)->lowest_pc) #endif +CORE_ADDR arm_skip_stub (struct frame_info *, CORE_ADDR); int arm_software_single_step (struct frame_info *); /* Functions exported from armbsd-tdep.h. */ diff --git a/gdb/arm-wince-tdep.c b/gdb/arm-wince-tdep.c index 4235896..dd7e3ef 100644 --- a/gdb/arm-wince-tdep.c +++ b/gdb/arm-wince-tdep.c @@ -20,7 +20,7 @@ #include "defs.h" #include "osabi.h" -#include "solib-svr4.h" +#include "gdbcore.h" #include "target.h" #include "gdb_string.h" @@ -34,6 +34,44 @@ static const char arm_wince_thumb_le_breakpoint[] = { 0xfe, 0xdf }; #define ARM_WINCE_JB_ELEMENT_SIZE INT_REGISTER_SIZE #define ARM_WINCE_JB_PC 10 +static CORE_ADDR +arm_pe_skip_trampoline_code (struct frame_info *frame, CORE_ADDR pc) +{ + ULONGEST indirect; + struct minimal_symbol *indsym; + char *symname; + CORE_ADDR next_pc; + + /* The format of an ARM DLL trampoline is: + ldr ip, [pc] + ldr pc, [ip] + .dw __imp_<func> */ + + if (pc == 0 + || read_memory_unsigned_integer (pc + 0, 4) != 0xe59fc000 + || read_memory_unsigned_integer (pc + 4, 4) != 0xe59cf000) + return 0; + + indirect = read_memory_unsigned_integer (pc + 8, 4); + if (indirect == 0) + return 0; + + indsym = lookup_minimal_symbol_by_pc (indirect); + if (indsym == NULL) + return 0; + + symname = SYMBOL_LINKAGE_NAME (indsym); + if (symname == NULL || strncmp (symname, "__imp_", 6) != 0) + return 0; + + next_pc = read_memory_unsigned_integer (indirect, 4); + if (next_pc != 0) + return next_pc; + + /* Check with the default arm gdbarch_skip_trampoline. */ + return arm_skip_stub (frame, pc); +} + static void arm_wince_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) { @@ -54,7 +92,7 @@ arm_wince_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) set_gdbarch_char_signed (gdbarch, 1); /* Shared library handling. */ - set_gdbarch_skip_trampoline_code (gdbarch, find_solib_trampoline_target); + set_gdbarch_skip_trampoline_code (gdbarch, arm_pe_skip_trampoline_code); /* Single stepping. */ set_gdbarch_software_single_step (gdbarch, arm_software_single_step); |