From c1c86fa2f0d9509b99f0d90f240dc71086458af5 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Mon, 31 Jul 2023 16:14:58 -0700 Subject: [PATCH] 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. --- config.h.in | 4 ++++ configure | 13 +++++++++++++ configure.ac | 3 +++ fileline.c | 27 +++++++++++++++++++++------ 4 files changed, 41 insertions(+), 6 deletions(-) diff --git a/config.h.in b/config.h.in index dd594d9..d95231e 100644 --- a/config.h.in +++ b/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 header file. */ #undef HAVE_DLFCN_H diff --git a/configure b/configure index 90594c6..cf2d3ed 100755 --- a/configure +++ b/configure @@ -12517,6 +12517,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/configure.ac b/configure.ac index 557b2c2..4c12adc 100644 --- a/configure.ac +++ b/configure.ac @@ -404,6 +404,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/fileline.c b/fileline.c index 0472f47..04055b7 100644 --- a/fileline.c +++ b/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: