mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-12-15 04:31:49 +08:00
ecf45d2cc7
The following testcases make GDB crash whenever an invalid sysroot is provided, when GDB is unable to find a valid path to the symbol file: gdb.base/catch-syscall.exp gdb.base/execl-update-breakpoints.exp gdb.base/foll-exec-mode.exp gdb.base/foll-exec.exp gdb.base/foll-vfork.exp gdb.base/pie-execl.exp gdb.multi/bkpt-multi-exec.exp gdb.python/py-finish-breakpoint.exp gdb.threads/execl.exp gdb.threads/non-ldr-exc-1.exp gdb.threads/non-ldr-exc-2.exp gdb.threads/non-ldr-exc-3.exp gdb.threads/non-ldr-exc-4.exp gdb.threads/thread-execl.exp The immediate cause of the segv is that follow_exec is passing a NULL argument (the result of exec_file_find) to strlen. However, the problem is deeper than that: follow_exec simply isn't prepared for the case where sysroot translation fails to locate the new executable. Actually all callers of exec_file_find have bugs due to confusion between host and target pathnames. This commit attempts to fix all that. In terms of the testcases that were formerly segv'ing, GDB now prints a warning but continues execution of the new program, so that the tests now mostly FAIL instead. You could argue the FAILs are due to a legitimate problem with the test environment setting up the sysroot translation incorrectly. A new representative test is added which exercises the ne wwarning code path even with native testing. Tested on x86_64 Fedora 23, native and gdbserver. gdb/ChangeLog: 2016-10-25 Sandra Loosemore <sandra@codesourcery.com> Luis Machado <lgustavo@codesourcery.com> Pedro Alves <palves@redhat.com> PR gdb/20569 * exceptions.c (exception_print_same): Moved here from exec.c. * exceptions.h (exception_print_same): Declare. * exec.h: Include "symfile-add-flags.h". (try_open_exec_file): New declaration. * exec.c (exception_print_same): Moved to exceptions.c. (try_open_exec_file): New function. (exec_file_locate_attach): Rename exec_file and full_exec_path variables to avoid confusion between target and host pathnames. Move pathname processing logic to exec_file_find. Do not return early if pathname lookup fails; Call try_open_exec_file. * infrun.c (follow_exec): Split and rename execd_pathname variable to avoid confusion between target and host pathnames. Warn if pathname lookup fails. Pass target pathname to target_follow_exec, not hostpathname. Call try_open_exec_file. * main.c (symbol_file_add_main_adapter): New function. (captured_main_1): Use it. * solib-svr4.c (open_symbol_file_object): Adjust to pass symfile_add_flags to symbol_file_add_main. * solib.c (exec_file_find): Incorporate fallback logic for relative pathnames formerly in exec_file_locate_attach. * symfile.c (symbol_file_add_main, symbol_file_add_main_1): Replace 'from_tty' parameter with a symfile_add_file. (symbol_file_command): Adjust to pass symfile_add_flags to symbol_file_add_main. * symfile.h (symbol_file_add_main): Replace 'from_tty' parameter with a symfile_add_file. gdb/testsuite/ChangeLog: 2016-10-25 Luis Machado <lgustavo@codesourcery.com> * gdb.base/exec-invalid-sysroot.exp: New file.
125 lines
4.2 KiB
C
125 lines
4.2 KiB
C
/* Work with executable files, for GDB, the GNU debugger.
|
|
|
|
Copyright (C) 2003-2016 Free Software Foundation, Inc.
|
|
|
|
This file is part of GDB.
|
|
|
|
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 <http://www.gnu.org/licenses/>. */
|
|
|
|
#ifndef EXEC_H
|
|
#define EXEC_H
|
|
|
|
#include "target.h"
|
|
#include "progspace.h"
|
|
#include "memrange.h"
|
|
#include "symfile-add-flags.h"
|
|
|
|
struct target_section;
|
|
struct target_ops;
|
|
struct bfd;
|
|
struct objfile;
|
|
|
|
#define exec_bfd current_program_space->ebfd
|
|
#define exec_bfd_mtime current_program_space->ebfd_mtime
|
|
#define exec_filename current_program_space->pspace_exec_filename
|
|
|
|
/* Builds a section table, given args BFD, SECTABLE_PTR, SECEND_PTR.
|
|
Returns 0 if OK, 1 on error. */
|
|
|
|
extern int build_section_table (struct bfd *, struct target_section **,
|
|
struct target_section **);
|
|
|
|
/* Remove all entries from TABLE. */
|
|
|
|
extern void clear_section_table (struct target_section_table *table);
|
|
|
|
/* Read from mappable read-only sections of BFD executable files.
|
|
Return TARGET_XFER_OK, if read is successful. Return
|
|
TARGET_XFER_EOF if read is done. Return TARGET_XFER_E_IO
|
|
otherwise. */
|
|
|
|
extern enum target_xfer_status
|
|
exec_read_partial_read_only (gdb_byte *readbuf, ULONGEST offset,
|
|
ULONGEST len, ULONGEST *xfered_len);
|
|
|
|
/* Read or write from mappable sections of BFD executable files.
|
|
|
|
Request to transfer up to LEN 8-bit bytes of the target sections
|
|
defined by SECTIONS and SECTIONS_END. The OFFSET specifies the
|
|
starting address.
|
|
If SECTION_NAME is not NULL, only access sections with that same
|
|
name.
|
|
|
|
Return the number of bytes actually transfered, or zero when no
|
|
data is available for the requested range.
|
|
|
|
This function is intended to be used from target_xfer_partial
|
|
implementations. See target_read and target_write for more
|
|
information.
|
|
|
|
One, and only one, of readbuf or writebuf must be non-NULL. */
|
|
|
|
extern enum target_xfer_status
|
|
section_table_xfer_memory_partial (gdb_byte *,
|
|
const gdb_byte *,
|
|
ULONGEST, ULONGEST, ULONGEST *,
|
|
struct target_section *,
|
|
struct target_section *,
|
|
const char *);
|
|
|
|
/* Read from mappable read-only sections of BFD executable files.
|
|
Similar to exec_read_partial_read_only, but return
|
|
TARGET_XFER_UNAVAILABLE if data is unavailable. */
|
|
|
|
extern enum target_xfer_status
|
|
section_table_read_available_memory (gdb_byte *readbuf, ULONGEST offset,
|
|
ULONGEST len, ULONGEST *xfered_len);
|
|
|
|
/* Set the loaded address of a section. */
|
|
extern void exec_set_section_address (const char *, int, CORE_ADDR);
|
|
|
|
/* Remove all target sections owned by OWNER. */
|
|
|
|
extern void remove_target_sections (void *owner);
|
|
|
|
/* Add the sections array defined by [SECTIONS..SECTIONS_END[ to the
|
|
current set of target sections. */
|
|
|
|
extern void add_target_sections (void *owner,
|
|
struct target_section *sections,
|
|
struct target_section *sections_end);
|
|
|
|
/* Add the sections of OBJFILE to the current set of target sections.
|
|
* OBJFILE owns the new target sections. */
|
|
|
|
extern void add_target_sections_of_objfile (struct objfile *objfile);
|
|
|
|
/* Prints info about all sections defined in the TABLE. ABFD is
|
|
special cased --- it's filename is omitted; if it is the executable
|
|
file, its entry point is printed. */
|
|
|
|
extern void print_section_info (struct target_section_table *table,
|
|
bfd *abfd);
|
|
|
|
extern void exec_close (void);
|
|
|
|
/* Helper function that attempts to open the symbol file at EXEC_FILE_HOST.
|
|
If successful, it proceeds to add the symbol file as the main symbol file.
|
|
|
|
ADD_FLAGS is passed on to the function adding the symbol file. */
|
|
extern void try_open_exec_file (const char *exec_file_host,
|
|
struct inferior *inf,
|
|
symfile_add_flags add_flags);
|
|
#endif
|