]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
libbacktrace: look for _pgmptr on Windows
authorIan Lance Taylor <iant@golang.org>
Mon, 31 Jul 2023 23:14:58 +0000 (16:14 -0700)
committerIan Lance Taylor <iant@golang.org>
Mon, 31 Jul 2023 23:14:58 +0000 (16:14 -0700)
Patch from Andres Freund:
* configure.ac: Check for _pgmptr declaration.
* fileline.c (fileline_initialize): Check for _pgmfptr before
/proc/self/exec.
* configure, config.h.in: Regenerate.

libbacktrace/config.h.in
libbacktrace/configure
libbacktrace/configure.ac
libbacktrace/fileline.c

index 94621c2e385c39cde9ea3f8997c1dd4a2b299aa2..a4f5bddddf6c45f4918e4e6e6bae1c5ad6a4bbc1 100644 (file)
    don't. */
 #undef HAVE_DECL_STRNLEN
 
+/* Define to 1 if you have the declaration of `_pgmptr', and to 0 if you
+   don't. */
+#undef HAVE_DECL__PGMPTR
+
 /* Define to 1 if you have the <dlfcn.h> header file. */
 #undef HAVE_DLFCN_H
 
index 6af2c04c81a8a3827dda1201e38d951be533a2c6..88156e2c63b4113c391caf3fee75ba7f50c30978 100755 (executable)
@@ -13485,6 +13485,19 @@ $as_echo "#define HAVE_GETEXECNAME 1" >>confdefs.h
 
 fi
 
+# Check for _pgmptr variable, contains the executable filename on windows
+ac_fn_c_check_decl "$LINENO" "_pgmptr" "ac_cv_have_decl__pgmptr" "$ac_includes_default"
+if test "x$ac_cv_have_decl__pgmptr" = xyes; then :
+  ac_have_decl=1
+else
+  ac_have_decl=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL__PGMPTR $ac_have_decl
+_ACEOF
+
+
 # Check for sysctl definitions.
 
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for KERN_PROC" >&5
index 39e6bf41e357e25c48131d251851e9f0fddc182c..72ff2b30053fea8821c26c3e8616e5181d0e3691 100644 (file)
@@ -407,6 +407,9 @@ if test "$have_getexecname" = "yes"; then
   AC_DEFINE(HAVE_GETEXECNAME, 1, [Define if getexecname is available.])
 fi
 
+# Check for _pgmptr variable, contains the executable filename on windows
+AC_CHECK_DECLS([_pgmptr])
+
 # Check for sysctl definitions.
 
 AC_CACHE_CHECK([for KERN_PROC],
index 674bf33cdcf0232ec51d0ea3431aec4341bd1e2a..0e560b44e7ac72d06f72f424ff7ba10fbe5eeba3 100644 (file)
@@ -155,6 +155,16 @@ macho_get_executable_path (struct backtrace_state *state,
 
 #endif /* !defined (HAVE_MACH_O_DYLD_H) */
 
+#if HAVE_DECL__PGMPTR
+
+#define windows_executable_filename() _pgmptr
+
+#else /* !HAVE_DECL__PGMPTR */
+
+#define windows_executable_filename() NULL
+
+#endif /* !HAVE_DECL__PGMPTR */
+
 /* Initialize the fileline information from the executable.  Returns 1
    on success, 0 on failure.  */
 
@@ -192,7 +202,7 @@ fileline_initialize (struct backtrace_state *state,
 
   descriptor = -1;
   called_error_callback = 0;
-  for (pass = 0; pass < 8; ++pass)
+  for (pass = 0; pass < 9; ++pass)
     {
       int does_not_exist;
 
@@ -205,23 +215,28 @@ fileline_initialize (struct backtrace_state *state,
          filename = getexecname ();
          break;
        case 2:
-         filename = "/proc/self/exe";
+         /* Test this before /proc/self/exe, as the latter exists but points
+            to the wine binary (and thus doesn't work).  */
+         filename = windows_executable_filename ();
          break;
        case 3:
-         filename = "/proc/curproc/file";
+         filename = "/proc/self/exe";
          break;
        case 4:
+         filename = "/proc/curproc/file";
+         break;
+       case 5:
          snprintf (buf, sizeof (buf), "/proc/%ld/object/a.out",
                    (long) getpid ());
          filename = buf;
          break;
-       case 5:
+       case 6:
          filename = sysctl_exec_name1 (state, error_callback, data);
          break;
-       case 6:
+       case 7:
          filename = sysctl_exec_name2 (state, error_callback, data);
          break;
-       case 7:
+       case 8:
          filename = macho_get_executable_path (state, error_callback, data);
          break;
        default: