diff options
author | Chris Lattner <sabre@nondot.org> | 2009-02-19 05:34:35 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2009-02-19 05:34:35 +0000 |
commit | d18a2c1eaefba1ccea7bfa7bb2b94c571cec5547 (patch) | |
tree | 47b970c69b1ebaaf72115e431c63c16fd263b42c /lib/System | |
parent | 07ab52b6459f65b3e1c94d52321165688a6096aa (diff) | |
download | external_llvm-d18a2c1eaefba1ccea7bfa7bb2b94c571cec5547.zip external_llvm-d18a2c1eaefba1ccea7bfa7bb2b94c571cec5547.tar.gz external_llvm-d18a2c1eaefba1ccea7bfa7bb2b94c571cec5547.tar.bz2 |
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
Diffstat (limited to 'lib/System')
-rw-r--r-- | lib/System/Unix/Path.inc | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/lib/System/Unix/Path.inc b/lib/System/Unix/Path.inc index a8dcedb..3a651f9 100644 --- a/lib/System/Unix/Path.inc +++ b/lib/System/Unix/Path.inc @@ -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(); } |