mirror of
https://github.com/ianlancetaylor/libbacktrace.git
synced 2026-04-08 18:29:06 +08:00
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.
This commit is contained in:
38
fileline.c
38
fileline.c
@@ -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,
|
|||||||
|
|
||||||
#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,
|
|||||||
|
|
||||||
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,
|
|||||||
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 ();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user