mirror of
https://github.com/RPCSX/llvm.git
synced 2025-01-26 14:25:18 +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::GetTemporaryDirectory(std::string* ErrMsg ) {
|
||||
Path::GetTemporaryDirectory(std::string *ErrMsg) {
|
||||
#if defined(HAVE_MKDTEMP)
|
||||
// The best way is with mkdtemp but that's not available on many systems,
|
||||
// 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.
|
||||
Dl_info DLInfo;
|
||||
int err = dladdr(MainAddr, &DLInfo);
|
||||
if (err != 0)
|
||||
return Path(std::string(DLInfo.dli_fname));
|
||||
if (err == 0)
|
||||
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
|
||||
return Path();
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user