This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
Re: ping: [patch 2/6] PIE: Attach binary even after ld.so re-prelinked underneath
- From: Jan Kratochvil <jan dot kratochvil at redhat dot com>
- To: Joel Brobecker <brobecker at adacore dot com>
- Cc: gdb-patches at sourceware dot org
- Date: Mon, 5 Jul 2010 20:09:46 +0200
- Subject: Re: ping: [patch 2/6] PIE: Attach binary even after ld.so re-prelinked underneath
- References: <20100329161657.GA2940@host0.dyn.jankratochvil.net> <20100609150815.GB7183@host0.dyn.jankratochvil.net> <20100629182132.GS2595@adacore.com> <20100704101653.GB6875@host0.dyn.jankratochvil.net> <20100705171443.GZ2595@adacore.com>
Hi Joel,
checked-in.
Thanks,
Jan
http://sourceware.org/ml/gdb-cvs/2010-07/msg00025.html
--- src/gdb/ChangeLog 2010/07/05 17:57:49 1.11964
+++ src/gdb/ChangeLog 2010/07/05 17:58:55 1.11965
@@ -1,6 +1,11 @@
2010-07-05 Jan Kratochvil <jan.kratochvil@redhat.com>
Joel Brobecker <brobecker@adacore.com>
+ * auxv.c (ld_so_xfer_auxv): Do not error on failed read of data_address.
+
+2010-07-05 Jan Kratochvil <jan.kratochvil@redhat.com>
+ Joel Brobecker <brobecker@adacore.com>
+
Fix attaching to PIEs prelinked on the disk after the process was
started.
* solib-svr4.c (svr4_exec_displacement): New variable arch_size.
--- src/gdb/auxv.c 2010/05/18 19:23:37 1.27
+++ src/gdb/auxv.c 2010/07/05 17:58:55 1.28
@@ -96,7 +96,27 @@
pointer_address = SYMBOL_VALUE_ADDRESS (msym);
- data_address = read_memory_typed_address (pointer_address, ptr_type);
+ /* The location of the _dl_auxv symbol may no longer be correct if
+ ld.so runs at a different address than the one present in the file.
+ This is very common case - for unprelinked ld.so or with a PIE executable.
+ PIE executable forces random address even for libraries already being
+ prelinked to some address. PIE executables themselves are never prelinked
+ even on prelinked systems. Prelinking of a PIE executable would block
+ their purpose of randomizing load of everything including the executable.
+
+ If the memory read fails, return -1 to fallback on another mechanism for
+ retrieving the AUXV.
+
+ In most cases of a PIE running under valgrind there is no way to find
+ out the base addresses of any of ld.so, executable or AUXV as everything
+ is randomized and /proc information is not relevant for the virtual
+ executable running under valgrind. We think that we might need a valgrind
+ extension to make it work. This is PR 11440. */
+
+ if (target_read_memory (pointer_address, ptr_buf, ptr_size) != 0)
+ return -1;
+
+ data_address = extract_typed_address (ptr_buf, ptr_type);
/* Possibly still not initialized such as during an inferior startup. */
if (data_address == 0)
--- src/gdb/testsuite/ChangeLog 2010/07/05 17:57:50 1.2371
+++ src/gdb/testsuite/ChangeLog 2010/07/05 17:58:56 1.2372
@@ -1,6 +1,12 @@
2010-07-05 Jan Kratochvil <jan.kratochvil@redhat.com>
Joel Brobecker <brobecker@adacore.com>
+ * gdb.base/break-interp.exp (test_attach): Keep $interp changed. Move
+ its restore after the <$relink_args != ""> loop. new comment.
+
+2010-07-05 Jan Kratochvil <jan.kratochvil@redhat.com>
+ Joel Brobecker <brobecker@adacore.com>
+
* gdb.base/break-interp.exp: Run $binpie with new value "ATTACH", new
code for it. New variable relink_args.
(prelinkYES): Call prelinkNO.
--- src/gdb/testsuite/gdb.base/break-interp.exp 2010/07/05 17:57:50 1.14
+++ src/gdb/testsuite/gdb.base/break-interp.exp 2010/07/05 17:58:56 1.15
@@ -425,12 +425,24 @@
global exec interp_saved interp
foreach relink {YES NO} {
- if {[prelink$relink $relink_args [file tail $exec]]
- && [copy $interp_saved $interp]} {
+ # Formerly this test was testing only prelinking of $EXEC. As the
+ # prelink command automatically prelinks all of $EXEC's libraries,
+ # even $INTERP got prelinked. Therefore, we formerly had to
+ # `[copy $interp_saved $interp]' to make $INTERP not affected by
+ # this prelinking of $EXEC.
+ #
+ # But now we need to test even prelinking of $INTERP. We could
+ # create a separate test to test just the $INTERP prelinking. For
+ # test simplicity, we merged this test and the test above by not
+ # restoring $INTERP after $EXEC prelink. $INTERP gets restored
+ # later below.
+
+ if [prelink$relink $relink_args [file tail $exec]] {
# /proc/PID/exe cannot be loaded as it is "EXECNAME (deleted)".
test_attach_gdb $exec $pid $displacement "attach-relink$relink"
}
}
+ copy $interp_saved $interp
}
remote_exec host "kill -9 $pid"