+++ /dev/null
-Index: gdb-7.2.50.20110320/bfd/elf-bfd.h
-===================================================================
---- gdb-7.2.50.20110320.orig/bfd/elf-bfd.h 2011-03-20 15:17:42.000000000 +0100
-+++ gdb-7.2.50.20110320/bfd/elf-bfd.h 2011-03-20 15:24:02.000000000 +0100
-@@ -2193,8 +2193,10 @@ extern Elf_Internal_Phdr * _bfd_elf_find
- /* Exported interface for writing elf corefile notes. */
- extern char *elfcore_write_note
- (bfd *, char *, int *, const char *, int, const void *, int);
-+struct elf_prpsinfo;
-+typedef struct elf_prpsinfo prpsinfo_t;
- extern char *elfcore_write_prpsinfo
-- (bfd *, char *, int *, const char *, const char *);
-+ (bfd *, char *, int *, const prpsinfo_t *);
- extern char *elfcore_write_prstatus
- (bfd *, char *, int *, long, int, const void *);
- extern char * elfcore_write_pstatus
-Index: gdb-7.2.50.20110320/bfd/elf.c
-===================================================================
---- gdb-7.2.50.20110320.orig/bfd/elf.c 2011-03-20 15:17:42.000000000 +0100
-+++ gdb-7.2.50.20110320/bfd/elf.c 2011-03-20 15:24:02.000000000 +0100
-@@ -8814,13 +8814,12 @@ elfcore_write_note (bfd *abfd,
- return buf;
- }
-
--#if defined (HAVE_PRPSINFO_T) || defined (HAVE_PSINFO_T)
-+#if defined (HAVE_PRPSINFO_T)
- char *
- elfcore_write_prpsinfo (bfd *abfd,
- char *buf,
- int *bufsiz,
-- const char *fname,
-- const char *psargs)
-+ const prpsinfo_t *input)
- {
- const char *note_name = "CORE";
- const struct elf_backend_data *bed = get_elf_backend_data (abfd);
-@@ -8828,48 +8827,55 @@ elfcore_write_prpsinfo (bfd *abfd,
- if (bed->elf_backend_write_core_note != NULL)
- {
- char *ret;
-+ char fname[sizeof (input->pr_fname) + 1];
-+ char psargs[sizeof (input->pr_psargs) + 1];
-+
-+ strncpy (fname, input->pr_fname, sizeof (input->pr_fname));
-+ fname[sizeof (input->pr_fname)] = 0;
-+ strncpy (psargs, input->pr_psargs, sizeof (input->pr_psargs));
-+ psargs[sizeof (input->pr_psargs)] = 0;
-+
- ret = (*bed->elf_backend_write_core_note) (abfd, buf, bufsiz,
- NT_PRPSINFO, fname, psargs);
- if (ret != NULL)
- return ret;
- }
-
--#if defined (HAVE_PRPSINFO32_T) || defined (HAVE_PSINFO32_T)
-+#if defined (HAVE_PRPSINFO32_T)
- if (bed->s->elfclass == ELFCLASS32)
- {
--#if defined (HAVE_PSINFO32_T)
-- psinfo32_t data;
-- int note_type = NT_PSINFO;
--#else
- prpsinfo32_t data;
- int note_type = NT_PRPSINFO;
--#endif
-
- memset (&data, 0, sizeof (data));
-- strncpy (data.pr_fname, fname, sizeof (data.pr_fname));
-- strncpy (data.pr_psargs, psargs, sizeof (data.pr_psargs));
-+ data.pr_state = input->pr_state;
-+ data.pr_sname = input->pr_sname;
-+ data.pr_zomb = input->pr_zomb;
-+ data.pr_nice = input->pr_nice;
-+ data.pr_flag = input->pr_flag;
-+ data.pr_uid = input->pr_uid;
-+ data.pr_gid = input->pr_gid;
-+ data.pr_pid = input->pr_pid;
-+ data.pr_ppid = input->pr_ppid;
-+ data.pr_pgrp = input->pr_pgrp;
-+ data.pr_sid = input->pr_sid;
-+ BFD_ASSERT (sizeof (data.pr_fname) == sizeof (input->pr_fname));
-+ memcpy (data.pr_fname, input->pr_fname, sizeof (data.pr_fname));
-+ BFD_ASSERT (sizeof (data.pr_psargs) == sizeof (input->pr_psargs));
-+ memcpy (data.pr_psargs, input->pr_psargs, sizeof (data.pr_psargs));
- return elfcore_write_note (abfd, buf, bufsiz,
- note_name, note_type, &data, sizeof (data));
- }
- else
- #endif
- {
--#if defined (HAVE_PSINFO_T)
-- psinfo_t data;
-- int note_type = NT_PSINFO;
--#else
-- prpsinfo_t data;
- int note_type = NT_PRPSINFO;
--#endif
-
-- memset (&data, 0, sizeof (data));
-- strncpy (data.pr_fname, fname, sizeof (data.pr_fname));
-- strncpy (data.pr_psargs, psargs, sizeof (data.pr_psargs));
- return elfcore_write_note (abfd, buf, bufsiz,
-- note_name, note_type, &data, sizeof (data));
-+ note_name, note_type, input, sizeof (*input));
- }
- }
--#endif /* PSINFO_T or PRPSINFO_T */
-+#endif /* PRPSINFO_T */
-
- #if defined (HAVE_PRSTATUS_T)
- char *
-Index: gdb-7.2.50.20110320/gdb/linux-nat.c
-===================================================================
---- gdb-7.2.50.20110320.orig/gdb/linux-nat.c 2011-03-20 15:17:46.000000000 +0100
-+++ gdb-7.2.50.20110320/gdb/linux-nat.c 2011-03-20 15:25:36.000000000 +0100
-@@ -4603,6 +4603,131 @@ linux_spu_make_corefile_notes (bfd *obfd
- return args.note_data;
- }
-
-+/* Should be always true for Linux */
-+#define HAVE_PRPSINFO_T 1
-+
-+#if defined (HAVE_PRPSINFO_T)
-+
-+/* Fills struct elf_prpsinfo{32,64} as much as possible, imitate Linux kernel
-+ binfmt_elf.c. Unknown values are filled with zeroes. The structure is
-+ malloced. */
-+
-+static const prpsinfo_t *
-+fill_prpsinfo (void)
-+{
-+ struct stat sb;
-+ char filename[sizeof ("/proc//cmdline") + sizeof (int) * 3 + 2];
-+ char buf[1024];
-+ char proc_state[5];
-+ char proc_cmdline[sizeof (((struct elf_prpsinfo*)0)->pr_psargs) + 1];
-+ unsigned flags;
-+ long proc_nice;
-+ unsigned proc_ppid;
-+ unsigned proc_pgid;
-+ unsigned proc_sid;
-+ pid_t pid;
-+ int fd, n;
-+ char *cp, *proc_comm, *state_s;
-+ /* String comes from Linux kernel binfmt_elf.c FILL_PSINFO but it is already
-+ obsolete there to <linux/sched.h> TASK_* constants. */
-+ const char state_string[] = "RSDTZW";
-+ int state_num;
-+ static prpsinfo_t retval;
-+
-+ /* Get /proc/$PID/stat. */
-+ pid = ptid_get_pid (inferior_ptid);
-+ sprintf (filename, "/proc/%u/stat", (unsigned)pid);
-+ fd = open (filename, O_RDONLY);
-+ if (fd < 0)
-+ return NULL;
-+ fstat (fd, &sb); /* No error checking (can it ever happen?). */
-+ n = read (fd, buf, sizeof (buf) - 1);
-+ close (fd);
-+ if (n < 0)
-+ return NULL;
-+ buf[n] = 0;
-+
-+ cp = strrchr (buf, ')'); /* Split into "PID (COMM" and "<rest>". */
-+ if (!cp)
-+ return NULL;
-+ *cp = 0;
-+
-+ /* Grab COMM. */
-+ proc_comm = strchr (buf, '(');
-+ if (!proc_comm)
-+ return NULL;
-+ proc_comm++;
-+
-+ /* Read /proc/$PID/cmdline. */
-+ proc_cmdline[0] = 0;
-+ strcpy (strrchr (filename, '/'), "/cmdline");
-+ fd = open (filename, O_RDONLY);
-+ if (fd >= 0)
-+ {
-+ int n;
-+
-+ n = read (fd, proc_cmdline, sizeof (proc_cmdline) - 1);
-+ if (n < 0)
-+ n = 0;
-+ proc_cmdline[n] = 0;
-+ while (n--) /* Replace NULs with spaces. */
-+ if (proc_cmdline[n] == 0)
-+ proc_cmdline[n] = ' ';
-+ close (fd);
-+ }
-+
-+ /* Parse /proc/$PID/stat. */
-+ n = sscanf (cp + 2, /* skip ") " */
-+ "%4s %u " /* state, ppid */
-+ "%u %u %*s %*s " /* pgid, sid, tty, tpgid */
-+ "%u %*s %*s %*s " /* flags, min_flt, cmin_flt, maj_flt */
-+ "%*s " /* cmaj_flt */
-+ "%*s %*s " /* utime, stime */
-+ "%*s %*s %*s " /* cutime, cstime, priority */
-+ "%ld " /* nice */
-+ /*"%*s %*s " timeout, it_real_value */
-+ /*"%lu " start_time */
-+ /*"%lu " vsize */
-+ /*"%lu " rss */
-+ /*"%lu %lu %lu " rss_rlim, start_code, end_code */
-+ /*"%lu %lu %lu " start_stack, kstk_esp, kstk_eip */
-+ /*"%u %u %u %u " signal, blocked, sigignore, sigcatch */
-+ /*"%lu %lu %lu" wchan, nswap, cnswap */
-+ , proc_state, &proc_ppid,
-+ &proc_pgid, &proc_sid,
-+ &flags,
-+ &proc_nice);
-+ if (n != 6)
-+ return NULL;
-+
-+ state_s = strchr (state_string, proc_state[0]);
-+ if (state_s != NULL)
-+ state_num = state_s - state_string;
-+ else
-+ {
-+ /* 0 means Running, some more unusal state would be better. */
-+ state_num = 0;
-+ }
-+
-+ memset (&retval, 0, sizeof (retval));
-+ retval.pr_state = state_num;
-+ retval.pr_sname = proc_state[0];
-+ retval.pr_zomb = (proc_state[0] == 'Z');
-+ retval.pr_nice = proc_nice;
-+ retval.pr_flag = flags;
-+ retval.pr_uid = sb.st_uid;
-+ retval.pr_gid = sb.st_gid;
-+ retval.pr_pid = pid;
-+ retval.pr_ppid = proc_ppid;
-+ retval.pr_pgrp = proc_pgid;
-+ retval.pr_sid = proc_sid;
-+ strncpy (retval.pr_fname, proc_comm, sizeof (retval.pr_fname));
-+ strncpy (retval.pr_psargs, proc_cmdline, sizeof (retval.pr_psargs));
-+
-+ return &retval;
-+}
-+#endif
-+
- /* Fills the "to_make_corefile_note" target vector. Builds the note
- section for a corefile, and returns it in a malloc buffer. */
-
-@@ -4621,26 +4746,11 @@ linux_nat_make_corefile_notes (bfd *obfd
-
- if (get_exec_file (0))
- {
-- strncpy (fname, lbasename (get_exec_file (0)), sizeof (fname));
-- strncpy (psargs, get_exec_file (0), sizeof (psargs));
-- if (get_inferior_args ())
-- {
-- char *string_end;
-- char *psargs_end = psargs + sizeof (psargs);
--
-- /* linux_elfcore_write_prpsinfo () handles zero unterminated
-- strings fine. */
-- string_end = memchr (psargs, 0, sizeof (psargs));
-- if (string_end != NULL)
-- {
-- *string_end++ = ' ';
-- strncpy (string_end, get_inferior_args (),
-- psargs_end - string_end);
-- }
-- }
-+ const prpsinfo_t *data = fill_prpsinfo ();
-+
- note_data = (char *) elfcore_write_prpsinfo (obfd,
- note_data,
-- note_size, fname, psargs);
-+ note_size, data);
- }
-
- /* Dump information for threads. */
-Index: gdb-7.2.50.20110320/gdb/procfs.c
-===================================================================
---- gdb-7.2.50.20110320.orig/gdb/procfs.c 2011-03-09 13:48:55.000000000 +0100
-+++ gdb-7.2.50.20110320/gdb/procfs.c 2011-03-20 15:24:02.000000000 +0100
-@@ -5752,6 +5752,7 @@ procfs_make_note_section (bfd *obfd, int
- note_data = (char *) elfcore_write_prpsinfo (obfd,
- note_data,
- note_size,
-+ NULL,
- fname,
- psargs);
-