mirror of
https://github.com/RPCSX/llvm.git
synced 2025-01-23 04:35:43 +00:00
The assumption that /proc/self/exe always exists is incorrect.
For example, under a Linux chroot, /proc/ might not be mounted. Therefor, we test if this file exist. If it is the case, use it (the current behavior). Otherwise, we fall back to the detection used by *BSD. The issue has been reported initially on the Debian bug tracker: http://bugs.debian.org/674588 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@164676 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
4fa2ddbb94
commit
bec3ce0cb5
@ -261,7 +261,8 @@ Path::GetCurrentDirectory() {
|
||||
}
|
||||
|
||||
#if defined(__FreeBSD__) || defined (__NetBSD__) || defined(__Bitrig__) || \
|
||||
defined(__OpenBSD__) || defined(__minix) || defined(__FreeBSD_kernel__)
|
||||
defined(__OpenBSD__) || defined(__minix) || defined(__FreeBSD_kernel__) || \
|
||||
defined(__linux__) || defined(__CYGWIN__)
|
||||
static int
|
||||
test_dir(char buf[PATH_MAX], char ret[PATH_MAX],
|
||||
const char *dir, const char *bin)
|
||||
@ -337,9 +338,17 @@ Path Path::GetMainExecutable(const char *argv0, void *MainAddr) {
|
||||
return Path(exe_path);
|
||||
#elif defined(__linux__) || defined(__CYGWIN__)
|
||||
char exe_path[MAXPATHLEN];
|
||||
ssize_t len = readlink("/proc/self/exe", exe_path, sizeof(exe_path));
|
||||
if (len >= 0)
|
||||
return Path(StringRef(exe_path, len));
|
||||
StringRef aPath("/proc/self/exe");
|
||||
if (sys::fs::exists(aPath)) {
|
||||
// /proc is not always mounted under Linux (chroot for example).
|
||||
ssize_t len = readlink(aPath.str().c_str(), exe_path, sizeof(exe_path));
|
||||
if (len >= 0)
|
||||
return Path(StringRef(exe_path, len));
|
||||
} else {
|
||||
// Fall back to the classical detection.
|
||||
if (getprogpath(exe_path, argv0) != NULL)
|
||||
return Path(exe_path);
|
||||
}
|
||||
#elif defined(HAVE_DLFCN_H)
|
||||
// Use dladdr to get executable path if available.
|
||||
Dl_info DLInfo;
|
||||
|
Loading…
x
Reference in New Issue
Block a user