2
0
mirror of https://sourceware.org/git/binutils-gdb.git synced 2025-02-23 13:21:43 +08:00
Commit Graph

8 Commits

Author SHA1 Message Date
Joel Brobecker
4a94e36819 Automatic Copyright Year update after running gdb/copyright.py
This commit brings all the changes made by running gdb/copyright.py
as per GDB's Start of New Year Procedure.

For the avoidance of doubt, all changes in this commits were
performed by the script.
2022-01-01 19:13:23 +04:00
Andrew Burgess
1fd999d909 gdb: Handle missing .debug_str section
While messing with the Dwarf assembler (gdb/testsuite/lib/dwarf.exp) I
managed to create an ELF which made use of DW_FORM_strp, but didn't
include a .debug_str section.

When I started GDB on this ELF, GDB crashed.  I would have expected to
get an error instead.

I tracked this down to an unfortunate design choice in
dwarf2_section_info, a class which wraps around a bfd section, and is
used for reading in debug information.  GBB creates many
dwarf2_section_info objects, one for each debug section that might
need to be read, then as we find the input bfd sections we associate
them with the corresponding dwarf2_section_info.

If no matching input bfd section is found then the dwarf2_section_info
is left in an unassociated state, its internal bfd section pointer is
null.

If later GDB tries to read content from the dwarf2_section_info, for
example, which trying to read the string associated with DW_FORM_strp,
we spot that there is no associated bfd section and issue an error
message.

To make the users life easier, the error message includes the section
name being looked for, and the bfd from which the section was
obtained.

However, we get the section name by calling bfd_section_name on the
associated section, and we get the bfd filename by calling
bfd_get_filename on the owner of the associated section.

Of course, if there is no associated section then both the calls
bfd_section_name and dwarf2_section_info::get_bfd_owner will result in
undefined behaviour (e.g. a crash).

The solution I propose in this patch is, I know, not ideal.  I simply
spot the case where there is no associated section, and print a
simpler error message, leaving out the section name and filename.

A better solution would involve redesigning dwarf2_section_info, we
could associate each dwarf2_section_info with the initial bfd being
parsed.  We would then display this filename if there's nothing better
to display (e.g. if we find a section in a dwo/dwp split dwarf file
then we would probably use that filename in preference).

Each dwarf2_section_info could also have the concept of the default
section name that would be read for that section, for example, string
data might appear in ".debug_str" or ".zdebug_str", but if neither is
found, then it would probably be OK to just say ".debug_str" is
missing.

Anyway, I didn't do any of that redesign, I just wanted to stop GDB
crashing for now, so instead we get this:

  Dwarf Error: DW_FORM_strp used without required section

Which isn't the best, but in context, isn't too bad:

  Reading symbols from /path/to/executable...
  Dwarf Error: DW_FORM_strp used without required section
  (No debugging symbols found in /path/to/executable)

I also added some asserts into dwarf2_section_info which should
trigger before GDB crashes in future, if we trigger any other bad
paths through this code.

And there's a test for the specific issue I hit.

gdb/ChangeLog:

	* dwarf2/section.c (dwarf2_section_info::get_bfd_owner): Add an
	assert.
	(dwarf2_section_info::get_file_name): Add an assert.
	(dwarf2_section_info::read_string): Display a minimal, sane error
	when the dwarf2_section_info is not associated with a bfd section.

gdb/testsuite/ChangeLog:

	* gdb.dwarf2/dw2-using-debug-str.exp: Add an additional test.
2021-04-07 11:31:30 +01:00
Joel Brobecker
3666a04883 Update copyright year range in all GDB files
This commits the result of running gdb/copyright.py as per our Start
of New Year procedure...

gdb/ChangeLog

        Update copyright year range in copyright header of all GDB files.
2021-01-01 12:12:21 +04:00
Tom Tromey
4f44ae6c69 Add dwarf2_section_info::read_string method
This moves a string-reading function to be a method on
dwarf2_section_info, and then updates the users.

gdb/ChangeLog
2020-03-26  Tom Tromey  <tom@tromey.com>

	* dwarf2/section.h (struct dwarf2_section_info) <read_string>: New
	method.
	* dwarf2/section.c: New method.  From
	read_indirect_string_at_offset_from.
	* dwarf2/read.c (mapped_debug_names::namei_to_name): Update.
	(read_indirect_string_at_offset_from): Move to section.c.
	(read_indirect_string_at_offset): Rewrite.
	(read_indirect_line_string_at_offset): Remove.
	(read_indirect_string, read_indirect_line_string)
	(dwarf_decode_macro_bytes): Update.
2020-03-26 09:28:14 -06:00
Tom Tromey
a0194fa8f2 Convert dwarf2_section_buffer_overflow_complaint to a method
This changes dwarf2_section_buffer_overflow_complaint to be a method
on dwarf2_section_info.

gdb/ChangeLog
2020-03-26  Tom Tromey  <tom@tromey.com>

	* dwarf2/section.h (struct dwarf2_section_info)
	<overload_complaint>: Declare.
	(dwarf2_section_buffer_overflow_complaint): Don't declare.
	* dwarf2/section.c (dwarf2_section_info::overflow_complaint):
	Rename from dwarf2_section_buffer_overflow_complaint.
	* dwarf2/read.c (skip_one_die, partial_die_info::read)
	(skip_form_bytes, dwarf_decode_macro_bytes): Update.
2020-03-26 09:28:13 -06:00
Tom Tromey
3d27bbdb4b Move dwarf2_section_buffer_overflow_complaint to dwarf2/section.c
This moves dwarf2_section_buffer_overflow_complaint to
dwarf2/section.c.

gdb/ChangeLog
2020-03-26  Tom Tromey  <tom@tromey.com>

	* dwarf2/section.h (dwarf2_section_buffer_overflow_complaint):
	Declare.
	* dwarf2/section.c (dwarf2_section_buffer_overflow_complaint):
	Move from read.c.
	* dwarf2/read.c (dwarf2_section_buffer_overflow_complaint): Move
	to section.c.
2020-03-26 09:28:12 -06:00
Tom Tromey
96b792931f Change section functions to be methods of dwarf2_section_info
This changes various section-related functions to be methods on
dwarf2_section_info.  I think this clarifies the role of these
functions.  This also changes one such function to return bool.

gdb/ChangeLog
2020-02-08  Tom Tromey  <tom@tromey.com>

	* dwarf2read.c (dwarf2_section_buffer_overflow_complaint)
	(dwarf2_section_size, dwarf2_get_section_info)
	(create_signatured_type_table_from_debug_names)
	(create_addrmap_from_aranges, read_debug_names_from_section)
	(get_gdb_index_contents_from_section, read_comp_unit_head)
	(error_check_comp_unit_head, read_abbrev_offset)
	(create_debug_type_hash_table, init_cu_die_reader)
	(read_cutu_die_from_dwo, dwarf2_build_psymtabs_hard)
	(read_comp_units_from_section, create_cus_hash_table)
	(create_dwp_hash_table, create_dwo_unit_in_dwp_v1)
	(create_dwp_v2_section, dwarf2_rnglists_process)
	(dwarf2_ranges_process, read_die_and_siblings, read_full_die)
	(abbrev_table_read_table, read_indirect_string_at_offset_from)
	(read_indirect_string_from_dwz, read_addr_index_1)
	(read_str_index, dwarf_decode_line_header, skip_form_bytes)
	(dwarf_decode_macro_bytes, dwarf_decode_macros)
	(fill_in_loclist_baton): Update.
	* dwarf2/section.h (struct dwarf2_section_info) <get_name,
	get_containing_section, get_bfd_owner, get_bfd_section,
	get_file_name, get_id, get_flags, empty, read>: Declare methods.
	(dwarf2_read_section, get_section_name, get_section_file_name)
	(get_containing_section, get_section_bfd_owner)
	(get_section_bfd_section, get_section_name, get_section_file_name)
	(get_section_id, get_section_flags, dwarf2_section_empty_p): Don't
	declare.
	* dwarf2/section.c (dwarf2_section_info::get_containing_section)
	(dwarf2_section_info::get_bfd_owner)
	(dwarf2_section_info::get_bfd_section)
	(dwarf2_section_info::get_name)
	(dwarf2_section_info::get_file_name, dwarf2_section_info::get_id)
	(dwarf2_section_info::get_flags, dwarf2_section_info::empty)
	(dwarf2_section_info::read): Now methods.
	* dwarf-index-write.c (class debug_names): Update.

Change-Id: Ic849f182f57a18bad6b1c7c3b9368005d307758a
2020-02-08 13:40:55 -07:00
Tom Tromey
2c86cff96f Create dwarf2/section.[ch]
This moves some section-handling code from dwarf2read.c into new
files, dwarf2/section.[ch].

gdb/ChangeLog
2020-02-08  Tom Tromey  <tom@tromey.com>

	* dwarf2read.h (struct dwarf2_section_info, dwarf2_read_section):
	Move to dwarf2/section.h.
	* dwarf2read.c (get_containing_section, get_section_bfd_owner)
	(get_section_bfd_section, get_section_name)
	(get_section_file_name, get_section_id, get_section_flags)
	(dwarf2_section_empty_p, dwarf2_read_section): Moe to
	dwarf2/section.c.
	* dwarf2/section.h: New file.
	* dwarf2/section.c: New file, from dwarf2read.c.
	* Makefile.in (COMMON_SFILES): Add dwarf2/section.c.

Change-Id: I9f8498094cf99d9521e9481622ce8adbd453daf4
2020-02-08 13:40:54 -07:00