From: Jim Blandy <jimb@redhat.com>
To: gdb-patches@sources.redhat.com
Subject: [ppc64-linux] gdbarch hook to find true execution entry point
Date: Wed, 11 Jun 2003 13:21:00 -0000 [thread overview]
Message-ID: <vt24r2wu4ty.fsf@zenia.home> (raw)
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.
Index: gdb/gdbarch.sh
===================================================================
RCS file: /cvs/src/src/gdb/gdbarch.sh,v
retrieving revision 1.237
diff -c -r1.237 gdbarch.sh
*** gdb/gdbarch.sh 17 May 2003 05:59:58 -0000 1.237
--- gdb/gdbarch.sh 11 Jun 2003 13:16:31 -0000
***************
*** 654,659 ****
--- 654,664 ----
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
Index: gdb/arch-utils.c
===================================================================
RCS file: /cvs/src/src/gdb/arch-utils.c,v
retrieving revision 1.83.4.1
diff -c -r1.83.4.1 arch-utils.c
*** gdb/arch-utils.c 11 Jun 2003 06:40:14 -0000 1.83.4.1
--- gdb/arch-utils.c 11 Jun 2003 13:16:26 -0000
***************
*** 375,380 ****
--- 375,386 ----
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. */
Index: gdb/arch-utils.h
===================================================================
RCS file: /cvs/src/src/gdb/arch-utils.h,v
retrieving revision 1.46.4.1
diff -c -r1.46.4.1 arch-utils.h
*** gdb/arch-utils.h 11 Jun 2003 06:40:14 -0000 1.46.4.1
--- gdb/arch-utils.h 11 Jun 2003 13:16:26 -0000
***************
*** 89,94 ****
--- 89,98 ----
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. */
Index: gdb/gdbarch.c
===================================================================
RCS file: /cvs/src/src/gdb/gdbarch.c,v
retrieving revision 1.216
diff -c -r1.216 gdbarch.c
*** gdb/gdbarch.c 17 May 2003 05:59:58 -0000 1.216
--- gdb/gdbarch.c 11 Jun 2003 13:16:28 -0000
***************
*** 263,268 ****
--- 263,269 ----
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,434 ****
--- 430,436 ----
0,
0,
0,
+ generic_bfd_entry_point,
0,
0,
0,
***************
*** 555,560 ****
--- 557,563 ----
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,750 ****
--- 748,754 ----
/* 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,793 ****
--- 792,801 ----
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)
***************
*** 5330,5335 ****
--- 5338,5362 ----
gdbarch_skip_trampoline_code_ftype skip_trampoline_code)
{
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
Index: gdb/gdbarch.h
===================================================================
RCS file: /cvs/src/src/gdb/gdbarch.h,v
retrieving revision 1.185
diff -c -r1.185 gdbarch.h
*** gdb/gdbarch.h 17 May 2003 05:59:58 -0000 1.185
--- gdb/gdbarch.h 11 Jun 2003 13:16:29 -0000
***************
*** 2831,2836 ****
--- 2831,2845 ----
#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. */
Index: gdb/solib-svr4.c
===================================================================
RCS file: /cvs/src/src/gdb/solib-svr4.c,v
retrieving revision 1.32.8.2
diff -c -r1.32.8.2 solib-svr4.c
*** gdb/solib-svr4.c 11 Jun 2003 13:00:34 -0000 1.32.8.2
--- gdb/solib-svr4.c 11 Jun 2003 13:16:32 -0000
***************
*** 1022,1028 ****
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;
/* Record the relocated start and end address of the dynamic linker
text and plt section for svr4_in_dynsym_resolve_code. */
--- 1022,1029 ----
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 ()
! - 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. */
next reply other threads:[~2003-06-11 13:21 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2003-06-11 13:21 Jim Blandy [this message]
2003-06-11 13:26 ` Andrew Cagney
2003-06-11 13:48 ` Andrew Cagney
2003-06-12 20:59 ` Jim Blandy
2003-06-12 22:25 ` Andrew Cagney
2003-06-11 23:11 ` Kevin Buettner
2003-06-13 22:31 ` Jim Blandy
2003-06-13 22:48 ` Kevin Buettner
2003-06-13 23:38 ` Andrew Cagney
2003-06-27 18:46 ` Andrew Cagney
2003-06-30 22:52 ` Jim Blandy
2003-07-01 22:53 ` Andrew Cagney
2003-08-28 22:48 ` Andrew Cagney
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=vt24r2wu4ty.fsf@zenia.home \
--to=jimb@redhat.com \
--cc=gdb-patches@sources.redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox