RE: [PATCH] btrace, vdso: add vdso target sections

Metzger, Markus T
2014-04-22T14:32:02Z

Hello Pedro,

Did you find some time to review this? This is related to the BFD changes you
and Alan Modra were discussing.

It makes GDB use the BFD sections that Alan's patch added to fix an issue with
disassembling vdso code in record btrace.

Thanks,
Markus.

> -----Original Message-----
> From: Metzger, Markus T
> Sent: Friday, April 04, 2014 10:53 AM
> To: palves@redhat.com
> Cc: gdb-patches@sourceware.org
> Subject: [PATCH] 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.
>
> 2014-04-04 Markus Metzger <markus.t.metzger@intel.com>
>
> * symfile-mem.c (symbol_file_add_from_memory): Add
> add_sections
> parameter. Add BFD sections. Adjust all callers.
> (struct symbol_file_add_from_memory_args): Add add_sections
> field.
>
> testsuite/
> * gdb.btrace/vdso.c: New.
> * gdb.btrace/vdso.exp: New.
>
>
> ---
> gdb/symfile-mem.c | 33 ++++++++++++++++++++++++----
> gdb/testsuite/gdb.btrace/vdso.c | 30 +++++++++++++++++++++++++
> gdb/testsuite/gdb.btrace/vdso.exp | 46
> +++++++++++++++++++++++++++++++++++++++
> 3 files changed, 105 insertions(+), 4 deletions(-)
> create mode 100644 gdb/testsuite/gdb.btrace/vdso.c
> create mode 100644 gdb/testsuite/gdb.btrace/vdso.exp
>
> diff --git a/gdb/symfile-mem.c b/gdb/symfile-mem.c
> index 3f09c4d..6f67cd8 100644
> --- a/gdb/symfile-mem.c
> +++ b/gdb/symfile-mem.c
> @@ -80,10 +80,12 @@ target_read_memory_bfd (bfd_vma memaddr,
> bfd_byte *myaddr, bfd_size_type len)
> non-zero, is the known size of the object. TEMPL is a bfd
> representing the target's format. NAME is the name to use for this
> symbol file in messages; it can be NULL or a malloc-allocated string
> - which will be attached to the BFD. */
> + which will be attached to the BFD. If ADD_SECTIONS is non-zero,
> + add the sections of the loaded BFD. */
> static struct objfile *
> symbol_file_add_from_memory (struct bfd *templ, CORE_ADDR addr,
> - size_t size, char *name, int from_tty)
> + size_t size, char *name, int add_sections,
> + int from_tty)
> {
> struct objfile *objf;
> struct bfd *nbfd;
> @@ -131,6 +133,27 @@ symbol_file_add_from_memory (struct bfd *templ,
> CORE_ADDR addr,
> from_tty ? SYMFILE_VERBOSE : 0,
> sai, OBJF_SHARED, NULL);
>
> + if (add_sections)
> + {
> + struct target_section *sections, *sections_end, *tsec;
> +
> + sections = NULL;
> + sections_end = NULL;
> + make_cleanup (xfree, sections);
> +
> + if (build_section_table (nbfd, &sections, &sections_end) == 0)
> + {
> + /* 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 ();
>
> @@ -159,7 +182,7 @@ add_symbol_file_from_memory_command (char
> *args, int from_tty)
> error (_("Must use symbol-file or exec-file "
> "before add-symbol-file-from-memory."));
>
> - symbol_file_add_from_memory (templ, addr, 0, NULL, from_tty);
> + symbol_file_add_from_memory (templ, addr, 0, NULL, 0, from_tty);
> }
>
> /* Arguments for symbol_file_add_from_memory_wrapper. */
> @@ -171,6 +194,7 @@ struct symbol_file_add_from_memory_args
> size_t size;
> char *name;
> int from_tty;
> + int add_sections;
> };
>
> /* Wrapper function for symbol_file_add_from_memory, for
> @@ -182,7 +206,7 @@ symbol_file_add_from_memory_wrapper (struct
> ui_out *uiout, void *data)
> struct symbol_file_add_from_memory_args *args = data;
>
> symbol_file_add_from_memory (args->bfd, args->sysinfo_ehdr, args-
> >size,
> - args->name, args->from_tty);
> + args->name, args->add_sections, args-
> >from_tty);
> return 0;
> }
>
> @@ -247,6 +271,7 @@ add_vsyscall_page (struct target_ops *target, int
> from_tty)
> vsyscall DSO was not triggered by the user, even if the user
> typed "run" at the TTY. */
> args.from_tty = 0;
> + args.add_sections = 1;
> catch_exceptions (current_uiout,
> symbol_file_add_from_memory_wrapper,
> &args, RETURN_MASK_ALL);
> }
> diff --git a/gdb/testsuite/gdb.btrace/vdso.c
> b/gdb/testsuite/gdb.btrace/vdso.c
> new file mode 100644
> index 0000000..3e73071
> --- /dev/null
> +++ b/gdb/testsuite/gdb.btrace/vdso.c
> @@ -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);
> +
> + return 0;
> +}
> diff --git a/gdb/testsuite/gdb.btrace/vdso.exp
> b/gdb/testsuite/gdb.btrace/vdso.exp
> new file mode 100644
> index 0000000..2f415ff
> --- /dev/null
> +++ b/gdb/testsuite/gdb.btrace/vdso.exp
> @@ -0,0 +1,46 @@
> +# 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
> +}
> +
> +# trace the test code
> +gdb_test_no_output "record btrace"
> +gdb_test "next"
> +
> +# start replaying
> +gdb_test "reverse-stepi"
> +
> +# disassemble the code around the current PC
> +gdb_test "disassemble \$pc, +10" [join [list \
> + ".*" \
> + "End of assembler dump\." \
> + ] "\r\n"]
> --
> 1.8.3.1

Intel GmbH
Dornacher Strasse 1
85622 Feldkirchen/Muenchen, Deutschland
Sitz der Gesellschaft: Feldkirchen bei Muenchen
Geschaeftsfuehrer: Christian Lamprechter, Hannes Schwaderer, Douglas Lusk
Registergericht: Muenchen HRB 47456
Ust.-IdNr./VAT Registration No.: DE129385895
Citibank Frankfurt a.M. (BLZ 502 109 00) 600119052