btrace, vdso: add vdso target sections

When loading symbols for the vdso, also add its sections to target_sections.

This fixes an issue with record btrace where vdso instructions could not be
disassembled during replay.

	* symfile-mem.c (symbol_file_add_from_memory): Add BFD sections.

testsuite/
	* gdb.btrace/vdso.c: New.
	* gdb.btrace/vdso.exp: New.
This commit is contained in:
Markus Metzger 2014-04-02 09:54:11 +02:00
parent e9089e05b6
commit 589fdceb99
5 changed files with 110 additions and 0 deletions

View File

@ -1,3 +1,7 @@
2014-05-23 Markus Metzger <markus.t.metzger@intel.com>
* symfile-mem.c (symbol_file_add_from_memory): Add BFD sections.
2014-05-23 Markus Metzger <markus.t.metzger@intel.com>
* record-btrace.c (record_btrace_allow_memory_access): Remove.

View File

@ -92,6 +92,7 @@ symbol_file_add_from_memory (struct bfd *templ, CORE_ADDR addr,
struct section_addr_info *sai;
unsigned int i;
struct cleanup *cleanup;
struct target_section *sections, *sections_end, *tsec;
if (bfd_get_flavour (templ) != bfd_target_elf_flavour)
error (_("add-symbol-file-from-memory not supported for this target"));
@ -131,6 +132,23 @@ symbol_file_add_from_memory (struct bfd *templ, CORE_ADDR addr,
from_tty ? SYMFILE_VERBOSE : 0,
sai, OBJF_SHARED, NULL);
sections = NULL;
sections_end = NULL;
if (build_section_table (nbfd, &sections, &sections_end) == 0)
{
make_cleanup (xfree, sections);
/* Adjust the target section addresses by the load address. */
for (tsec = sections; tsec != sections_end; ++tsec)
{
tsec->addr += loadbase;
tsec->endaddr += loadbase;
}
add_target_sections (&nbfd, sections, sections_end);
}
/* This might change our ideas about frames already looked at. */
reinit_frame_cache ();

View File

@ -1,3 +1,8 @@
2014-05-23 Markus Metzger <markus.t.metzger@intel.com>
* gdb.btrace/vdso.c: New.
* gdb.btrace/vdso.exp: New.
2014-05-23 Markus Metzger <markus.t.metzger@intel.com>
* gdb.base/gcore.exp (capture_command_output): Move ...

View File

@ -0,0 +1,30 @@
/* This testcase is part of GDB, the GNU debugger.
Copyright 2014 Free Software Foundation, Inc.
Contributed by Intel Corp. <markus.t.metzger@intel.com>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. */
#include <sys/time.h>
int
main (void)
{
struct timeval tv;
gettimeofday (&tv, 0); /* main.1. */
return 0; /* main.2. */
}

View File

@ -0,0 +1,53 @@
# This testcase is part of GDB, the GNU debugger.
#
# Copyright 2014 Free Software Foundation, Inc.
#
# Contributed by Intel Corp. <markus.t.metzger@intel.com>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
#
# Test that we can access the vdso memory during replay for stepping.
# check for btrace support
if { [skip_btrace_tests] } { return -1 }
# start inferior
standard_testfile
if [prepare_for_testing $testfile.exp $testfile $srcfile] {
return -1
}
if ![runto_main] {
return -1
}
# capture the disassembly of gettimeofday while live debugging
set live_gettimeofday [capture_command_output "disassemble gettimeofday" ""]
# trace the test code
gdb_test_no_output "record btrace"
gdb_test "next" "main\.2.*"
with_test_prefix "replay" {
# capture the disassembly of gettimeofday while replaying
gdb_test "record goto begin" "main\.1.*"
set replay_gettimeofday [capture_command_output "disassemble gettimeofday" ""]
# the two disassemblies must be identical
if ![string compare $live_gettimeofday $replay_gettimeofday] {
pass "disassemble gettimeofday"
} else {
fail "disassemble gettimeofday"
}
}