Go to file
Tom de Vries 3ee6bb113a [gdb/symtab] Fix incomplete CU list assert in .debug_names
Consider the following two-file test-case:
...
$ cat main.c
extern int foo (void);

int
main (void)
{
  int sum, a, b;
  sum = a + b + foo ();
  return sum;
}
$ cat foo.c
int
foo (void)
{
  return 3;
}
...

Compiled like this:
...
$ clang-10 -gdwarf-5 -gpubnames -c main.c
$ clang-10 -gdwarf-5 -c foo.c
$ clang-10 -gdwarf-5 -gpubnames main.o foo.o
...

When loading this exec into gdb, we run into this assert:
...
$ gdb a.out
Reading symbols from a.out...

warning: Section .debug_aranges in a.out entry at offset 0 \
  debug_info_offset 0 does not exists, ignoring .debug_aranges.
src/gdb/dwarf2/read.c:6949: \
  internal-error: cutu_reader::cutu_reader(dwarf2_per_cu_data*, \
  		                           abbrev_table*, int, bool): \
  Assertion `this_cu->length == cu->header.get_length ()' failed.
...

The problem is that the determined length of the CU:
...
(gdb) p /x this_cu->length
$4 = 0x26a
...
does not match the actual length:
...
(gdb) p /x cu->header.get_length ()
$5 = 0x59
...

The length of the CU is determined in create_cus_from_debug_names_list, and
set based on this list in the .debug_names section:
...
  Compilation Unit offsets [
    CU[0]: 0x000000c7
  ]
...
and it is assumed that this is a complete list, so the size of the CU is
calculated using the end of the .debug_section at 0x331, making it 0x331 -
0xc7 == 0x26a.

However, the CU list is not complete:
...
$ llvm-dwarfdump -debug-info a.out \
  | grep "Compile Unit" \
  | sed 's/Compile Unit.*//'
0x00000000:
0x0000002e:
0x000000a5:
0x000000c7:
0x00000120:
0x00000157:
0x0000030f:
...
In particular, because the CU for foo.c is there at 0x120 (the rest of the CUs
is due to openSUSE having debug info for various linked in objects).

Fix the assert by not assuming to know the length of CUs in
create_cus_from_debug_names_list (if the .debug_names is not produced by GDB),
and setting it to 0, and setting it later to the actual length.

Note that this does not fix the .debug_aranges warning, that's PR25969.

Build and tested on x86_64-linux, with native and debug-names.

gdb/ChangeLog:

2020-05-11  Tom de Vries  <tdevries@suse.de>

	PR symtab/25941
	* dwarf2/read.c (create_cus_from_debug_names_list): Initialize CUs
	with length 0, if not gdb-produced.
	(cutu_reader::cutu_reader): Set CU length to actual length if 0.

gdb/testsuite/ChangeLog:

2020-05-11  Tom de Vries  <tdevries@suse.de>

	PR symtab/25941
	* gdb.dwarf2/clang-debug-names.exp.in: New include exp file, factored
	out of ...
	* gdb.dwarf2/clang-debug-names.exp: ... here.
	* gdb.dwarf2/clang-debug-names-2.exp: New file.  Include
	clang-debug-names.exp.in.
	* gdb.dwarf2/clang-debug-names-2-foo.c: New test.
	* gdb.dwarf2/clang-debug-names-2.c: New test.
2020-05-11 15:03:54 +02:00
bfd Power10 VSX 32-byte storage access 2020-05-11 21:08:37 +09:30
binutils objcopy: Mention 'entry address' in description 2020-05-07 11:39:39 +01:00
config Sync config and libiberty with GCC 2020-04-29 14:25:36 -07:00
contrib contrib: Update dg-extract-results.* from gcc 2019-10-21 15:26:48 +01:00
cpu cpu,gas,opcodes: support for eBPF JMP32 instruction class 2020-04-16 09:52:57 +02:00
elfcpp Add markers for 2.34 branch to the NEWS files and ChangeLogs. 2020-01-18 13:50:25 +00:00
etc texi2pod.pl: import support for @t{...} from gcc 2020-01-15 12:58:09 -05:00
gas Power10 VSX scalar min-max-compare quad precision operations 2020-05-11 21:08:38 +09:30
gdb [gdb/symtab] Fix incomplete CU list assert in .debug_names 2020-05-11 15:03:54 +02:00
gdbserver Implement debugging of WOW64 processes in gdbserver 2020-04-30 18:30:20 +02:00
gdbsupport Fix typo (thead -> thread) 2020-04-28 11:38:26 +02:00
gnulib gdb: update gnulib import 2020-02-22 20:37:18 -05:00
gold PowerPC Rename powerxx to power10 2020-05-11 21:08:36 +09:30
gprof Updated French translation for the gprof sub-directory. 2020-05-07 10:48:21 +01:00
include Power10 Reduced precision outer product operations 2020-05-11 21:08:37 +09:30
intl Regen with blessed automake-1.15.1 2020-02-20 13:02:24 +10:30
ld Power10 VSX 32-byte storage access 2020-05-11 21:08:37 +09:30
libctf libctf: Mark bswap_identity_64 inline function as static. 2020-03-11 17:48:49 +10:30
libdecnumber Merge config/ changes from GCC. 2018-10-31 17:16:41 +00:00
libiberty Sync config and libiberty with GCC 2020-04-29 14:25:36 -07:00
opcodes Power10 VSX scalar min-max-compare quad precision operations 2020-05-11 21:08:38 +09:30
readline Fix compilation of Readline on mingw.org's MinGW 2019-12-23 16:28:32 +02:00
sim sim: ppc: netbsd: Sync signal names with NetBSD 9.99.49 2020-03-12 16:07:37 +01:00
texinfo
zlib Merge changes from GCC for the config/ directory 2020-02-19 17:51:24 +00:00
.cvsignore
.gitattributes
.gitignore Add profiling outputs to .gitignore 2019-12-26 06:54:58 +01:00
ar-lib Bump to autoconf 2.69 and automake 1.15.1 2018-06-19 16:55:06 -04:00
ChangeLog Since the pdp11-aout target does not support gdb, gdbserver or gprof these should be excluded in configure. 2020-04-21 10:27:50 +01:00
compile
config-ml.in
config.guess Update top level config files with copies from the official repository. 2020-01-18 13:43:19 +00:00
config.rpath
config.sub Update top level config files with copies from the official repository. 2020-01-18 13:43:19 +00:00
configure Since the pdp11-aout target does not support gdb, gdbserver or gprof these should be excluded in configure. 2020-04-21 10:27:50 +01:00
configure.ac Since the pdp11-aout target does not support gdb, gdbserver or gprof these should be excluded in configure. 2020-04-21 10:27:50 +01:00
COPYING
COPYING3
COPYING3.LIB
COPYING.LIB
COPYING.LIBGLOSS
COPYING.NEWLIB
depcomp
djunpack.bat
install-sh
libtool.m4 Bump to autoconf 2.69 and automake 1.15.1 2018-06-19 16:55:06 -04:00
lt~obsolete.m4
ltgcc.m4
ltmain.sh
ltoptions.m4
ltsugar.m4
ltversion.m4
MAINTAINERS Move gdbserver to top level 2020-02-07 08:42:25 -07:00
Makefile.def Change gdbserver to use existing gdbsupport 2020-03-12 13:32:16 -06:00
Makefile.in Change gdbserver to use existing gdbsupport 2020-03-12 13:32:16 -06:00
Makefile.tpl Revert "Sync top level files with versions from gcc." 2019-05-30 11:17:19 +01:00
makefile.vms
missing
mkdep
mkinstalldirs
move-if-change
multilib.am Merge autoconf / automake update changes from GCC. 2018-10-31 17:10:56 +00:00
README
README-maintainer-mode Bump to autoconf 2.69 and automake 1.15.1 2018-06-19 16:55:06 -04:00
setup.com
src-release.sh Move gdbserver to top level 2020-02-07 08:42:25 -07:00
symlink-tree
test-driver Bump to autoconf 2.69 and automake 1.15.1 2018-06-19 16:55:06 -04:00
ylwrap

		   README for GNU development tools

This directory contains various GNU compilers, assemblers, linkers, 
debuggers, etc., plus their support routines, definitions, and documentation.

If you are receiving this as part of a GDB release, see the file gdb/README.
If with a binutils release, see binutils/README;  if with a libg++ release,
see libg++/README, etc.  That'll give you info about this
package -- supported targets, how to use it, how to report bugs, etc.

It is now possible to automatically configure and build a variety of
tools with one command.  To build all of the tools contained herein,
run the ``configure'' script here, e.g.:

	./configure 
	make

To install them (by default in /usr/local/bin, /usr/local/lib, etc),
then do:
	make install

(If the configure script can't determine your type of computer, give it
the name as an argument, for instance ``./configure sun4''.  You can
use the script ``config.sub'' to test whether a name is recognized; if
it is, config.sub translates it to a triplet specifying CPU, vendor,
and OS.)

If you have more than one compiler on your system, it is often best to
explicitly set CC in the environment before running configure, and to
also set CC when running make.  For example (assuming sh/bash/ksh):

	CC=gcc ./configure
	make

A similar example using csh:

	setenv CC gcc
	./configure
	make

Much of the code and documentation enclosed is copyright by
the Free Software Foundation, Inc.  See the file COPYING or
COPYING.LIB in the various directories, for a description of the
GNU General Public License terms under which you can copy the files.

REPORTING BUGS: Again, see gdb/README, binutils/README, etc., for info
on where and how to report problems.