mirror of
https://github.com/RPCSX/llvm.git
synced 2025-02-04 19:38:22 +00:00
If an executable is run through a symlink, dladdr will return the
symlink. We really want the ultimate executable being run, not the symlink. This lets clang find its headers when invoked through a symlink. rdar://6602012 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@65017 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
07ab52b645
commit
d18a2c1eae
@ -117,7 +117,7 @@ Path::GetRootDirectory() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Path
|
Path
|
||||||
Path::GetTemporaryDirectory(std::string* ErrMsg ) {
|
Path::GetTemporaryDirectory(std::string *ErrMsg) {
|
||||||
#if defined(HAVE_MKDTEMP)
|
#if defined(HAVE_MKDTEMP)
|
||||||
// The best way is with mkdtemp but that's not available on many systems,
|
// The best way is with mkdtemp but that's not available on many systems,
|
||||||
// Linux and FreeBSD have it. Others probably won't.
|
// Linux and FreeBSD have it. Others probably won't.
|
||||||
@ -280,8 +280,13 @@ Path Path::GetMainExecutable(const char *argv0, void *MainAddr) {
|
|||||||
// Use dladdr to get executable path if available.
|
// Use dladdr to get executable path if available.
|
||||||
Dl_info DLInfo;
|
Dl_info DLInfo;
|
||||||
int err = dladdr(MainAddr, &DLInfo);
|
int err = dladdr(MainAddr, &DLInfo);
|
||||||
if (err != 0)
|
if (err == 0)
|
||||||
return Path(std::string(DLInfo.dli_fname));
|
return Path();
|
||||||
|
|
||||||
|
// If the filename is a symlink, we need to resolve and return the location of
|
||||||
|
// the actual executable.
|
||||||
|
char link_path[MAXPATHLEN];
|
||||||
|
return Path(std::string(realpath(DLInfo.dli_fname, link_path)));
|
||||||
#endif
|
#endif
|
||||||
return Path();
|
return Path();
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user