summaryrefslogtreecommitdiff
path: root/gdb/auxv.c
diff options
context:
space:
mode:
authorJan Kratochvil <jan.kratochvil@redhat.com>2010-07-05 17:58:56 +0000
committerJan Kratochvil <jan.kratochvil@redhat.com>2010-07-05 17:58:56 +0000
commit3cd07d204baadc4b3d148a7494366fc92e7d42b1 (patch)
treedbfa950caeb23ebeb568ae1e364fc14aa3eb1b32 /gdb/auxv.c
parent0a1e94c73edc44cacedc14eb14829d60a1c6dbbd (diff)
downloadbinutils-gdb-3cd07d204baadc4b3d148a7494366fc92e7d42b1.tar.gz
gdb/
* auxv.c (ld_so_xfer_auxv): Do not error on failed read of data_address.
Diffstat (limited to 'gdb/auxv.c')
-rw-r--r--gdb/auxv.c22
1 files changed, 21 insertions, 1 deletions
diff --git a/gdb/auxv.c b/gdb/auxv.c
index ae9142ab03a..4fc5c9c5f4a 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)