Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Tom Tromey <tromey@redhat.com>
To: gdb-patches@sourceware.org
Cc: Tom Tromey <tromey@redhat.com>
Subject: [PATCH 2/3] relocate the entry point addess when used
Date: Mon, 06 Jan 2014 20:30:00 -0000	[thread overview]
Message-ID: <1389040247-2620-3-git-send-email-tromey@redhat.com> (raw)
In-Reply-To: <1389040247-2620-1-git-send-email-tromey@redhat.com>

This changes the entry point to be unrelocated in the objfile, and
instead applies the relocation when it is used.

I think the existing code here is wrong.  It computes the entry point
address directly from the BFD, not applying any runtime offsets.
However, then objfile_relocate1 passes this address to find_pc_section
-- which does use the offsets .  So, it seems to me that the current
code can only find the correct address by luck.

2014-01-06  Tom Tromey  <tromey@redhat.com>

	* objfiles.c (entry_point_address_query): Relocate entry point
	address.
	(objfile_relocate1): Do not relocate entry point address.
	* objfiles.h (struct entry_info) <entry_point>: Update comment.
	<the_bfd_section_index>: New field.
	* symfile.c (init_entry_point_info): Find the entry point's
	section.
---
 gdb/ChangeLog  | 10 ++++++++++
 gdb/objfiles.c | 20 +++-----------------
 gdb/objfiles.h |  5 ++++-
 gdb/symfile.c  | 18 ++++++++++++++++++
 4 files changed, 35 insertions(+), 18 deletions(-)

diff --git a/gdb/objfiles.c b/gdb/objfiles.c
index 73847bd..2604ae4 100644
--- a/gdb/objfiles.c
+++ b/gdb/objfiles.c
@@ -367,7 +367,9 @@ entry_point_address_query (CORE_ADDR *entry_p)
   if (symfile_objfile == NULL || !symfile_objfile->ei.entry_point_p)
     return 0;
 
-  *entry_p = symfile_objfile->ei.entry_point;
+  *entry_p = (symfile_objfile->ei.entry_point
+	      + ANOFFSET (symfile_objfile->section_offsets,
+			  symfile_objfile->ei.the_bfd_section_index));
 
   return 1;
 }
@@ -794,22 +796,6 @@ objfile_relocate1 (struct objfile *objfile,
      to be out of order.  */
   msymbols_sort (objfile);
 
-  if (objfile->ei.entry_point_p)
-    {
-      /* Relocate ei.entry_point with its section offset, use SECT_OFF_TEXT
-	 only as a fallback.  */
-      struct obj_section *s;
-      s = find_pc_section (objfile->ei.entry_point);
-      if (s)
-	{
-	  int idx = gdb_bfd_section_index (objfile->obfd, s->the_bfd_section);
-
-	  objfile->ei.entry_point += ANOFFSET (delta, idx);
-	}
-      else
-        objfile->ei.entry_point += ANOFFSET (delta, SECT_OFF_TEXT (objfile));
-    }
-
   {
     int i;
 
diff --git a/gdb/objfiles.h b/gdb/objfiles.h
index c2b6177..620d7e8 100644
--- a/gdb/objfiles.h
+++ b/gdb/objfiles.h
@@ -101,9 +101,12 @@ struct objfile_data;
 
 struct entry_info
   {
-    /* The relocated value we should use for this objfile entry point.  */
+    /* The unrelocated value we should use for this objfile entry point.  */
     CORE_ADDR entry_point;
 
+    /* The index of the section in which the entry point appears.  */
+    int the_bfd_section_index;
+
     /* Set to 1 iff ENTRY_POINT contains a valid value.  */
     unsigned entry_point_p : 1;
   };
diff --git a/gdb/symfile.c b/gdb/symfile.c
index 4f0fea8..a0ff9db 100644
--- a/gdb/symfile.c
+++ b/gdb/symfile.c
@@ -895,6 +895,7 @@ init_entry_point_info (struct objfile *objfile)
 
   if (objfile->ei.entry_point_p)
     {
+      struct obj_section *osect;
       CORE_ADDR entry_point =  objfile->ei.entry_point;
 
       /* Make certain that the address points at real code, and not a
@@ -908,6 +909,23 @@ init_entry_point_info (struct objfile *objfile)
 	 symbol table.  */
       objfile->ei.entry_point
 	= gdbarch_addr_bits_remove (get_objfile_arch (objfile), entry_point);
+
+      ALL_OBJFILE_OSECTIONS (objfile, osect)
+	{
+	  struct bfd_section *sect = osect->the_bfd_section;
+
+	  if (entry_point >= bfd_get_section_vma (objfile->obfd, sect)
+	      && entry_point < (bfd_get_section_vma (objfile->obfd, sect)
+				+ bfd_get_section_size (sect)))
+	    {
+	      objfile->ei.the_bfd_section_index
+		= gdb_bfd_section_index (objfile->obfd, sect);
+	      break;
+	    }
+	}
+
+      if (osect == NULL)
+	objfile->ei.the_bfd_section_index = SECT_OFF_TEXT (objfile);
     }
 }
 
-- 
1.8.1.4


  parent reply	other threads:[~2014-01-06 20:30 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-01-06 20:30 [PATCH 0/3] move entry point info to the per-BFD object Tom Tromey
2014-01-06 20:30 ` [PATCH 1/3] change solib-frv to use entry_point_address_query Tom Tromey
2014-01-08 13:23   ` Pedro Alves
2014-01-06 20:30 ` [PATCH 3/3] move the entry point info into the per-bfd object Tom Tromey
2014-01-08 13:30   ` Pedro Alves
2014-01-13 20:51     ` Tom Tromey
2014-01-06 20:30 ` Tom Tromey [this message]
2014-01-08 13:22   ` [PATCH 2/3] relocate the entry point addess when used Pedro Alves
2014-01-13 20:46     ` Tom Tromey
2014-01-15 11:42       ` Pedro Alves
2014-01-15 17:59         ` Tom Tromey
2014-01-15 18:02           ` Pedro Alves
2014-01-15 18:01 ` [PATCH 0/3] move entry point info to the per-BFD object Tom Tromey

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=1389040247-2620-3-git-send-email-tromey@redhat.com \
    --to=tromey@redhat.com \
    --cc=gdb-patches@sourceware.org \
    /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