aboutsummaryrefslogtreecommitdiff
path: root/gdb
diff options
context:
space:
mode:
authorRainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>2018-09-20 11:23:27 +0200
committerRainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>2018-09-20 11:23:27 +0200
commit4206c05ea1542c413a4a361c29cbbd206861946c (patch)
tree17ea384e07a0be13abd196afb3127f8b78b7517b /gdb
parent3d282ac37064ec0105d3aa3f379f7fb8af98759c (diff)
downloadgdb-4206c05ea1542c413a4a361c29cbbd206861946c.zip
gdb-4206c05ea1542c413a4a361c29cbbd206861946c.tar.gz
gdb-4206c05ea1542c413a4a361c29cbbd206861946c.tar.bz2
Provide pid_to_exec_file on Solaris (PR tdep/17903)
While looking through gdb.log, I found that two tests FAIL like this: warning: No executable has been specified and target does not support determining executable automatically. Try using the "file" command. 0x00400dc4 in ?? () (gdb) FAIL: gdb.base/attach.exp: attach2, with no file The other is gdb.base/quit-live.exp. I've implemented the following patch that fixes both failures, only then detecting that I'd previously reported the issue as PR tdep/17903. Tested on amd64-pc-solaris2.10 and amd64-pc-solaris2.11. PR tdep/17903 * procfs.c (procfs_target): Declare pid_to_exec_file. (procfs_target::pid_to_exec_file): New.
Diffstat (limited to 'gdb')
-rw-r--r--gdb/ChangeLog6
-rw-r--r--gdb/procfs.c31
2 files changed, 37 insertions, 0 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index d0f3fe3..c767fcd 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,11 @@
2018-09-20 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
+ PR tdep/17903
+ * procfs.c (procfs_target): Declare pid_to_exec_file.
+ (procfs_target::pid_to_exec_file): New.
+
+2018-09-20 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
+
* auxv.c (default_print_auxv_entry): Reflect AT_SUN_CAP_HW1
renaming.
Handle AT_SUN_EMULATOR, AT_SUN_BRANDNAME, AT_SUN_BRAND_AUX1,
diff --git a/gdb/procfs.c b/gdb/procfs.c
index e66c469..1fd55d3 100644
--- 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; }
@@ -3214,6 +3216,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/<proc-id>/execname. */
+ xsnprintf (name, PATH_MAX, "/proc/%d/execname", pid);
+ scoped_fd fd (gdb_open_cloexec (name, O_RDONLY, 0));
+ if (fd.get () < 0 || read (fd.get (), buf, PATH_MAX - 1) < 0)
+ {
+ /* If that fails, fall back to /proc/<proc-id>/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