-/* Copyright (C) 2002-2003, 2005, 2007, 2009 Free Software Foundation, Inc.
+/* Copyright (C) 2002-2003, 2005, 2007, 2009, 2011
+ Free Software Foundation, Inc.
Contributed by Andy Vaught and Paul Brook <paul@nowt.org>
-This file is part of the GNU Fortran 95 runtime library (libgfortran).
+This file is part of the GNU Fortran runtime library (libgfortran).
Libgfortran is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
if (please_free_exe_path_when_done)
free ((char *) exe_path);
+ /* Reading the /proc/self/exe symlink is Linux-specific(?), but if
+ it works it gives the correct answer. */
+#ifdef HAVE_READLINK
+ int len;
+ if ((len = readlink ("/proc/self/exe", buf, sizeof (buf) - 1)) != -1)
+ {
+ buf[len] = '\0';
+ exe_path = strdup (buf);
+ please_free_exe_path_when_done = 1;
+ return;
+ }
+#endif
+
/* On the simulator argv is not set. */
if (argv0 == NULL || argv0[0] == '/')
{
cwd = "";
#endif
- /* exe_path will be cwd + "/" + argv[0] + "\0" */
- path = malloc (strlen (cwd) + 1 + strlen (argv0) + 1);
- sprintf (path, "%s%c%s", cwd, DIR_SEPARATOR, argv0);
+ /* exe_path will be cwd + "/" + argv[0] + "\0". This will not work
+ if the executable is not in the cwd, but at this point we're out
+ of better ideas. */
+ size_t pathlen = strlen (cwd) + 1 + strlen (argv0) + 1;
+ path = malloc (pathlen);
+ snprintf (path, pathlen, "%s%c%s", cwd, DIR_SEPARATOR, argv0);
exe_path = path;
please_free_exe_path_when_done = 1;
}