2012-04-02 Tristan Gingold <gingold@adacore.com>
authorTristan Gingold <gingold@adacore.com>
Mon, 2 Apr 2012 11:57:30 +0000 (11:57 +0000)
committerTristan Gingold <gingold@adacore.com>
Mon, 2 Apr 2012 11:57:30 +0000 (11:57 +0000)
PR gdb/13901
* darwin-nat.c (darwin_execvp): Sey binary preference.

gdb/ChangeLog
gdb/darwin-nat.c

index 9a0a720..f76ee76 100644 (file)
@@ -1,3 +1,8 @@
+2012-04-02  Tristan Gingold  <gingold@adacore.com>
+
+       PR gdb/13901
+       * darwin-nat.c (darwin_execvp): Sey binary preference.
+
 2012-04-02  Jan Kratochvil  <jan.kratochvil@redhat.com>
 
        * NEWS (set breakpoint condition-evaluation): Use imperative mood.
index de661a3..010700c 100644 (file)
@@ -39,6 +39,7 @@
 #include "value.h"
 #include "arch-utils.h"
 #include "bfd.h"
+#include "bfd/mach-o.h"
 
 #include <sys/ptrace.h>
 #include <sys/signal.h>
@@ -1538,6 +1539,22 @@ darwin_execvp (const char *file, char * const argv[], char * const env[])
       return;
     }
 
+  /* Specify the same binary preference to spawn the shell as the
+     exec binary.  This avoids spawning a 64bit shell while debugging
+     a 32bit program, which may confuse gdb.
+     Also, this slightly breaks internal layers as we suppose the binary
+     is Mach-O.  Doesn't harm in practice.  */
+  if (exec_bfd != NULL)
+    {
+      cpu_type_t pref;
+      size_t ocount;
+
+      pref = bfd_mach_o_get_data (exec_bfd)->header.cputype;
+      res = posix_spawnattr_setbinpref_np (&attr, 1, &pref, &ocount);
+      if (res != 0 || ocount != 1)
+       fprintf_unfiltered (gdb_stderr, "Cannot set posix_spawn binpref\n");
+    }
+
   posix_spawnp (NULL, argv[0], NULL, &attr, argv, env);
 }