# HG changeset patch # Parent a7848e82a4d1e81ba23d3a82820e881924b84fdd Provide pid_to_exec_file on Solaris diff --git a/gdb/procfs.c b/gdb/procfs.c --- a/gdb/procfs.c +++ b/gdb/procfs.c @@ -128,6 +128,8 @@ public: const char *pid_to_str (ptid_t) override; + char *pid_to_exec_file (int pid) override; + thread_control_capabilities get_thread_control_capabilities () override { return tc_schedlock; } @@ -3135,6 +3137,35 @@ procfs_target::pid_to_str (ptid_t ptid) return buf; } +/* Accepts an integer PID; Returns a string representing a file that + can be opened to get the symbols for the child process. */ + +char * +procfs_target::pid_to_exec_file (int pid) +{ + static char buf[PATH_MAX]; + char name[PATH_MAX]; + + /* Solaris 11 introduced /proc//execname. */ + xsnprintf (name, PATH_MAX, "/proc/%d/execname", pid); + scoped_fd fd (open (name, O_RDONLY)); + if (fd.get () < 0 || read (fd.get (), buf, PATH_MAX - 1) < 0) + { + /* If that fails, fall back to /proc//path/a.out introduced in + Solaris 10. */ + ssize_t len; + + xsnprintf (name, PATH_MAX, "/proc/%d/path/a.out", pid); + len = readlink (name, buf, PATH_MAX - 1); + if (len <= 0) + strcpy (buf, name); + else + buf[len] = '\0'; + } + + return buf; +} + /* Insert a watchpoint. */ static int