Commit 4ae8d988 by Ian Lance Taylor

libbacktrace: fetch executable path on macOS

PR libbacktrace/96973 * fileline.c (macho_get_executable_path): New static function. (fileline_initialize): Call macho_get_executable_path.
parent 430dc8b6
...@@ -43,6 +43,10 @@ POSSIBILITY OF SUCH DAMAGE. */ ...@@ -43,6 +43,10 @@ POSSIBILITY OF SUCH DAMAGE. */
#include <sys/sysctl.h> #include <sys/sysctl.h>
#endif #endif
#ifdef HAVE_MACH_O_DYLD_H
#include <mach-o/dyld.h>
#endif
#include "backtrace.h" #include "backtrace.h"
#include "internal.h" #include "internal.h"
...@@ -122,6 +126,35 @@ sysctl_exec_name2 (struct backtrace_state *state, ...@@ -122,6 +126,35 @@ sysctl_exec_name2 (struct backtrace_state *state,
#endif /* defined (HAVE_KERN_PROC_ARGS) || |defined (HAVE_KERN_PROC) */ #endif /* defined (HAVE_KERN_PROC_ARGS) || |defined (HAVE_KERN_PROC) */
#ifdef HAVE_MACH_O_DYLD_H
static char *
macho_get_executable_path (struct backtrace_state *state,
backtrace_error_callback error_callback, void *data)
{
uint32_t len;
char *name;
len = 0;
if (_NSGetExecutablePath (NULL, &len) == 0)
return NULL;
name = (char *) backtrace_alloc (state, len, error_callback, data);
if (name == NULL)
return NULL;
if (_NSGetExecutablePath (name, &len) != 0)
{
backtrace_free (state, name, len, error_callback, data);
return NULL;
}
return name;
}
#else /* !defined (HAVE_MACH_O_DYLD_H) */
#define macho_get_executable_path(state, error_callback, data) NULL
#endif /* !defined (HAVE_MACH_O_DYLD_H) */
/* Initialize the fileline information from the executable. Returns 1 /* Initialize the fileline information from the executable. Returns 1
on success, 0 on failure. */ on success, 0 on failure. */
...@@ -159,7 +192,7 @@ fileline_initialize (struct backtrace_state *state, ...@@ -159,7 +192,7 @@ fileline_initialize (struct backtrace_state *state,
descriptor = -1; descriptor = -1;
called_error_callback = 0; called_error_callback = 0;
for (pass = 0; pass < 7; ++pass) for (pass = 0; pass < 8; ++pass)
{ {
int does_not_exist; int does_not_exist;
...@@ -188,6 +221,9 @@ fileline_initialize (struct backtrace_state *state, ...@@ -188,6 +221,9 @@ fileline_initialize (struct backtrace_state *state,
case 6: case 6:
filename = sysctl_exec_name2 (state, error_callback, data); filename = sysctl_exec_name2 (state, error_callback, data);
break; break;
case 7:
filename = macho_get_executable_path (state, error_callback, data);
break;
default: default:
abort (); abort ();
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment