gdb/Changelog: 2015-12-16 Brian Vandenberg PR gdb/17903 * gdb/procfs.c (inclusions): Included ansidecl.h for UNUSED_ARG (procfs_target): added procfs_child_pid_to_exec_file to target_ops struct (procfs_child_pid_to_exec_file): to_pid_to_exec_file implementation for solaris 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, } } +/* "self" may not exist on some platforms, + * otherwise that would be preferable to + * a format string. */ +static const char *proc_path_lookup[] = { + "/proc/%u/path/a.out" // Most UNIXes with procfs (Solaris) +, "/proc/%u/file" // BSD +, "/proc/%u/exe" // Linux, Windows, NetBSD +, "/proc/%u/a.out" // No idea, I've only seen references to it +}; + +/* 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] = {0}; + char name[PATH_MAX] = {0}; + ssize_t sz = -1; + size_t ii = 0; + + pid = pid >= 0 ? pid : -pid; + + for( ii = 0; ii < sizeof(proc_path_lookup)/sizeof(proc_path_lookup[0]); ++ii ) { + xsnprintf( name, sizeof(name), proc_path_lookup[ii], (unsigned int)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; +} +