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:
Chris Lattner 2009-02-19 05:34:35 +00:00
parent 07ab52b645
commit d18a2c1eae

View File

@ -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();
}