This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
Re: [PATCH] [PR gdb/21695] Fix lost line info for symbol at addr zero
- From: Omair Javaid <omair dot javaid at linaro dot org>
- To: GDB Patches <gdb-patches at sourceware dot org>
- Cc: Omair Javaid <omair dot javaid at linaro dot org>
- Date: Mon, 28 May 2018 15:49:55 +0500
- Subject: Re: [PATCH] [PR gdb/21695] Fix lost line info for symbol at addr zero
- References: <1526393061-18039-1-git-send-email-omair.javaid@linaro.org>
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!