gdb/
* auxv.c (ld_so_xfer_auxv): Do not error on failed read of data_address.
This commit is contained in:
parent
0a1e94c73e
commit
3cd07d204b
4 changed files with 46 additions and 3 deletions
|
@ -1,3 +1,8 @@
|
|||
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>
|
||||
|
||||
|
|
22
gdb/auxv.c
22
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)
|
||||
|
|
|
@ -1,3 +1,9 @@
|
|||
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>
|
||||
|
||||
|
|
|
@ -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"
|
||||
|
|
Loading…
Reference in a new issue