[V2,PR,gdb/17903] Implement to_pid_to_exec_file for solaris

Message ID CAEJ-0i_XGTYk==myhg1KEhicpPtvL0cSXz+8cyA4P1=UnhLXLA@mail.gmail.com
State New, archived
Headers

Commit Message

Brian Vandenberg Jan. 5, 2016, 7:27 p.m. UTC
  This patch is to address an issue in Solaris,
bug 17903.

This is my second submission for this issue with changes
made as requested by Pedro Alvez in December, as well
as adjustments to the changelog formatting as suggested
by Joel Brobecker.

The meat of the differences between the two patches: this
change only resolves the problem in Solaris 10+ and any
other OS using procfs that uses the same path convention.
In any other OS currently affected it will remain broken --
though Pedro indicated in an earlier message that Solaris
is the only OS of concern w/regard to gdb/procfs.c.

When attaching to a process by PID the current
implementation in gdb/procfs.c leaves
"to_pid_to_exec_file" at the default -- a stub
function that returns NULL.

This causes symbols not to load when attaching,
forcing the user to either attach by specifying
the path on the command line or inside gdb.
After specifying the file inside gdb it's also
necessary to manually load symbolic information.

The proposed change resembles the implementation
in gdb/linux-nat.c.

I don't have DejaGNU installed on my development
machines at work and I don't have one [that functions]
at home, so I was unable to run the test suite (otherwise
I would have).

Lastly: I made these changes on a machine that
doesn't have network access.  I had to hand-type
the following diff.  My apologies if there are
typos; I did my best.  Obviously I won't be able to
push this myself.

-brian
gdb/Changelog:
2015-12-16  Brian Vandenberg  <phantall@gmail.com>

	PR gdb/17903
	* procfs.c (inclusions): Included ansidecl.h for UNUSED_ARG
	(procfs_target): added procfs_child_pid_to_exec_file to target_ops
	(procfs_child_pid_to_exec_file): solaris implementation of
	to_pid_to_exec_file
  

Patch

diff --git a/gdb/procfs.c b/gdb/procfs.c
index 7b7ff45..a663223 100644
--- a/gdb/procfs.c
+++ b/gdb/procfs.c
@@ -51,6 +51,7 @@ 
 #include "auxv.h"
 #include "procfs.h"
 #include "observer.h"
+#include "ansidecl.h"

/* This module provides the interface between GDB and the
   /proc file system, which is used on many versions of Unix
@@ -118,6 +119,7 @@  static void procfs_fetch_registers (struct target_ops *,
                                    struct regcache *, int);
 static void procfs_store_registers (struct target_ops *,
                                    struct regcache *, int);
+static char* procfs_child_pid_to_exec_file( struct target_ops*, int );
 static void procfs_pass_signals (struct target_ops *self,
                                 int, unsigned char *);
 static void procfs_kill_inferior (struct target_ops *ops);
@@ -192,6 +194,7 @@ procfs_target (void)
   t->to_resume = procfs_resume;
   t->to_fetch_registers = procfs_fetch_registers;
   t->to_store_registers = procfs_store_registers;
+  t->to_pid_to_exec_file = procfs_child_pid_to_exec_file;
   t->to_xfer_partial = procfs_xfer_partial;
   t->to_pass_signals = procfs_pass_signals;
   t->to_files_info = procfs_files_info;
@@ -3301,6 +3304,41 @@  procfs_store_registers (struct target_ops *ops,
     }
 }

+/* Get a fully qualified path to the debugged process */
+static char* procfs_child_pid_to_exec_file( struct target_ops *ARG_UNUSED(self),
+                                          int pid )
+{
+  static char buf[PATH_MAX];
+  char name[PATH_MAX];
+  ssize_t sz = -1;
+
+  xsnprintf( name, sizeof(name), "/proc/%d/path/a.out", pid );
+  sz = readlink( name, buf, sizeof( name ) );
+
+  if( 0 < sz )
+  {
+    buf[sz] = '\0';
+    return buf;
+  }
+
+  /* This is the default behavior as defined in target.h
+   * and implemented in inf_child_pid_to_exec_file() */
+  return NULL;
+}
+