From: Jan Kratochvil Date: Mon, 5 Jul 2010 17:58:56 +0000 (+0000) Subject: gdb/ X-Git-Tag: gdb_7_2-2010-07-07-branchpoint~28 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=3cd07d204baadc4b3d148a7494366fc92e7d42b1;p=external%2Fbinutils.git gdb/ * auxv.c (ld_so_xfer_auxv): Do not error on failed read of data_address. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index ceaff6c..8565a35 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,6 +1,11 @@ 2010-07-05 Jan Kratochvil Joel Brobecker + * auxv.c (ld_so_xfer_auxv): Do not error on failed read of data_address. + +2010-07-05 Jan Kratochvil + Joel Brobecker + Fix attaching to PIEs prelinked on the disk after the process was started. * solib-svr4.c (svr4_exec_displacement): New variable arch_size. diff --git a/gdb/auxv.c b/gdb/auxv.c index ae9142a..4fc5c9c 100644 --- a/gdb/auxv.c +++ b/gdb/auxv.c @@ -96,7 +96,27 @@ ld_so_xfer_auxv (gdb_byte *readbuf, 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) diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index a9da37f..043ea08 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,6 +1,12 @@ 2010-07-05 Jan Kratochvil Joel Brobecker + * 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 + Joel Brobecker + * gdb.base/break-interp.exp: Run $binpie with new value "ATTACH", new code for it. New variable relink_args. (prelinkYES): Call prelinkNO. diff --git a/gdb/testsuite/gdb.base/break-interp.exp b/gdb/testsuite/gdb.base/break-interp.exp index a1f8105..910002d 100644 --- a/gdb/testsuite/gdb.base/break-interp.exp +++ b/gdb/testsuite/gdb.base/break-interp.exp @@ -425,12 +425,24 @@ proc test_attach {file displacement {relink_args ""}} { 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"