From 416675305692976aca45860e24b963982a2e682a Mon Sep 17 00:00:00 2001 From: Mike Gulick Date: Mon, 30 Oct 2017 18:13:44 -0400 Subject: 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) --- gdb/testsuite/gdb.base/solib-vanish-main.c | 75 ++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 gdb/testsuite/gdb.base/solib-vanish-main.c (limited to 'gdb/testsuite/gdb.base/solib-vanish-main.c') diff --git a/gdb/testsuite/gdb.base/solib-vanish-main.c b/gdb/testsuite/gdb.base/solib-vanish-main.c new file mode 100644 index 0000000..a00ee17 --- /dev/null +++ b/gdb/testsuite/gdb.base/solib-vanish-main.c @@ -0,0 +1,75 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2017-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 . */ + +#include +#include +#include +#include +#include + +int +main () +{ + void *handle; + int (*foo) (int); + char *error; + char *dest = VANISH_LIB ".renamed"; + + /* Open library. */ + handle = dlopen (VANISH_LIB, RTLD_NOW); + if (!handle) + { + fprintf (stderr, "%s\n", dlerror ()); + exit (EXIT_FAILURE); + } + + /* Clear any existing error */ + dlerror (); + + /* Simulate deleting file by renaming it. */ + if (rename (VANISH_LIB, dest) == -1) + { + error = strerror (errno); + fprintf (stderr, "rename %s -> %s: %s\n", VANISH_LIB, dest, error); + exit (EXIT_FAILURE); + } + + /* Get function pointer. */ + foo = dlsym (handle, "foo"); + error = dlerror (); + if (error != NULL) + { + fprintf (stderr, "%s\n", error); + exit (EXIT_FAILURE); + } + + /* Call function. */ + (*foo) (1); + + /* Close and exit. */ + dlclose (handle); + + /* Put VANISH_LIB back where we found it. */ + if (rename (dest, VANISH_LIB) == -1) + { + error = strerror (errno); + fprintf (stderr, "rename %s -> %s: %s\n", dest, VANISH_LIB, error); + exit (EXIT_FAILURE); + } + + exit (EXIT_SUCCESS); +} -- cgit v1.1