Don't always build coffgen.o
[deliverable/binutils-gdb.git] / gdb / linux-thread-db.c
index 352fac1091323d32bdc2c47cb9127907f32aba3c..c49b5674c4fd3adbb28a86fb99905cd9eb71c0d9 100644 (file)
@@ -1217,12 +1217,41 @@ thread_db_new_objfile (struct objfile *objfile)
     check_for_thread_db ();
 }
 
+static void
+check_pid_namespace_match (void)
+{
+  /* Check is only relevant for local targets targets.  */
+  if (target_can_run (&current_target))
+    {
+      /* If the child is in a different PID namespace, its idea of its
+        PID will differ from our idea of its PID.  When we scan the
+        child's thread list, we'll mistakenly think it has no threads
+        since the thread PID fields won't match the PID we give to
+        libthread_db.  */
+      char *our_pid_ns = linux_proc_pid_get_ns (getpid (), "pid");
+      char *inferior_pid_ns = linux_proc_pid_get_ns (
+       ptid_get_pid (inferior_ptid), "pid");
+
+      if (our_pid_ns != NULL && inferior_pid_ns != NULL
+         && strcmp (our_pid_ns, inferior_pid_ns) != 0)
+       {
+         warning (_ ("Target and debugger are in different PID "
+                     "namespaces; thread lists and other data are "
+                     "likely unreliable"));
+       }
+
+      xfree (our_pid_ns);
+      xfree (inferior_pid_ns);
+    }
+}
+
 /* This function is called via the inferior_created observer.
    This handles the case of debugging statically linked executables.  */
 
 static void
 thread_db_inferior_created (struct target_ops *target, int from_tty)
 {
+  check_pid_namespace_match ();
   check_for_thread_db ();
 }
 
This page took 0.024411 seconds and 4 git commands to generate.