This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] [PR gdb/21695] Fix lost line info for symbol at addr zero


On 15 May 2018 at 19:04, Omair Javaid <omair.javaid@linaro.org> wrote:
> This patch fixes a unique condition where GDB fails to provide line
> information of symbol at address zero when code is compiled with text
> address zero but loaded at an offset > 0.
>
> For example lets compile following code snippet:
>
> int main() {
>   return 0;
> }
>
> gcc -O0 -g3 -nostdlib -emain -Wl,-Ttext=0x00 -o file.out file.c
>
> Start gdb and run:
>
> add-symbol-file file.out 0xffff0000
> info line main
>
> GDB will return error saying no line info is available for the symbol.
>
> This is a direct consequence of the fix for PR 12528 where GDB tries to ignore
> line table for a function which has been garbage collected by the linker.
>
> As the garbage collected symbols are sent to address zero GDB assumes a symbol
> actually placed at address zero as garbage collected.
>
> This was fixed with an additional check address < lowpc. But when symbol is
> loaded at an offset lowpc becomes lowpc + offset while no offset is added to
> address rather final symbol address is calculated based on baseaddr and address
> added together. So in case where symbols are loaded at an offset the condition
> address < lowpc will always return true.
>
> This patch fixes this by comparing address against a non offset lowpc.
> This patch also adds a GDB test case to replicate this behavior.
>
> gdb:
>
> 2018-05-15  Omair Javaid  <omair.javaid@linaro.org>
>
>         PR gdb/21695
>         * dwarf2read.c (lnp_state_machine::check_line_address): Update declaration.
>         (dwarf_decode_lines_1): Adjust.
>
> gdb/testsuite:
>
> 2018-05-15  Omair Javaid  <omair.javaid@linaro.org>
>
>         PR gdb/21695
>         * gdb.base/infoline-reloc-main-from-zero.exp: New test.
>         * gdb.base/infoline-reloc-main-from-zero.c: New file.
> ---
>  gdb/dwarf2read.c                                   |  8 ++--
>  .../gdb.base/infoline-reloc-main-from-zero.c       | 24 ++++++++++
>  .../gdb.base/infoline-reloc-main-from-zero.exp     | 51 ++++++++++++++++++++++
>  3 files changed, 79 insertions(+), 4 deletions(-)
>  create mode 100644 gdb/testsuite/gdb.base/infoline-reloc-main-from-zero.c
>  create mode 100644 gdb/testsuite/gdb.base/infoline-reloc-main-from-zero.exp
>
> diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c
> index 575d316..b171bb2 100644
> --- a/gdb/dwarf2read.c
> +++ b/gdb/dwarf2read.c
> @@ -20411,7 +20411,7 @@ public:
>       sequence.  */
>    void check_line_address (struct dwarf2_cu *cu,
>                            const gdb_byte *line_ptr,
> -                          CORE_ADDR lowpc, CORE_ADDR address);
> +                          CORE_ADDR lowpc_minus_base, CORE_ADDR address);
>
>    void handle_set_discriminator (unsigned int discriminator)
>    {
> @@ -20755,14 +20755,14 @@ lnp_state_machine::lnp_state_machine (gdbarch *arch, line_header *lh,
>  void
>  lnp_state_machine::check_line_address (struct dwarf2_cu *cu,
>                                        const gdb_byte *line_ptr,
> -                                      CORE_ADDR lowpc, CORE_ADDR address)
> +                                      CORE_ADDR lowpc_minus_base, CORE_ADDR address)
>  {
>    /* If address < lowpc then it's not a usable value, it's outside the
>       pc range of the CU.  However, we restrict the test to only address
>       values of zero to preserve GDB's previous behaviour which is to
>       handle the specific case of a function being GC'd by the linker.  */
>
> -  if (address == 0 && address < lowpc)
> +  if (address == 0 && address < lowpc_minus_base)
>      {
>        /* This line table is for a function which has been
>          GCd by the linker.  Ignore it.  PR gdb/12528 */
> @@ -20857,7 +20857,7 @@ dwarf_decode_lines_1 (struct line_header *lh, struct dwarf2_cu *cu,
>                     line_ptr += bytes_read;
>
>                     state_machine.check_line_address (cu, line_ptr,
> -                                                     lowpc, address);
> +                                                     lowpc - baseaddr, address);
>                     state_machine.handle_set_address (baseaddr, address);
>                   }
>                   break;
> diff --git a/gdb/testsuite/gdb.base/infoline-reloc-main-from-zero.c b/gdb/testsuite/gdb.base/infoline-reloc-main-from-zero.c
> new file mode 100644
> index 0000000..8902051
> --- /dev/null
> +++ b/gdb/testsuite/gdb.base/infoline-reloc-main-from-zero.c
> @@ -0,0 +1,24 @@
> +/* This testcase is part of GDB, the GNU debugger.
> +
> +   Copyright 2011-2018 Free Software Foundation, Inc.
> +
> +   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 case for PR gdb/21695
> +
> +int
> +main ()
> +{
> +  return 0;
> +}
> diff --git a/gdb/testsuite/gdb.base/infoline-reloc-main-from-zero.exp b/gdb/testsuite/gdb.base/infoline-reloc-main-from-zero.exp
> new file mode 100644
> index 0000000..68564688
> --- /dev/null
> +++ b/gdb/testsuite/gdb.base/infoline-reloc-main-from-zero.exp
> @@ -0,0 +1,51 @@
> +# Copyright 2011-2018 Free Software Foundation, Inc.
> +
> +# 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/>.
> +
> +# This file is part of the gdb testsuite
> +
> +#
> +# test running programs
> +#
> +
> +standard_testfile .c
> +
> +if [get_compiler_info] {
> +    return -1
> +}
> +
> +# Build executable with stripped startup code and text section starting at zero
> +
> +set opts {debug "additional_flags=-nostdlib -emain -Wl,-Ttext=0x00"}
> +
> +if {[build_executable $testfile.exp $testfile $srcfile $opts] == -1} {
> +    untested "failed to compile"
> +    return -1
> +}
> +
> +gdb_exit
> +gdb_start
> +gdb_reinitialize_dir $srcdir/$subdir
> +
> +# Load symbols at an offset 0xffff0000 using add-symbol-file
> +
> +gdb_test "add-symbol-file [standard_output_file ${testfile}] 0xffff000" \
> +    "Reading symbols from .*" \
> +    "add-symbol-file" \
> +    "add symbol table from file \".*\" at.*\\(y or n\\) " "y"
> +
> +# Check if we are able to read offset adjusted line information of main
> +
> +gdb_test "info line main" \
> +       "Line.*starts at address.*and ends at.*"
> --
> 2.7.4
>


Ping!


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]