From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca by simark.ca with LMTP id a0tgKVgcA2FBTwAAWB0awg (envelope-from ) for ; Thu, 29 Jul 2021 17:23:36 -0400 Received: by simark.ca (Postfix, from userid 112) id 9BDE91EDFB; Thu, 29 Jul 2021 17:23:36 -0400 (EDT) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on simark.ca X-Spam-Level: X-Spam-Status: No, score=-0.9 required=5.0 tests=DKIM_SIGNED, MAILING_LIST_MULTI,T_DKIM_INVALID,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.2 Received: from sourceware.org (server2.sourceware.org [8.43.85.97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by simark.ca (Postfix) with ESMTPS id E7FDD1E813 for ; Thu, 29 Jul 2021 17:23:34 -0400 (EDT) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 28370384BC3C for ; Thu, 29 Jul 2021 21:23:34 +0000 (GMT) Received: from smtp-out1.suse.de (smtp-out1.suse.de [195.135.220.28]) by sourceware.org (Postfix) with ESMTPS id 8EFC23857004 for ; Thu, 29 Jul 2021 21:23:21 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 8EFC23857004 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=suse.de Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=suse.de Received: from imap1.suse-dmz.suse.de (imap1.suse-dmz.suse.de [192.168.254.73]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by smtp-out1.suse.de (Postfix) with ESMTPS id 95B2222339; Thu, 29 Jul 2021 21:23:20 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1627593800; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version:content-type:content-type; bh=TV3mVOSdqBiE0k2eD7He25YXNji7mpTfqyh91By/G7k=; b=U/NrqZkrBoB+T2FOI/VOeLFKdLciaD1yxAB75XbFJ6LZ0QWAEgySh5EOB86bxfD7zE4YiI mh46d7zDyrZLI0rZOHKqe9i7f4pkgBlQaUxT8IB3m3oNtV+NFfMaMlaBJVZk9/7YeRL0+S /LZUdgd5FJBp59O1Hr8obHCMemyXyj0= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1627593800; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version:content-type:content-type; bh=TV3mVOSdqBiE0k2eD7He25YXNji7mpTfqyh91By/G7k=; b=fKC1d2gaTvRC/Fwt5sIqNxFz4talkHdsQK8pfjyG4XPvzJ48OF3n5I0d2BvOHznFKir4KO uh8otZr7SBVWcCCg== Received: from imap1.suse-dmz.suse.de (imap1.suse-dmz.suse.de [192.168.254.73]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by imap1.suse-dmz.suse.de (Postfix) with ESMTPS id 7875713748; Thu, 29 Jul 2021 21:23:20 +0000 (UTC) Received: from dovecot-director2.suse.de ([192.168.254.65]) by imap1.suse-dmz.suse.de with ESMTPSA id L7PFG0gcA2GTBAAAGKfGzw (envelope-from ); Thu, 29 Jul 2021 21:23:20 +0000 Date: Thu, 29 Jul 2021 23:23:18 +0200 From: Tom de Vries To: gdb-patches@sourceware.org Subject: [PATCH master + 11][gdb/symtab] Fix zero address complaint for shlib Message-ID: <20210729212317.GA8528@delia> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.10.1 (2018-07-13) X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gdb-patches-bounces+public-inbox=simark.ca@sourceware.org Sender: "Gdb-patches" Hi, In PR28004 the following warning / Internal error is reported: ... $ gdb -q -batch \ -iex "set sysroot $(pwd -P)/repro" \ ./repro/gdb \ ./repro/core \ -ex bt ... Program terminated with signal SIGABRT, Aborted. #0 0x00007ff8fe8e5d22 in raise () from repro/usr/lib/libc.so.6 [Current thread is 1 (LWP 1762498)] #1 0x00007ff8fe8cf862 in abort () from repro/usr/lib/libc.so.6 warning: (Internal error: pc 0x7ff8feb2c21d in read in psymtab, \ but not in symtab.) warning: (Internal error: pc 0x7ff8feb2c218 in read in psymtab, \ but not in symtab.) ... #2 0x00007ff8feb2c21e in __gnu_debug::_Error_formatter::_M_error() const \ [clone .cold] (warning: (Internal error: pc 0x7ff8feb2c21d in read in \ psymtab, but not in symtab.) ) from repro/usr/lib/libstdc++.so.6 ... The warning is about the following: - in find_pc_sect_compunit_symtab we try to find the addres (0x7ff8feb2c218 / 0x7ff8feb2c21d) in the symtabs. - that fails, so we try again in the partial symtabs. - we find a matching partial symtab - however, the partial symtab has a matching symtab, so we should have found a matching symtab in the first step. The addresses are: ... (gdb) info sym 0x7ff8feb2c218 __gnu_debug::_Error_formatter::_M_error() const [clone .cold] in \ section .text of repro/usr/lib/libstdc++.so.6 (gdb) info sym 0x7ff8feb2c21d __gnu_debug::_Error_formatter::_M_error() const [clone .cold] + 5 in \ section .text of repro/usr/lib/libstdc++.so.6 ... which correspond to unrelocated addresses 0x9c218 and 0x9c21d: ... $ nm -C repro/usr/lib/libstdc++.so.6.0.29 | grep 000000000009c218 000000000009c218 t __gnu_debug::_Error_formatter::_M_error() const \ [clone .cold] ... The unrelocated addresses can be found in the partial symbols addresss map: ... (gdb) set $map = (addrmap_fixed *)m_partial_symtabs->psymtabs_addrmap (gdb) p /x $map->transitions[24] $47 = {addr = 0x9989c, value = 0x231d1b0} (gdb) p /x $map->transitions[25] $48 = {addr = 0xa2170, value = 0x5439980} ... and indeed we do: ... (gdb) p ps $1 = (partial_symtab *) 0x231d1b0 ... but not in the symbols address map: ... (gdb) set $symtab = ps->get_compunit_symtab (objfile) (gdb) set $map = (addrmap_fixed *)$symtab.blockvector.map (gdb) p /x $map.transitions[20] $42 = {addr = 0x7ff8feb2993a, value = 0x0} (gdb) p /x $map.transitions[21] $43 = {addr = 0x7ff8feb322b0, value = 0x6155ef0} ... The reason for the difference is between the two address maps (who are based on the same data), is this code in dwarf2_rnglists_process: ... /* A not-uncommon case of bad debug info. Don't pollute the addrmap with bad data. */ if (range_beginning + baseaddr == 0 && !per_objfile->per_bfd->has_section_at_zero) { complaint (_(".debug_rnglists entry has start address of zero" " [in module %s]"), objfile_name (objfile)); continue; } ... which triggers for the partial symbol table case (with unrelocated addresses), but not for the symbol table case (with relocated addresses). The difference is that in the latter case, baseaddr (initialized from objfile->text_section_offset ()) isn't 0. Fix this by removing the baseaddr part from the condition. Same for dwarf2_ranges_process. The test-case excercises the latter only for now. Tested on x86_64-linux. Any comments? Thanks, - Tom [gdb/symtab] Fix zero address complaint for shlib gdb/ChangeLog: 2021-07-29 Tom de Vries PR symtab/28004 * gdb/dwarf2/read.c (dwarf2_rnglists_process, dwarf2_ranges_process): Fix zero address complaint. * gdb/testsuite/gdb.dwarf2/dw2-zero-range-shlib.c: New test. * gdb/testsuite/gdb.dwarf2/dw2-zero-range.c: New test. * gdb/testsuite/gdb.dwarf2/dw2-zero-range.exp: New file. --- gdb/dwarf2/read.c | 10 +-- gdb/testsuite/gdb.dwarf2/dw2-zero-range-shlib.c | 21 ++++++ gdb/testsuite/gdb.dwarf2/dw2-zero-range.c | 24 ++++++ gdb/testsuite/gdb.dwarf2/dw2-zero-range.exp | 97 +++++++++++++++++++++++++ 4 files changed, 144 insertions(+), 8 deletions(-) diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c index 6f1b453ef45..de84c47b626 100644 --- a/gdb/dwarf2/read.c +++ b/gdb/dwarf2/read.c @@ -13631,7 +13631,6 @@ dwarf2_rnglists_process (unsigned offset, struct dwarf2_cu *cu, /* Base address selection entry. */ gdb::optional base; const gdb_byte *buffer; - CORE_ADDR baseaddr; bool overflow = false; ULONGEST addr_index; struct dwarf2_section_info *rnglists_section; @@ -13648,8 +13647,6 @@ dwarf2_rnglists_process (unsigned offset, struct dwarf2_cu *cu, } buffer = rnglists_section->buffer + offset; - baseaddr = objfile->text_section_offset (); - while (1) { /* Initialize it due to a false compiler warning. */ @@ -13791,7 +13788,7 @@ dwarf2_rnglists_process (unsigned offset, struct dwarf2_cu *cu, /* A not-uncommon case of bad debug info. Don't pollute the addrmap with bad data. */ - if (range_beginning + baseaddr == 0 + if (range_beginning == 0 && !per_objfile->per_bfd->has_section_at_zero) { complaint (_(".debug_rnglists entry has start address of zero" @@ -13833,7 +13830,6 @@ dwarf2_ranges_process (unsigned offset, struct dwarf2_cu *cu, dwarf_tag tag, gdb::optional base; unsigned int dummy; const gdb_byte *buffer; - CORE_ADDR baseaddr; if (cu_header->version >= 5) return dwarf2_rnglists_process (offset, cu, tag, callback); @@ -13849,8 +13845,6 @@ dwarf2_ranges_process (unsigned offset, struct dwarf2_cu *cu, dwarf_tag tag, } buffer = per_objfile->per_bfd->ranges.buffer + offset; - baseaddr = objfile->text_section_offset (); - while (1) { CORE_ADDR range_beginning, range_end; @@ -13901,7 +13895,7 @@ dwarf2_ranges_process (unsigned offset, struct dwarf2_cu *cu, dwarf_tag tag, /* A not-uncommon case of bad debug info. Don't pollute the addrmap with bad data. */ - if (range_beginning + baseaddr == 0 + if (range_beginning == 0 && !per_objfile->per_bfd->has_section_at_zero) { complaint (_(".debug_ranges entry has start address of zero" diff --git a/gdb/testsuite/gdb.dwarf2/dw2-zero-range-shlib.c b/gdb/testsuite/gdb.dwarf2/dw2-zero-range-shlib.c new file mode 100644 index 00000000000..1ddc8d6677b --- /dev/null +++ b/gdb/testsuite/gdb.dwarf2/dw2-zero-range-shlib.c @@ -0,0 +1,21 @@ +/* + Copyright 2021 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 . */ + +void +foo (void) +{ + asm ("foo_label: .globl foo_label"); +} diff --git a/gdb/testsuite/gdb.dwarf2/dw2-zero-range.c b/gdb/testsuite/gdb.dwarf2/dw2-zero-range.c new file mode 100644 index 00000000000..8d705cac44a --- /dev/null +++ b/gdb/testsuite/gdb.dwarf2/dw2-zero-range.c @@ -0,0 +1,24 @@ +/* + Copyright 2015-2021 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 . */ + +extern void foo (void); + +void +main (void) +{ + asm ("main_label: .globl main_label"); + foo (); +} diff --git a/gdb/testsuite/gdb.dwarf2/dw2-zero-range.exp b/gdb/testsuite/gdb.dwarf2/dw2-zero-range.exp new file mode 100644 index 00000000000..1805733db6c --- /dev/null +++ b/gdb/testsuite/gdb.dwarf2/dw2-zero-range.exp @@ -0,0 +1,97 @@ +# Copyright 2015-2021 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 . +load_lib dwarf.exp + +# This test can only be run on targets which support DWARF-2 and use gas. +if {![dwarf2_support]} { + verbose "Skipping $gdb_test_file_name." + return 0 +} + +if {[skip_shlib_tests]} { + return 0 +} + +# The .c files use __attribute__. +if [get_compiler_info] { + return -1 +} +if !$gcc_compiled { + verbose "Skipping $gdb_test_file_name." + return 0 +} + +standard_testfile .c -shlib.c -dw.S + +set asm_file [standard_output_file $srcfile3] +Dwarf::assemble $asm_file { + global srcdir subdir srcfile2 + declare_labels ranges_label + + cu {} { + compile_unit { + {language @DW_LANG_C} + {name $srcfile2} + {ranges ${ranges_label} DW_FORM_sec_offset} + } { + subprogram { + {external 1 flag} + {name foo} + } + } + } + + ranges {is_64 [is_64_target]} { + ranges_label: sequence { + base 0 + range 0 1 + } + } +} + +set lib1 [standard_output_file shr1.sl] +set lib_opts "nodebug" + +set sources [list ${srcdir}/${subdir}/$srcfile2 $asm_file] +if { [gdb_compile_shlib $sources ${lib1} $lib_opts] != "" } { + untested "failed to compile" + return -1 +} + +set exec_opts [list debug shlib=${lib1}] +set sources ${srcdir}/${subdir}/${srcfile} +if { [gdb_compile $sources ${binfile} executable \ + $exec_opts] != ""} { + untested "failed to compile" + return -1 +} + +clean_restart $binfile + +# Don't load the symbols for $lib1 during runto_main. +# Instead, we do this afterwards using "sharedlibrary $lib1". +gdb_test_no_output "set auto-solib-add off" + +if ![runto_main] { + return -1 +} + +# Test for presence of complaint. +set complaint_re ".debug_ranges entry has start address of zero" +set re \ + "During symbol reading: $complaint_re \\\[in module \[^\r\n\]*\\\]" +with_complaints 1 { + gdb_test "sharedlibrary $lib1" $re "Zero address complaint" +}