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.
This commit is contained in:
parent
1a219cc741
commit
4e5799b6d2
4 changed files with 50 additions and 9 deletions
|
@ -1,3 +1,10 @@
|
||||||
|
2010-07-05 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||||
|
Joel Brobecker <brobecker@adacore.com>
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
2010-07-05 Jan Kratochvil <jan.kratochvil@redhat.com>
|
2010-07-05 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||||
Joel Brobecker <brobecker@adacore.com>
|
Joel Brobecker <brobecker@adacore.com>
|
||||||
|
|
||||||
|
|
|
@ -1989,17 +1989,32 @@ svr4_relocate_main_executable (void)
|
||||||
{
|
{
|
||||||
CORE_ADDR displacement;
|
CORE_ADDR displacement;
|
||||||
|
|
||||||
if (symfile_objfile)
|
/* If we are re-running this executable, SYMFILE_OBJFILE->SECTION_OFFSETS
|
||||||
{
|
probably contains the offsets computed using the PIE displacement
|
||||||
int i;
|
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'
|
If we cannot compute the PIE displacement, either:
|
||||||
which should be preferred. */
|
|
||||||
|
|
||||||
for (i = 0; i < symfile_objfile->num_sections; i++)
|
- The executable is not PIE.
|
||||||
if (ANOFFSET (symfile_objfile->section_offsets, i) != 0)
|
|
||||||
return;
|
- 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))
|
if (! svr4_exec_displacement (&displacement))
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -1,3 +1,11 @@
|
||||||
|
2010-07-05 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||||
|
Joel Brobecker <brobecker@adacore.com>
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
2010-07-05 Jan Kratochvil <jan.kratochvil@redhat.com>
|
2010-07-05 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||||
Joel Brobecker <brobecker@adacore.com>
|
Joel Brobecker <brobecker@adacore.com>
|
||||||
|
|
||||||
|
|
|
@ -337,6 +337,11 @@ proc test_ld {file ifmain trynosym displacement} {
|
||||||
# Print the "PIE (Position Independent Executable) displacement" message.
|
# Print the "PIE (Position Independent Executable) displacement" message.
|
||||||
gdb_test_no_output "set verbose on"
|
gdb_test_no_output "set verbose on"
|
||||||
|
|
||||||
|
# We want to test the re-run of a PIE in the case where the executable
|
||||||
|
# is loaded with a different displacement, but disable-randomization
|
||||||
|
# prevents that from happening. So turn it off.
|
||||||
|
gdb_test "set disable-randomization off"
|
||||||
|
|
||||||
reach "dl_main" "run segv" $displacement
|
reach "dl_main" "run segv" $displacement
|
||||||
|
|
||||||
gdb_test "bt" "#0 +\[^\r\n\]*\\mdl_main\\M.*" "dl bt"
|
gdb_test "bt" "#0 +\[^\r\n\]*\\mdl_main\\M.*" "dl bt"
|
||||||
|
@ -347,7 +352,13 @@ proc test_ld {file ifmain trynosym displacement} {
|
||||||
reach "libfunc" continue "NONE"
|
reach "libfunc" continue "NONE"
|
||||||
|
|
||||||
gdb_test "bt" "#0 +\[^\r\n\]*\\mlibfunc\\M\[^\r\n\]*\r\n#1 +\[^\r\n\]*\\mmain\\M.*" "main bt"
|
gdb_test "bt" "#0 +\[^\r\n\]*\\mlibfunc\\M\[^\r\n\]*\r\n#1 +\[^\r\n\]*\\mmain\\M.*" "main bt"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Try re-run if the new PIE displacement takes effect.
|
||||||
|
gdb_test "kill" "" "kill" {Kill the program being debugged\? \(y or n\) } "y"
|
||||||
|
reach "dl_main" "run segv" $displacement
|
||||||
|
|
||||||
|
if $ifmain {
|
||||||
test_core $file $displacement
|
test_core $file $displacement
|
||||||
|
|
||||||
test_attach $file $displacement
|
test_attach $file $displacement
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue