aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Lance Taylor <iant@golang.org>2023-07-31 16:14:58 -0700
committerIan Lance Taylor <iant@golang.org>2023-07-31 16:14:58 -0700
commita349ba16f18b66b70c7a1bdb1ab5c5b6247676da (patch)
tree0a037cfbc0d312925aa76f2973332100011b92a5
parentffc74822468a39324722eef4c4412ea3224ca976 (diff)
downloadgcc-a349ba16f18b66b70c7a1bdb1ab5c5b6247676da.zip
gcc-a349ba16f18b66b70c7a1bdb1ab5c5b6247676da.tar.gz
gcc-a349ba16f18b66b70c7a1bdb1ab5c5b6247676da.tar.bz2
libbacktrace: look for _pgmptr on Windows
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.
-rw-r--r--libbacktrace/config.h.in4
-rwxr-xr-xlibbacktrace/configure13
-rw-r--r--libbacktrace/configure.ac3
-rw-r--r--libbacktrace/fileline.c27
4 files changed, 41 insertions, 6 deletions
diff --git a/libbacktrace/config.h.in b/libbacktrace/config.h.in
index 94621c2..a4f5bdd 100644
--- a/libbacktrace/config.h.in
+++ b/libbacktrace/config.h.in
@@ -20,6 +20,10 @@
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
diff --git a/libbacktrace/configure b/libbacktrace/configure
index 6af2c04..88156e2 100755
--- a/libbacktrace/configure
+++ b/libbacktrace/configure
@@ -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
diff --git a/libbacktrace/configure.ac b/libbacktrace/configure.ac
index 39e6bf4..72ff2b3 100644
--- a/libbacktrace/configure.ac
+++ b/libbacktrace/configure.ac
@@ -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],
diff --git a/libbacktrace/fileline.c b/libbacktrace/fileline.c
index 674bf33..0e560b4 100644
--- a/libbacktrace/fileline.c
+++ b/libbacktrace/fileline.c
@@ -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: