OSDN Git Service

gdb/
authorjkratoch <jkratoch>
Thu, 11 Mar 2010 05:55:41 +0000 (05:55 +0000)
committerjkratoch <jkratoch>
Thu, 11 Mar 2010 05:55:41 +0000 (05:55 +0000)
* solib-svr4.c (svr4_exec_displacement): Return now success, new
parameter displacementp.  Update comment.
(svr4_relocate_main_executable): Return if non-zero SECTION_OFFSETS
element exists.  Return if svr4_exec_displacement was not successful.
Update comment.

gdb/ChangeLog
gdb/solib-svr4.c

index 9085bb4..8186727 100644 (file)
@@ -1,4 +1,12 @@
 2010-03-10  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       * solib-svr4.c (svr4_exec_displacement): Return now success, new
+       parameter displacementp.  Update comment.
+       (svr4_relocate_main_executable): Return if non-zero SECTION_OFFSETS
+       element exists.  Return if svr4_exec_displacement was not successful.
+       Update comment.
+
+2010-03-10  Jan Kratochvil  <jan.kratochvil@redhat.com>
            Daniel Jacobowitz  <dan@codesourcery.com>
 
        * solib-svr4.c (read_program_header): Support type == -1 to read
index 2ae9b50..d10a209 100644 (file)
@@ -1659,7 +1659,10 @@ read_program_headers_from_bfd (bfd *abfd, int *phdrs_size)
   return buf;
 }
 
-/* We relocate all of the sections by the same amount.  This
+/* Return 1 and fill *DISPLACEMENTP with detected PIE offset of inferior
+   exec_bfd.  Otherwise return 0.
+
+   We relocate all of the sections by the same amount.  This
    behavior is mandated by recent editions of the System V ABI. 
    According to the System V Application Binary Interface,
    Edition 4.1, page 5-5:
@@ -1699,8 +1702,8 @@ read_program_headers_from_bfd (bfd *abfd, int *phdrs_size)
      should either be removed or modified to accomodate the new file
      type.  - Kevin, Nov 2000. ]  */
 
-static CORE_ADDR
-svr4_exec_displacement (void)
+static int
+svr4_exec_displacement (CORE_ADDR *displacementp)
 {
   /* ENTRY_POINT is a possible function descriptor - before
      a call to gdbarch_convert_from_func_ptr_addr.  */
@@ -1764,7 +1767,8 @@ svr4_exec_displacement (void)
        return 0;
     }
 
-  return displacement;
+  *displacementp = displacement;
+  return 1;
 }
 
 /* Relocate the main executable.  This function should be called upon
@@ -1775,11 +1779,25 @@ svr4_exec_displacement (void)
 static void
 svr4_relocate_main_executable (void)
 {
-  CORE_ADDR displacement = svr4_exec_displacement ();
+  CORE_ADDR displacement;
+
+  if (symfile_objfile)
+    {
+      int i;
+
+      /* Remote target may have already set specific offsets by `qOffsets'
+        which should be preferred.  */
+
+      for (i = 0; i < symfile_objfile->num_sections; i++)
+       if (ANOFFSET (symfile_objfile->section_offsets, i) != 0)
+         return;
+    }
+
+  if (! svr4_exec_displacement (&displacement))
+    return;
 
-  /* Even if DISPLACEMENT is 0 still try to relocate it as this is a new
-     difference of in-memory vs. in-file addresses and we could already
-     relocate the executable at this function to improper address before.  */
+  /* Even DISPLACEMENT 0 is a valid new difference of in-memory vs. in-file
+     addresses.  */
 
   if (symfile_objfile)
     {