diff options
-rw-r--r-- | gdb/elfread.c | 9 | ||||
-rw-r--r-- | gdb/procfs.c | 92 |
2 files changed, 84 insertions, 17 deletions
diff --git a/gdb/elfread.c b/gdb/elfread.c index 3788fb4..c2d133c 100644 --- a/gdb/elfread.c +++ b/gdb/elfread.c @@ -281,10 +281,19 @@ elf_symfile_read (objfile, addr, mainline) bfd *abfd = objfile->obfd; struct elfinfo ei; struct cleanup *back_to; + asection *text_sect; init_minimal_symbol_collection (); back_to = make_cleanup (discard_minimal_symbols, 0); + /* Compute the amount to relocate all symbols by. The value passed in + as ADDR is typically either the actual address of the text section, + or a user specified address. By subtracting off the actual address + of the text section, we can compute the relocation amount. */ + + text_sect = bfd_get_section_by_name (objfile -> obfd, ".text"); + addr -= bfd_section_vma (objfile -> obfd, text_sect); + /* Process the normal ELF symbol table first. */ elf_symtab_read (abfd, addr, objfile); diff --git a/gdb/procfs.c b/gdb/procfs.c index 04fed86..dc5ae10 100644 --- a/gdb/procfs.c +++ b/gdb/procfs.c @@ -81,6 +81,9 @@ static struct procinfo pi; /* Inferior's process information */ /* Prototypes for local functions */ +static void +set_proc_siginfo PARAMS ((struct procinfo *, int)); + static int proc_address_to_fd PARAMS ((CORE_ADDR, int)); @@ -759,15 +762,7 @@ detach (signal) { if (signal) { - struct siginfo siginfo; - siginfo.si_signo = signal; - siginfo.si_code = 0; - siginfo.si_errno = 0; - if (ioctl (pi.fd, PIOCSSIG, &siginfo) < 0) - { - print_sys_errmsg (pi.pathname, errno); - printf ("PIOCSSIG failed.\n"); - } + set_proc_siginfo (&pi, signal); } if (ioctl (pi.fd, PIOCSEXIT, &pi.exitset) < 0) { @@ -979,6 +974,76 @@ proc_wait (statloc) /* +LOCAL FUNCTION + + set_proc_siginfo - set a process's current signal info + +SYNOPSIS + + void set_proc_siginfo (struct procinfo *pip, int signo); + +DESCRIPTION + + Given a pointer to a process info struct in PIP and a signal number + in SIGNO, set the process's current signal and its associated signal + information. The signal will be delivered to the process immediately + after execution is resumed, even if it is being held. In addition, + this particular delivery will not cause another PR_SIGNALLED stop + even if the signal is being traced. + + If we are not delivering the same signal that the prstatus siginfo + struct contains information about, then synthesize a siginfo struct + to match the signal we are doing to deliver, make it of the type + "generated by a user process", and send this synthesized copy. When + used to set the inferior's signal state, this will be required if we + are not currently stopped because of a traced signal, or if we decide + to continue with a different signal. + + Note that when continuing the inferior from a stop due to receipt + of a traced signal, we either have set PRCSIG to clear the existing + signal, or we have to call this function to do a PIOCSSIG with either + the existing siginfo struct from pr_info, or one we have synthesized + appropriately for the signal we want to deliver. Otherwise if the + signal is still being traced, the inferior will immediately stop + again. + + See siginfo(5) for more details. +*/ + +static void +set_proc_siginfo (pip, signo) + struct procinfo *pip; + int signo; +{ + struct siginfo newsiginfo; + struct siginfo *sip; + + if (pip -> valid) + { + if (signo == pip -> prstatus.pr_info.si_signo) + { + sip = &pip -> prstatus.pr_info; + } + else + { + (void) memset ((char *) &newsiginfo, 0, sizeof (newsiginfo)); + sip = &newsiginfo; + sip -> si_signo = signo; + sip -> si_code = 0; + sip -> si_errno = 0; + sip -> si_pid = getpid (); + sip -> si_uid = getuid (); + } + if (ioctl (pip -> fd, PIOCSSIG, sip) < 0) + { + print_sys_errmsg (pip -> pathname, errno); + warning ("PIOCSSIG failed"); + } + } +} + +/* + GLOBAL FUNCTION child_resume -- resume execution of the inferior process @@ -1012,14 +1077,7 @@ child_resume (step, signal) pi.prrun.pr_vaddr = (caddr_t) *(int *) ®isters[REGISTER_BYTE (PC_REGNUM)]; if (signal) { - if (signal != pi.prstatus.pr_cursig) - { - struct siginfo siginfo; - siginfo.si_signo = signal; - siginfo.si_code = 0; - siginfo.si_errno = 0; - (void) ioctl (pi.fd, PIOCSSIG, &siginfo); - } + set_proc_siginfo (&pi, signal); } else { |