diff options
author | Mike Gulick <mike.gulick@mathworks.com> | 2017-10-30 18:13:44 -0400 |
---|---|---|
committer | Simon Marchi <simon.marchi@ericsson.com> | 2018-01-17 12:54:59 -0500 |
commit | 416675305692976aca45860e24b963982a2e682a (patch) | |
tree | 5999c0ba0fccc5fdffa709272d61b791747b3abd /gdb/gdb_bfd.h | |
parent | 4d9b86e17505063c96a01d40cdf5b4fc2080a798 (diff) | |
download | gdb-416675305692976aca45860e24b963982a2e682a.zip gdb-416675305692976aca45860e24b963982a2e682a.tar.gz gdb-416675305692976aca45860e24b963982a2e682a.tar.bz2 |
Fix gdb segv when objfile can't be opened
This fixes PR 16577.
This patch changes gdb_bfd_map_section to issue a warning rather than an error
if it is unable to read the object file, and sets the size of the section/frame
that it attempted to read to 0 on error.
The description of gdb_bfd_map_section states that it will try to read or map
the contents of the section SECT, and if successful, the section data is
returned and *SIZE is set to the size of the section data. This function was
throwing an error and leaving *SIZE as-is. Setting the section size to 0
indicates to dwarf2_build_frame_info that there is no data to read, otherwise
it will try to read from an invalid frame pointer.
Changing the error to a warning allows this to be handled gracefully.
Additionally, the error was clobbering the breakpoint output indicating the
current frame (function name, arguments, source file, and line number). E.g.
Thread 3 "foo" hit Breakpoint 1, BFD: reopening /tmp/jna-1013829440/jna2973250704389291330.tmp: No such file or directory
BFD: reopening /tmp/jna-1013829440/jna2973250704389291330.tmp: No such file or directory
(gdb)
While the "BFD: reopening ..." messages will still appear interspersed in the
breakpoint output, the current frame info is now displayed:
Thread 3 "foo" hit Breakpoint 1, BFD: reopening /tmp/jna-1013829440/jna1875755897659885075.tmp: No such file or directory
BFD: reopening /tmp/jna-1013829440/jna1875755897659885075.tmp: No such file or directory
warning: Can't read data for section '.eh_frame' in file '/tmp/jna-1013829440/jna1875755897659885075.tmp'
do_something () at file.cpp:80
80 {
(gdb)
Diffstat (limited to 'gdb/gdb_bfd.h')
-rw-r--r-- | gdb/gdb_bfd.h | 17 |
1 files changed, 8 insertions, 9 deletions
diff --git a/gdb/gdb_bfd.h b/gdb/gdb_bfd.h index ea3fdeb..2e4ac2c 100644 --- a/gdb/gdb_bfd.h +++ b/gdb/gdb_bfd.h @@ -115,15 +115,14 @@ void gdb_bfd_mark_parent (bfd *child, bfd *parent); void gdb_bfd_record_inclusion (bfd *includer, bfd *includee); -/* Try to read or map the contents of the section SECT. If - successful, the section data is returned and *SIZE is set to the - size of the section data; this may not be the same as the size - according to bfd_get_section_size if the section was compressed. - The returned section data is associated with the BFD and will be - destroyed when the BFD is destroyed. There is no other way to free - it; for temporary uses of section data, see - bfd_malloc_and_get_section. SECT may not have relocations. This - function will throw on error. */ +/* Try to read or map the contents of the section SECT. If successful, the + section data is returned and *SIZE is set to the size of the section data; + this may not be the same as the size according to bfd_get_section_size if the + section was compressed. The returned section data is associated with the BFD + and will be destroyed when the BFD is destroyed. There is no other way to + free it; for temporary uses of section data, see bfd_malloc_and_get_section. + SECT may not have relocations. If there is an error reading the section, + this issues a warning, sets *SIZE to 0, and returns NULL. */ const gdb_byte *gdb_bfd_map_section (asection *section, bfd_size_type *size); |