public inbox for gdb-patches@sourceware.org
 help / color / mirror / Atom feed
* [patch] svr4_exec_displacement success indicator  [Re: PIE question]
       [not found] ` <20100308213744.GA16628@host0.dyn.jankratochvil.net>
@ 2010-03-08 21:54   ` Jan Kratochvil
  2010-03-08 21:59     ` Daniel Jacobowitz
  2010-03-25 22:44     ` [patch] PIE: Fix back re-run [Re: [patch] svr4_exec_displacement success indicator] Jan Kratochvil
  0 siblings, 2 replies; 9+ messages in thread
From: Jan Kratochvil @ 2010-03-08 21:54 UTC (permalink / raw)
  To: gdb-patches

[repost to <gdb-patches@sourceware.org>]

On Sun, 07 Mar 2010 01:53:29 +0100, Daniel Jacobowitz wrote:
> Jan, could you explain a little how the situation in this comment can
> happen?
> 
> static void
> svr4_relocate_main_executable (void)
> {
>   CORE_ADDR displacement = svr4_exec_displacement ();
> 
>   /* 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.  */

OK, no longer valid with current state of sources, going to post a separate
cleanup patch (later after some verifications) so that
svr4_relocate_main_executable gets called only once.

Some history:
------------------------------------------------------------------------------
svr4_exec_displacement behavior was considered a bit magic as it could
(a) depend on svr4_static_exec_displacement returning something I did not
    understand; to be removed by pending:
      Re: RFC: Verify AT_ENTRY before using it
      http://sourceware.org/ml/gdb-patches/2010-03/msg00030.html
(b) auxv read by ld_so_xfer_auxv resolving relocatable symbol "_dl_auxv" which
    brings some chicken-and-egg problems.
    But ld_so_xfer_auxv is used only if ATTACH_FLAG and in such case
    svr4_relocate_main_executable was called only once.
(c) I was trying to get valgrind-executed-PIE working and thought enough steps
    of investigating inferior would fix it.  There is currently no way to get
    valgrind-executed-PIE working (in general case), filed RFE for valgrind:
      valgrind: --db-command should support %{auxv address}
      http://bugs.kde.org/show_bug.cgi?id=223702
------------------------------------------------------------------------------


> I came across this because our local ARM uClinux incorrectly links in
> solib-svr4.c.  The remote target sends qOffsets, uses the result to
> relocate the objfile, and then this code overrides that.

I did not expect symfile_objfile can be already relocated before.

Attached these changes:

* svr4_exec_displacement calling convention should have success indicator.

* Preserving now section_offsets if they are already set, inspired by
  init_objfile_sect_indices.

I believe either of parts would be sufficient for this problem.


> I don't think this is related to our other discussion about executable
> relocation; I haven't forgotten, I'll get back to you as soon as I can.

I agree but technically these two new patches depend on those previous ones.
      Re: RFC: Verify AT_ENTRY before using it
      http://sourceware.org/ml/gdb-patches/2010-03/msg00030.html
      [patch-testcase] Re: RFC: Verify AT_ENTRY before using it
      http://sourceware.org/ml/gdb-patches/2010-03/msg00033.html


No regressions on {x86_64,x86_64-m32,i686}-fedora12-linux-gnu although with
/-fPIE/-pie board it is not clear to me.  Debugging some more PIE
incompletenesses (such as unrelocated ei.entry_point in some cases).

OK to check-in?


Thanks,
Jan


2010-03-07  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.

--- a/gdb/solib-svr4.c
+++ b/gdb/solib-svr4.c
@@ -1652,7 +1651,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:
@@ -1692,8 +1694,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.  */
@@ -1785,7 +1787,8 @@ svr4_exec_displacement (void)
 	       bfd_get_filename (exec_bfd));
     }
 
-  return displacement;
+  *displacementp = displacement;
+  return 1;
 }
 
 /* Relocate the main executable.  This function should be called upon
@@ -1796,11 +1799,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)
     {

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [patch] svr4_exec_displacement success indicator  [Re: PIE  question]
  2010-03-08 21:54   ` [patch] svr4_exec_displacement success indicator [Re: PIE question] Jan Kratochvil
@ 2010-03-08 21:59     ` Daniel Jacobowitz
  2010-03-10 21:01       ` Jan Kratochvil
  2010-03-12 15:31       ` Jan Kratochvil
  2010-03-25 22:44     ` [patch] PIE: Fix back re-run [Re: [patch] svr4_exec_displacement success indicator] Jan Kratochvil
  1 sibling, 2 replies; 9+ messages in thread
From: Daniel Jacobowitz @ 2010-03-08 21:59 UTC (permalink / raw)
  To: gdb-patches

On Mon, Mar 08, 2010 at 10:53:58PM +0100, Jan Kratochvil wrote:
> OK to check-in?

Yes, these are OK.  [Sorry, should have checked this folder first.]

-- 
Daniel Jacobowitz
CodeSourcery

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [patch] svr4_exec_displacement success indicator  [Re: PIE   question]
  2010-03-08 21:59     ` Daniel Jacobowitz
@ 2010-03-10 21:01       ` Jan Kratochvil
  2010-03-12 15:31       ` Jan Kratochvil
  1 sibling, 0 replies; 9+ messages in thread
From: Jan Kratochvil @ 2010-03-10 21:01 UTC (permalink / raw)
  To: gdb-patches

On Mon, 08 Mar 2010 22:59:13 +0100, Daniel Jacobowitz wrote:
> Yes, these are OK.  [Sorry, should have checked this folder first.]

Checked-in:
	http://sourceware.org/ml/gdb-cvs/2010-03/msg00097.html

This is a duplicate mail to <gdb@sourceware.org> one:
	http://sourceware.org/ml/gdb/2010-03/msg00069.html


Thanks,
Jan

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [patch] svr4_exec_displacement success indicator  [Re: PIE  question]
  2010-03-08 21:59     ` Daniel Jacobowitz
  2010-03-10 21:01       ` Jan Kratochvil
@ 2010-03-12 15:31       ` Jan Kratochvil
  2010-03-12 15:39         ` Daniel Jacobowitz
  1 sibling, 1 reply; 9+ messages in thread
From: Jan Kratochvil @ 2010-03-12 15:31 UTC (permalink / raw)
  To: gdb-patches; +Cc: Daniel Jacobowitz

On Mon, 08 Mar 2010 22:59:13 +0100, Daniel Jacobowitz wrote:
> On Mon, Mar 08, 2010 at 10:53:58PM +0100, Jan Kratochvil wrote:
> > OK to check-in?
> 
> Yes, these are OK.  [Sorry, should have checked this folder first.]

-> http://sourceware.org/ml/gdb-cvs/2010-03/msg00097.html
#  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.


Is it OK also for gdb_7_1-branch?

Otherwise the minimized attached patch also works for me.  Still I would
prefer the full patch from the master branch.

No regressions on {x86_64,x86_64-m32,i686}-fedora13-linux-gnu.


Thanks,
Jan


gdb/
2010-03-12  Jan Kratochvil  <jan.kratochvil@redhat.com>

	* solib-svr4.c (svr4_relocate_main_executable): Delay the
	svr4_exec_displacement call.  Return on non-DYNAMIC exec_bfd.

--- a/gdb/solib-svr4.c
+++ b/gdb/solib-svr4.c
@@ -1719,7 +1719,15 @@ svr4_exec_displacement (void)
 static void
 svr4_relocate_main_executable (void)
 {
-  CORE_ADDR displacement = svr4_exec_displacement ();
+  CORE_ADDR displacement;
+
+  /* Therefore for ELF it is ET_EXEC and not ET_DYN.  Both shared libraries
+     being executed themselves and PIE (Position Independent Executable)
+     executables are ET_DYN.  */
+  if (exec_bfd && (bfd_get_file_flags (exec_bfd) & DYNAMIC) == 0)
+    return;
+
+  displacement = svr4_exec_displacement ();
 
   /* 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

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [patch] svr4_exec_displacement success indicator  [Re: PIE  question]
  2010-03-12 15:31       ` Jan Kratochvil
@ 2010-03-12 15:39         ` Daniel Jacobowitz
  2010-03-14  6:46           ` Joel Brobecker
  2010-03-14  8:56           ` Jan Kratochvil
  0 siblings, 2 replies; 9+ messages in thread
From: Daniel Jacobowitz @ 2010-03-12 15:39 UTC (permalink / raw)
  To: Jan Kratochvil; +Cc: gdb-patches, Joel Brobecker

On Fri, Mar 12, 2010 at 04:31:38PM +0100, Jan Kratochvil wrote:
> Is it OK also for gdb_7_1-branch?

I think so.  Joel, is the branch open?

-- 
Daniel Jacobowitz
CodeSourcery

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [patch] svr4_exec_displacement success indicator  [Re: PIE   question]
  2010-03-12 15:39         ` Daniel Jacobowitz
@ 2010-03-14  6:46           ` Joel Brobecker
  2010-03-14  8:56           ` Jan Kratochvil
  1 sibling, 0 replies; 9+ messages in thread
From: Joel Brobecker @ 2010-03-14  6:46 UTC (permalink / raw)
  To: Daniel Jacobowitz; +Cc: Jan Kratochvil, gdb-patches

> > Is it OK also for gdb_7_1-branch?
> 
> I think so.  Joel, is the branch open?

Yep - I will send an email when I close the branch (which is around
the time I create the release, usually a window of 1 to 2 hours).

-- 
Joel

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [patch] svr4_exec_displacement success indicator  [Re: PIE   question]
  2010-03-12 15:39         ` Daniel Jacobowitz
  2010-03-14  6:46           ` Joel Brobecker
@ 2010-03-14  8:56           ` Jan Kratochvil
  1 sibling, 0 replies; 9+ messages in thread
From: Jan Kratochvil @ 2010-03-14  8:56 UTC (permalink / raw)
  To: Daniel Jacobowitz; +Cc: gdb-patches, Joel Brobecker

On Fri, 12 Mar 2010 16:39:41 +0100, Daniel Jacobowitz wrote:
> On Fri, Mar 12, 2010 at 04:31:38PM +0100, Jan Kratochvil wrote:
> > Is it OK also for gdb_7_1-branch?
> 
> I think so.

Checked-in for gdb_7_1-branch:
	http://sourceware.org/ml/gdb-cvs/2010-03/msg00124.html

2010-03-14  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.


Thanks,
Jan

^ permalink raw reply	[flat|nested] 9+ messages in thread

* [patch] PIE: Fix back re-run  [Re: [patch] svr4_exec_displacement  success indicator]
  2010-03-08 21:54   ` [patch] svr4_exec_displacement success indicator [Re: PIE question] Jan Kratochvil
  2010-03-08 21:59     ` Daniel Jacobowitz
@ 2010-03-25 22:44     ` Jan Kratochvil
  2010-03-29 11:09       ` [cancel] " Jan Kratochvil
  1 sibling, 1 reply; 9+ messages in thread
From: Jan Kratochvil @ 2010-03-25 22:44 UTC (permalink / raw)
  To: gdb-patches

Hi,

currently:

$ echo 'main(){}'|gcc -o 1 -fPIE -pie -x c -; ./gdb -nx -ex 'set disable-randomization off' -ex 'b main' -ex r -ex c -ex r ./1
Breakpoint 1 at 0x6b0
Starting program: /home/jkratoch/redhat/gdb-clean/gdb/testsuite/1 
Breakpoint 1, 0x00007fbf73e8c6b0 in main ()
Continuing.
Program exited with code 0140.
Starting program: /home/jkratoch/redhat/gdb-clean/gdb/testsuite/1 
Error in re-setting breakpoint 1: Cannot access memory at address 0x7fbf73e8c6ac

It is since:
	[patch] svr4_exec_displacement success indicator [Re: PIE question]
	http://sourceware.org/ml/gdb-patches/2010-03/msg00336.html


On Mon, 08 Mar 2010 22:53:58 +0100, Jan Kratochvil wrote:
> Attached these changes:
> 
> * svr4_exec_displacement calling convention should have success indicator.
> 
> * Preserving now section_offsets if they are already set, inspired by
>   init_objfile_sect_indices.
> 
> I believe either of parts would be sufficient for this problem.

The first part has caused the regression for PIE on native x86* GNU/Linux host.

As I believe for Daniel J.'s seen regression of `qOffsets' the second already
checked-in part is sufficient - I would like to remove the first part.

OK to check it in?

No regressions on {x86_64,x86_64-m32,i686}-fedora12-linux-gnu.

(I do not think one needs to think about 7.1-branch as it is not a regression
against any FSF GDB release.)


Thanks,
Jan


gdb/
2010-03-25  Jan Kratochvil  <jan.kratochvil@redhat.com>

	Fix re-run of PIE executable.
	* solib-svr4.c (svr4_relocate_main_executable) <symfile_objfile>: Remove
	the part of pre-set SYMFILE_OBJFILE->SECTION_OFFSETS.

gdb/testsuite/
2010-03-25  Jan Kratochvil  <jan.kratochvil@redhat.com>

	Fix re-run of PIE executable.
	* gdb.base/break-interp.exp (test_ld): Turn off "disable-randomization".
	Remove $displacement_main to match the solib-svr4.c change.  New "kill"
	and re-"run" of the inferior.

--- a/gdb/solib-svr4.c
+++ b/gdb/solib-svr4.c
@@ -1791,17 +1791,10 @@ svr4_relocate_main_executable (void)
 {
   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;
-    }
+  /* SYMFILE_OBJFILE->SECTION_OFFSETS may now contain displacement from the
+     previous run of the inferior.  Re-set it according to the current value,
+     if we can find it out.  But otherwise keep it as for remote target it may
+     have been pre-set by the `qOffsets' packet.  */
 
   if (! svr4_exec_displacement (&displacement))
     return;
--- a/gdb/testsuite/gdb.base/break-interp.exp
+++ b/gdb/testsuite/gdb.base/break-interp.exp
@@ -416,25 +416,28 @@ proc test_ld {file ifmain trynosym displacement} {
     # Print the "PIE (Position Independent Executable) displacement" message.
     gdb_test "set verbose on"
 
+    # A bit better test coverage.
+    gdb_test "set disable-randomization off"
+
     reach "dl_main" "run segv" $displacement
 
     gdb_test "bt" "#0 +\[^\r\n\]*\\mdl_main\\M.*" "dl bt"
 
     if $ifmain {
 	# Displacement message will be printed the second time on initializing
-	# the linker from svr4_special_symbol_handling.  If any ANOFFSET has
-	# been already set as non-zero the detection will no longer be run.
-	if {$displacement == "NONZERO"} {
-	    set displacement_main "NONE"
-	} else {
-	    set displacement_main $displacement
-	}
-	reach "main" continue $displacement_main
+	# the linker from svr4_special_symbol_handling.
+	reach "main" continue $displacement
 
 	reach "libfunc" continue "NONE"
 
 	gdb_test "bt" "#0 +\[^\r\n\]*\\mlibfunc\\M\[^\r\n\]*\r\n#1 +\[^\r\n\]*\\mmain\\M.*" "main bt"
+    }
 
+    # Try re-run if the new PIE displacement takes effect.
+    gdb_test "kill" "" "kill" {Kill the program being debugged\? \(y or n\) } "y"
+    reach "dl_main" "run  segv" $displacement
+
+    if $ifmain {
 	test_core $file $displacement
 
 	test_attach $file $displacement

^ permalink raw reply	[flat|nested] 9+ messages in thread

* [cancel] Re: [patch] PIE: Fix back re-run  [Re: [patch]  svr4_exec_displacement  success indicator]
  2010-03-25 22:44     ` [patch] PIE: Fix back re-run [Re: [patch] svr4_exec_displacement success indicator] Jan Kratochvil
@ 2010-03-29 11:09       ` Jan Kratochvil
  0 siblings, 0 replies; 9+ messages in thread
From: Jan Kratochvil @ 2010-03-29 11:09 UTC (permalink / raw)
  To: gdb-patches

Cancelled as it is being reposted rediffed in a larger series.

^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2010-03-29 11:09 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
     [not found] <20100307005326.GA29245@caradoc.them.org>
     [not found] ` <20100308213744.GA16628@host0.dyn.jankratochvil.net>
2010-03-08 21:54   ` [patch] svr4_exec_displacement success indicator [Re: PIE question] Jan Kratochvil
2010-03-08 21:59     ` Daniel Jacobowitz
2010-03-10 21:01       ` Jan Kratochvil
2010-03-12 15:31       ` Jan Kratochvil
2010-03-12 15:39         ` Daniel Jacobowitz
2010-03-14  6:46           ` Joel Brobecker
2010-03-14  8:56           ` Jan Kratochvil
2010-03-25 22:44     ` [patch] PIE: Fix back re-run [Re: [patch] svr4_exec_displacement success indicator] Jan Kratochvil
2010-03-29 11:09       ` [cancel] " Jan Kratochvil

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).