diff options
Diffstat (limited to 'libgfortran/runtime/main.c')
-rw-r--r-- | libgfortran/runtime/main.c | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/libgfortran/runtime/main.c b/libgfortran/runtime/main.c index cfd77f29be9..76e4aef724c 100644 --- a/libgfortran/runtime/main.c +++ b/libgfortran/runtime/main.c @@ -32,9 +32,15 @@ Boston, MA 02110-1301, USA. */ #include <string.h> #include <math.h> #include <stddef.h> +#include <limits.h> +#include "config.h" #include "libgfortran.h" +#ifdef HAVE_UNISTD_H +#include <unistd.h> +#endif + /* Stupid function to be sure the constructor is always linked in, even in the case of static linking. See PR libfortran/22298 for details. */ void @@ -92,6 +98,44 @@ get_args (int *argc, char ***argv) } +static const char *exe_path; + +/* Save the path under which the program was called, for use in the + backtrace routines. */ +void +store_exe_path (const char * argv0) +{ +#ifndef PATH_MAX +#define PATH_MAX 1024 +#endif + +#ifndef DIR_SEPARATOR +#define DIR_SEPARATOR '/' +#endif + + char buf[PATH_MAX], *cwd, *path; + + if (argv0[0] == '/') + { + exe_path = argv0; + return; + } + + cwd = getcwd (buf, sizeof (buf)); + + /* exe_path will be cwd + "/" + argv[0] + "\0" */ + path = malloc (strlen (cwd) + 1 + strlen (argv0) + 1); + st_sprintf (path, "%s%c%s", cwd, DIR_SEPARATOR, argv0); + exe_path = path; +} + +/* Return the full path of the executable. */ +char * +full_exe_path (void) +{ + return (char *) exe_path; +} + /* Initialize the runtime library. */ static void __attribute__((constructor)) |