diff options
author | Jan Kratochvil <jan.kratochvil@redhat.com> | 2010-07-05 18:04:33 +0000 |
---|---|---|
committer | Jan Kratochvil <jan.kratochvil@redhat.com> | 2010-07-05 18:04:33 +0000 |
commit | 4e5799b6d29933e9ab11242b2bceac908aedf49d (patch) | |
tree | 6292f092af7dc61d5c916295cda2ef79ffb94c51 /gdb/solib-svr4.c | |
parent | 1a219cc7417a257cf173ccb36f96dad4c36e471e (diff) | |
download | gdb-4e5799b6d29933e9ab11242b2bceac908aedf49d.zip gdb-4e5799b6d29933e9ab11242b2bceac908aedf49d.tar.gz gdb-4e5799b6d29933e9ab11242b2bceac908aedf49d.tar.bz2 |
gdb/
Fix re-run of PIE executable, PR shlibs/11776.
* solib-svr4.c (svr4_relocate_main_executable) <symfile_objfile>: Remove
the part of pre-set SYMFILE_OBJFILE->SECTION_OFFSETS.
gdb/testsuite/
Fix re-run of PIE executable, PR shlibs/11776.
* 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.
Diffstat (limited to 'gdb/solib-svr4.c')
-rw-r--r-- | gdb/solib-svr4.c | 33 |
1 files changed, 24 insertions, 9 deletions
diff --git a/gdb/solib-svr4.c b/gdb/solib-svr4.c index 79138cc..1f135d4 100644 --- a/gdb/solib-svr4.c +++ b/gdb/solib-svr4.c @@ -1989,17 +1989,32 @@ svr4_relocate_main_executable (void) { CORE_ADDR displacement; - if (symfile_objfile) - { - int i; + /* If we are re-running this executable, SYMFILE_OBJFILE->SECTION_OFFSETS + probably contains the offsets computed using the PIE displacement + from the previous run, which of course are irrelevant for this run. + So we need to determine the new PIE displacement and recompute the + section offsets accordingly, even if SYMFILE_OBJFILE->SECTION_OFFSETS + already contains pre-computed offsets. - /* Remote target may have already set specific offsets by `qOffsets' - which should be preferred. */ + If we cannot compute the PIE displacement, either: - for (i = 0; i < symfile_objfile->num_sections; i++) - if (ANOFFSET (symfile_objfile->section_offsets, i) != 0) - return; - } + - The executable is not PIE. + + - SYMFILE_OBJFILE does not match the executable started in the target. + This can happen for main executable symbols loaded at the host while + `ld.so --ld-args main-executable' is loaded in the target. + + Then we leave the section offsets untouched and use them as is for + this run. Either: + + - These section offsets were properly reset earlier, and thus + already contain the correct values. This can happen for instance + when reconnecting via the remote protocol to a target that supports + the `qOffsets' packet. + + - The section offsets were not reset earlier, and the best we can + hope is that the old offsets are still applicable to the new run. + */ if (! svr4_exec_displacement (&displacement)) return; |