mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-10-17 21:03:55 +08:00
* buildsym.c (finish_block): Fix thinko `inner block' complaints.
* dbxread.c (process_one_symbol): Parse N_OPT "gcc2_compiled.". * procfs.c (proc_set_exec_trap): Set run-on-last-close flag on child processes, to avoid dead ones "hanging around" after GDB exits. (attach): Always stop the process if it needs it. Set RLC flag when attaching running processes, so it will continue if we detach it, quit, or are killed. (detach): Clear faults and set RLC flag to make process run when we close it. (open_proc_file): New `mode' argument for O_RDONLY or O_RDWR. Callers changed. (info_proc): Open process O_RDONLY, so we can see any process, even those controlled by debuggers. * tm-sun4sol2.h (SUN_FIXED_LBRAC_BUG): They did (in Sol 2).
This commit is contained in:
@ -1,3 +1,20 @@
|
|||||||
|
Sun Jul 5 03:06:39 1992 John Gilmore (gnu at cygnus.com)
|
||||||
|
|
||||||
|
* buildsym.c (finish_block): Fix thinko `inner block' complaints.
|
||||||
|
* dbxread.c (process_one_symbol): Parse N_OPT "gcc2_compiled.".
|
||||||
|
* procfs.c (proc_set_exec_trap): Set run-on-last-close flag on
|
||||||
|
child processes, to avoid dead ones "hanging around" after GDB exits.
|
||||||
|
(attach): Always stop the process if it needs it. Set RLC flag
|
||||||
|
when attaching running processes, so it will continue if we detach
|
||||||
|
it, quit, or are killed.
|
||||||
|
(detach): Clear faults and set RLC flag to make process run
|
||||||
|
when we close it.
|
||||||
|
(open_proc_file): New `mode' argument for O_RDONLY or O_RDWR.
|
||||||
|
Callers changed.
|
||||||
|
(info_proc): Open process O_RDONLY, so we can see any process,
|
||||||
|
even those controlled by debuggers.
|
||||||
|
* tm-sun4sol2.h (SUN_FIXED_LBRAC_BUG): They did (in Sol 2).
|
||||||
|
|
||||||
Sat Jul 4 03:43:38 1992 John Gilmore (gnu at cygnus.com)
|
Sat Jul 4 03:43:38 1992 John Gilmore (gnu at cygnus.com)
|
||||||
|
|
||||||
Relocate symbols using an array of section_offsets, rather than a
|
Relocate symbols using an array of section_offsets, rather than a
|
||||||
|
@ -450,8 +450,10 @@ finish_block (symbol, listhead, old_blocks, start, end, objfile)
|
|||||||
amount of time. */
|
amount of time. */
|
||||||
if (BLOCK_START (pblock->block) < BLOCK_START (block)
|
if (BLOCK_START (pblock->block) < BLOCK_START (block)
|
||||||
|| BLOCK_END (pblock->block) > BLOCK_END (block)) {
|
|| BLOCK_END (pblock->block) > BLOCK_END (block)) {
|
||||||
complain(symbol? &innerblock_complaint : &innerblock_anon_complaint,
|
if (symbol)
|
||||||
SYMBOL_NAME (symbol));
|
complain(&innerblock_complaint, SYMBOL_NAME (symbol));
|
||||||
|
else
|
||||||
|
complain(&innerblock_anon_complaint, 0);
|
||||||
BLOCK_START (pblock->block) = BLOCK_START (block);
|
BLOCK_START (pblock->block) = BLOCK_START (block);
|
||||||
BLOCK_END (pblock->block) = BLOCK_END (block);
|
BLOCK_END (pblock->block) = BLOCK_END (block);
|
||||||
}
|
}
|
||||||
|
@ -1929,9 +1929,19 @@ process_one_symbol (type, desc, valu, name, section_offsets, objfile)
|
|||||||
define_symbol (valu, name, desc, type, objfile);
|
define_symbol (valu, name, desc, type, objfile);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
/* We use N_OPT to carry the gcc2_compiled flag. Sun uses it
|
||||||
|
for a bunch of other flags, too. Someday we may parse their
|
||||||
|
flags; for now we ignore theirs and hope they'll ignore ours. */
|
||||||
|
case N_OPT: /* Solaris 2: Compiler options */
|
||||||
|
if (name)
|
||||||
|
{
|
||||||
|
if (!strcmp (name, GCC2_COMPILED_FLAG_SYMBOL))
|
||||||
|
processing_gcc_compilation = 1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
/* The following symbol types can be ignored. */
|
/* The following symbol types can be ignored. */
|
||||||
case N_OBJ: /* Solaris 2: Object file dir and name */
|
case N_OBJ: /* Solaris 2: Object file dir and name */
|
||||||
case N_OPT: /* Solaris 2: Optimization level? */
|
|
||||||
/* N_UNDF: Solaris 2: file separator mark */
|
/* N_UNDF: Solaris 2: file separator mark */
|
||||||
/* N_UNDF: -- we will never encounter it, since we only process one
|
/* N_UNDF: -- we will never encounter it, since we only process one
|
||||||
file's symbols at once. */
|
file's symbols at once. */
|
||||||
|
99
gdb/procfs.c
99
gdb/procfs.c
@ -1,5 +1,5 @@
|
|||||||
/* Machine independent support for SVR4 /proc (process file system) for GDB.
|
/* Machine independent support for SVR4 /proc (process file system) for GDB.
|
||||||
Copyright (C) 1991 Free Software Foundation, Inc.
|
Copyright 1991, 1992 Free Software Foundation, Inc.
|
||||||
Written by Fred Fish at Cygnus Support.
|
Written by Fred Fish at Cygnus Support.
|
||||||
|
|
||||||
This file is part of GDB.
|
This file is part of GDB.
|
||||||
@ -362,7 +362,7 @@ static int
|
|||||||
proc_address_to_fd PARAMS ((CORE_ADDR, int));
|
proc_address_to_fd PARAMS ((CORE_ADDR, int));
|
||||||
|
|
||||||
static int
|
static int
|
||||||
open_proc_file PARAMS ((int, struct procinfo *));
|
open_proc_file PARAMS ((int, struct procinfo *, int));
|
||||||
|
|
||||||
static void
|
static void
|
||||||
close_proc_file PARAMS ((struct procinfo *));
|
close_proc_file PARAMS ((struct procinfo *));
|
||||||
@ -1279,7 +1279,7 @@ void
|
|||||||
inferior_proc_init (pid)
|
inferior_proc_init (pid)
|
||||||
int pid;
|
int pid;
|
||||||
{
|
{
|
||||||
if (!open_proc_file (pid, &pi))
|
if (!open_proc_file (pid, &pi, O_RDWR))
|
||||||
{
|
{
|
||||||
proc_init_failed ("can't open process file");
|
proc_init_failed ("can't open process file");
|
||||||
}
|
}
|
||||||
@ -1435,6 +1435,21 @@ proc_set_exec_trap ()
|
|||||||
#if defined (PIOCRFORK) /* Original method */
|
#if defined (PIOCRFORK) /* Original method */
|
||||||
ioctl (fd, PIOCRFORK, NULL);
|
ioctl (fd, PIOCRFORK, NULL);
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Turn on run-on-last-close flag so that this process will not hang
|
||||||
|
if GDB goes away for some reason. */
|
||||||
|
|
||||||
|
#if defined (PIOCSET) /* New method */
|
||||||
|
{
|
||||||
|
long pr_flags;
|
||||||
|
pr_flags = PR_RLC;
|
||||||
|
(void) ioctl (fd, PIOCSET, &pr_flags);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
#if defined (PIOCSRLC) /* Original method */
|
||||||
|
(void) ioctl (fd, PIOCSRLC, 0);
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1601,7 +1616,8 @@ NOTES
|
|||||||
|
|
||||||
The option of stopping at attach time is specific to the /proc
|
The option of stopping at attach time is specific to the /proc
|
||||||
versions of gdb. Versions using ptrace force the attachee
|
versions of gdb. Versions using ptrace force the attachee
|
||||||
to stop.
|
to stop. (I have changed this version to do so, too. All you
|
||||||
|
have to do is "continue" to make it go on. -- gnu@cygnus.com)
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@ -1609,7 +1625,9 @@ int
|
|||||||
attach (pid)
|
attach (pid)
|
||||||
int pid;
|
int pid;
|
||||||
{
|
{
|
||||||
if (!open_proc_file (pid, &pi))
|
int result;
|
||||||
|
|
||||||
|
if (!open_proc_file (pid, &pi, O_RDWR))
|
||||||
{
|
{
|
||||||
perror_with_name (pi.pathname);
|
perror_with_name (pi.pathname);
|
||||||
/* NOTREACHED */
|
/* NOTREACHED */
|
||||||
@ -1632,8 +1650,26 @@ attach (pid)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
pi.was_stopped = 0;
|
pi.was_stopped = 0;
|
||||||
if (query ("Process is currently running, stop it? "))
|
if (1 || query ("Process is currently running, stop it? "))
|
||||||
{
|
{
|
||||||
|
/* Make it run again when we close it. */
|
||||||
|
#if defined (PIOCSET) /* New method */
|
||||||
|
{
|
||||||
|
long pr_flags;
|
||||||
|
pr_flags = PR_RLC;
|
||||||
|
result = ioctl (pi.fd, PIOCSET, &pr_flags);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
#if defined (PIOCSRLC) /* Original method */
|
||||||
|
result = ioctl (pi.fd, PIOCSRLC, 0);
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
if (result < 0)
|
||||||
|
{
|
||||||
|
print_sys_errmsg (pi.pathname, errno);
|
||||||
|
close_proc_file (&pi);
|
||||||
|
error ("PIOCSRLC or PIOCSET failed");
|
||||||
|
}
|
||||||
if (ioctl (pi.fd, PIOCSTOP, &pi.prstatus) < 0)
|
if (ioctl (pi.fd, PIOCSTOP, &pi.prstatus) < 0)
|
||||||
{
|
{
|
||||||
print_sys_errmsg (pi.pathname, errno);
|
print_sys_errmsg (pi.pathname, errno);
|
||||||
@ -1647,7 +1683,7 @@ attach (pid)
|
|||||||
printf ("Ok, gdb will wait for process %u to stop.\n", pid);
|
printf ("Ok, gdb will wait for process %u to stop.\n", pid);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Remember some things about the inferior that we will, or might, change
|
/* Remember some things about the inferior that we will, or might, change
|
||||||
so that we can restore them when we detach. */
|
so that we can restore them when we detach. */
|
||||||
|
|
||||||
@ -1709,6 +1745,8 @@ void
|
|||||||
detach (signal)
|
detach (signal)
|
||||||
int signal;
|
int signal;
|
||||||
{
|
{
|
||||||
|
int result;
|
||||||
|
|
||||||
if (signal)
|
if (signal)
|
||||||
{
|
{
|
||||||
set_proc_siginfo (&pi, signal);
|
set_proc_siginfo (&pi, signal);
|
||||||
@ -1750,12 +1788,29 @@ detach (signal)
|
|||||||
if (signal || !pi.was_stopped ||
|
if (signal || !pi.was_stopped ||
|
||||||
query ("Was stopped when attached, make it runnable again? "))
|
query ("Was stopped when attached, make it runnable again? "))
|
||||||
{
|
{
|
||||||
memset (&pi.prrun, 0, sizeof (pi.prrun));
|
/* Clear any fault that might have stopped it. */
|
||||||
pi.prrun.pr_flags = PRCFAULT;
|
if (ioctl (pi.fd, PIOCCFAULT, 0))
|
||||||
if (ioctl (pi.fd, PIOCRUN, &pi.prrun))
|
{
|
||||||
|
print_sys_errmsg (pi.pathname, errno);
|
||||||
|
printf ("PIOCCFAULT failed.\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Make it run again when we close it. */
|
||||||
|
#if defined (PIOCSET) /* New method */
|
||||||
|
{
|
||||||
|
long pr_flags;
|
||||||
|
pr_flags = PR_RLC;
|
||||||
|
result = ioctl (pi.fd, PIOCSET, &pr_flags);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
#if defined (PIOCSRLC) /* Original method */
|
||||||
|
result = ioctl (pi.fd, PIOCSRLC, 0);
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
if (result)
|
||||||
{
|
{
|
||||||
print_sys_errmsg (pi.pathname, errno);
|
print_sys_errmsg (pi.pathname, errno);
|
||||||
printf ("PIOCRUN failed.\n");
|
printf ("PIOCSRLC or PIOCSET failed.\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2238,15 +2293,16 @@ LOCAL FUNCTION
|
|||||||
|
|
||||||
SYNOPSIS
|
SYNOPSIS
|
||||||
|
|
||||||
static int open_proc_file (pid, struct procinfo *pip)
|
static int open_proc_file (int pid, struct procinfo *pip, int mode)
|
||||||
|
|
||||||
DESCRIPTION
|
DESCRIPTION
|
||||||
|
|
||||||
Given a process id, close the existing open /proc entry (if any)
|
Given a process id and a mode, close the existing open /proc
|
||||||
and open one for the new process id. Once it is open, then
|
entry (if any) and open one for the new process id, in the
|
||||||
mark the local process information structure as valid, which
|
specified mode. Once it is open, then mark the local process
|
||||||
guarantees that the pid, fd, and pathname fields match an open
|
information structure as valid, which guarantees that the pid,
|
||||||
/proc entry. Returns zero if the open fails, nonzero otherwise.
|
fd, and pathname fields match an open /proc entry. Returns
|
||||||
|
zero if the open fails, nonzero otherwise.
|
||||||
|
|
||||||
Note that the pathname is left intact, even when the open fails,
|
Note that the pathname is left intact, even when the open fails,
|
||||||
so that callers can use it to construct meaningful error messages
|
so that callers can use it to construct meaningful error messages
|
||||||
@ -2254,11 +2310,12 @@ DESCRIPTION
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
static int
|
static int
|
||||||
open_proc_file (pid, pip)
|
open_proc_file (pid, pip, mode)
|
||||||
int pid;
|
int pid;
|
||||||
struct procinfo *pip;
|
struct procinfo *pip;
|
||||||
|
int mode;
|
||||||
{
|
{
|
||||||
pip -> valid = 0;
|
pip -> valid = 0; /* FIXME, what is this? ?! */
|
||||||
if (pip -> valid)
|
if (pip -> valid)
|
||||||
{
|
{
|
||||||
close (pip -> fd);
|
close (pip -> fd);
|
||||||
@ -2268,7 +2325,7 @@ open_proc_file (pid, pip)
|
|||||||
pip -> pathname = xmalloc (32);
|
pip -> pathname = xmalloc (32);
|
||||||
}
|
}
|
||||||
sprintf (pip -> pathname, PROC_NAME_FMT, pid);
|
sprintf (pip -> pathname, PROC_NAME_FMT, pid);
|
||||||
if ((pip -> fd = open (pip -> pathname, O_RDWR)) >= 0)
|
if ((pip -> fd = open (pip -> pathname, mode)) >= 0)
|
||||||
{
|
{
|
||||||
pip -> valid = 1;
|
pip -> valid = 1;
|
||||||
pip -> pid = pid;
|
pip -> pid = pid;
|
||||||
@ -2843,7 +2900,7 @@ info_proc (args, from_tty)
|
|||||||
pid = pii.pid;
|
pid = pii.pid;
|
||||||
pip = &pii;
|
pip = &pii;
|
||||||
memset (&pii, 0, sizeof (pii));
|
memset (&pii, 0, sizeof (pii));
|
||||||
if (!open_proc_file (pid, pip))
|
if (!open_proc_file (pid, pip, O_RDONLY))
|
||||||
{
|
{
|
||||||
perror_with_name (pip -> pathname);
|
perror_with_name (pip -> pathname);
|
||||||
/* NOTREACHED */
|
/* NOTREACHED */
|
||||||
|
@ -30,9 +30,16 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
|||||||
|
|
||||||
#define BLOCK_ADDRESS_FUNCTION_RELATIVE
|
#define BLOCK_ADDRESS_FUNCTION_RELATIVE
|
||||||
|
|
||||||
/* Variables in the debug stabs occur after the N_LBRAC, not before it. */
|
/* Variables in the debug stabs occur after the N_LBRAC, not before it,
|
||||||
|
in code generated by Sun C. */
|
||||||
|
|
||||||
#define VARIABLES_INSIDE_BLOCK(desc, gcc_p) (!gcc_p)
|
#define VARIABLES_INSIDE_BLOCK(desc, gcc_p) (!(gcc_p))
|
||||||
|
|
||||||
|
/* There's no need to correct LBRAC entries by guessing how they should
|
||||||
|
work. In fact, this is harmful because the LBRAC entries now all appear
|
||||||
|
at the end of the function, not intermixed with the SLINE entries. */
|
||||||
|
|
||||||
|
#define SUN_FIXED_LBRAC_BUG
|
||||||
|
|
||||||
/* May be needed, may be not? From Pace Willisson's port. FIXME. */
|
/* May be needed, may be not? From Pace Willisson's port. FIXME. */
|
||||||
#define PROLOGUE_FIRSTLINE_OVERLAP
|
#define PROLOGUE_FIRSTLINE_OVERLAP
|
||||||
|
Reference in New Issue
Block a user