diff options
-rw-r--r-- | gdb/ChangeLog | 7 | ||||
-rw-r--r-- | gdb/arch-utils.c | 6 | ||||
-rw-r--r-- | gdb/arch-utils.h | 4 | ||||
-rw-r--r-- | gdb/gdbarch.c | 27 | ||||
-rw-r--r-- | gdb/gdbarch.h | 9 | ||||
-rwxr-xr-x | gdb/gdbarch.sh | 5 | ||||
-rw-r--r-- | gdb/solib-svr4.c | 3 |
7 files changed, 60 insertions, 1 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 8d013620ada..eab6e25dcb5 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,12 @@ 2003-06-11 Jim Blandy <jimb@redhat.com> + * gdbarch.sh (gdbarch_bfd_entry_point): New gdbarch method. + * arch-utils.c (generic_bfd_entry_point): New function. + * arch-utils.h (generic_bfd_entry_point): New declaration. + * gdbarch.c, gdbarch.h: Regenerated. + * solib-svr4.c (enable_break): Call it, instead of accessing + tmp_bfd->start_address directly. + * solib-svr4.c (solib_break_names): Recognize the 64-bit PowerPC Linux entry point symbols for _dl_debug_state, too. diff --git a/gdb/arch-utils.c b/gdb/arch-utils.c index bdf370b0003..8d31ffe41de 100644 --- a/gdb/arch-utils.c +++ b/gdb/arch-utils.c @@ -375,6 +375,12 @@ cannot_register_not (int regnum) return 0; } +CORE_ADDR +generic_bfd_entry_point (struct gdbarch *gdbarch, bfd *abfd) +{ + return bfd_get_start_address (abfd); +} + /* Legacy version of target_virtual_frame_pointer(). Assumes that there is an DEPRECATED_FP_REGNUM and that it is the same, cooked or raw. */ diff --git a/gdb/arch-utils.h b/gdb/arch-utils.h index 733bb3e866d..f62fa97df62 100644 --- a/gdb/arch-utils.h +++ b/gdb/arch-utils.h @@ -89,6 +89,10 @@ extern const struct floatformat *default_double_format (struct gdbarch *gdbarch) being passed */ extern int frame_num_args_unknown (struct frame_info *fi); +/* Return the start address of ABFD. This is exactly like + bfd_get_start_address, except that it's a gdbarch function. */ +extern CORE_ADDR generic_bfd_entry_point (struct gdbarch *gdbarch, bfd *abfd); + /* The following DEPRECATED interfaces are for pre- multi-arch legacy targets. */ diff --git a/gdb/gdbarch.c b/gdb/gdbarch.c index 976ce59ae13..5c853361f1e 100644 --- a/gdb/gdbarch.c +++ b/gdb/gdbarch.c @@ -263,6 +263,7 @@ struct gdbarch gdbarch_software_single_step_ftype *software_single_step; gdbarch_print_insn_ftype *print_insn; gdbarch_skip_trampoline_code_ftype *skip_trampoline_code; + gdbarch_bfd_entry_point_ftype *bfd_entry_point; gdbarch_in_solib_call_trampoline_ftype *in_solib_call_trampoline; gdbarch_in_solib_return_trampoline_ftype *in_solib_return_trampoline; gdbarch_pc_in_sigtramp_ftype *pc_in_sigtramp; @@ -429,6 +430,7 @@ struct gdbarch startup_gdbarch = 0, 0, 0, + generic_bfd_entry_point, 0, 0, 0, @@ -555,6 +557,7 @@ gdbarch_alloc (const struct gdbarch_info *info, current_gdbarch->smash_text_address = core_addr_identity; current_gdbarch->print_insn = legacy_print_insn; current_gdbarch->skip_trampoline_code = generic_skip_trampoline_code; + current_gdbarch->bfd_entry_point = generic_bfd_entry_point; current_gdbarch->in_solib_call_trampoline = generic_in_solib_call_trampoline; current_gdbarch->in_solib_return_trampoline = generic_in_solib_return_trampoline; current_gdbarch->pc_in_sigtramp = legacy_pc_in_sigtramp; @@ -745,6 +748,7 @@ verify_gdbarch (struct gdbarch *gdbarch) /* Skip verify of software_single_step, has predicate */ /* Skip verify of print_insn, invalid_p == 0 */ /* Skip verify of skip_trampoline_code, invalid_p == 0 */ + /* Skip verify of bfd_entry_point, invalid_p == 0 */ /* Skip verify of in_solib_call_trampoline, invalid_p == 0 */ /* Skip verify of in_solib_return_trampoline, invalid_p == 0 */ /* Skip verify of pc_in_sigtramp, invalid_p == 0 */ @@ -788,6 +792,10 @@ gdbarch_dump (struct gdbarch *gdbarch, struct ui_file *file) GDB_MULTI_ARCH); if (GDB_MULTI_ARCH) fprintf_unfiltered (file, + "gdbarch_dump: bfd_entry_point = 0x%08lx\n", + (long) current_gdbarch->bfd_entry_point); + if (GDB_MULTI_ARCH) + fprintf_unfiltered (file, "gdbarch_dump: gdbarch_frame_align_p() = %d\n", gdbarch_frame_align_p (current_gdbarch)); if (GDB_MULTI_ARCH) @@ -5332,6 +5340,25 @@ set_gdbarch_skip_trampoline_code (struct gdbarch *gdbarch, gdbarch->skip_trampoline_code = skip_trampoline_code; } +CORE_ADDR +gdbarch_bfd_entry_point (struct gdbarch *gdbarch, bfd *abfd) +{ + gdb_assert (gdbarch != NULL); + if (gdbarch->bfd_entry_point == 0) + internal_error (__FILE__, __LINE__, + "gdbarch: gdbarch_bfd_entry_point invalid"); + if (gdbarch_debug >= 2) + fprintf_unfiltered (gdb_stdlog, "gdbarch_bfd_entry_point called\n"); + return gdbarch->bfd_entry_point (gdbarch, abfd); +} + +void +set_gdbarch_bfd_entry_point (struct gdbarch *gdbarch, + gdbarch_bfd_entry_point_ftype bfd_entry_point) +{ + gdbarch->bfd_entry_point = bfd_entry_point; +} + int gdbarch_in_solib_call_trampoline (struct gdbarch *gdbarch, CORE_ADDR pc, char *name) { diff --git a/gdb/gdbarch.h b/gdb/gdbarch.h index e80836f2a33..c97f796d637 100644 --- a/gdb/gdbarch.h +++ b/gdb/gdbarch.h @@ -2831,6 +2831,15 @@ extern void set_gdbarch_skip_trampoline_code (struct gdbarch *gdbarch, gdbarch_s #endif #endif +/* The actual code address at which ABFD would begin execution. Note + that on some architectures (like 64-bit PowerPC Linux), + bfd_get_start_address actually points to a function descriptor, not + the start function's entry point itself. */ + +typedef CORE_ADDR (gdbarch_bfd_entry_point_ftype) (struct gdbarch *gdbarch, bfd *abfd); +extern CORE_ADDR gdbarch_bfd_entry_point (struct gdbarch *gdbarch, bfd *abfd); +extern void set_gdbarch_bfd_entry_point (struct gdbarch *gdbarch, gdbarch_bfd_entry_point_ftype *bfd_entry_point); + /* For SVR4 shared libraries, each call goes through a small piece of trampoline code in the ".plt" section. IN_SOLIB_CALL_TRAMPOLINE evaluates to nonzero if we are currently stopped in one of these. */ diff --git a/gdb/gdbarch.sh b/gdb/gdbarch.sh index f6106e4f372..681d7e9c213 100755 --- a/gdb/gdbarch.sh +++ b/gdb/gdbarch.sh @@ -654,6 +654,11 @@ F:2:SOFTWARE_SINGLE_STEP:void:software_single_step:enum target_signal sig, int i f:2:TARGET_PRINT_INSN:int:print_insn:bfd_vma vma, disassemble_info *info:vma, info:::legacy_print_insn::0 f:2:SKIP_TRAMPOLINE_CODE:CORE_ADDR:skip_trampoline_code:CORE_ADDR pc:pc:::generic_skip_trampoline_code::0 +# The actual code address at which ABFD would begin execution. Note +# that on some architectures (like 64-bit PowerPC Linux), +# bfd_get_start_address actually points to a function descriptor, not +# the start function's entry point itself. +m:1::CORE_ADDR:bfd_entry_point:bfd *abfd:abfd:::generic_bfd_entry_point::0 # For SVR4 shared libraries, each call goes through a small piece of # trampoline code in the ".plt" section. IN_SOLIB_CALL_TRAMPOLINE evaluates diff --git a/gdb/solib-svr4.c b/gdb/solib-svr4.c index 7b0abfd0113..0f4542b6d93 100644 --- a/gdb/solib-svr4.c +++ b/gdb/solib-svr4.c @@ -1022,7 +1022,8 @@ enable_break (void) the current pc (which should point at the entry point for the dynamic linker) and subtracting the offset of the entry point. */ if (!load_addr_found) - load_addr = read_pc () - tmp_bfd->start_address; + load_addr = (read_pc () + - generic_bfd_entry_point (current_gdbarch, tmp_bfd)); /* Record the relocated start and end address of the dynamic linker text and plt section for svr4_in_dynsym_resolve_code. */ |