summaryrefslogtreecommitdiff
path: root/lib/System/Unix/Path.inc
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2009-02-19 05:34:35 +0000
committerChris Lattner <sabre@nondot.org>2009-02-19 05:34:35 +0000
commitd18a2c1eaefba1ccea7bfa7bb2b94c571cec5547 (patch)
tree47b970c69b1ebaaf72115e431c63c16fd263b42c /lib/System/Unix/Path.inc
parent07ab52b6459f65b3e1c94d52321165688a6096aa (diff)
downloadllvm-d18a2c1eaefba1ccea7bfa7bb2b94c571cec5547.tar.gz
llvm-d18a2c1eaefba1ccea7bfa7bb2b94c571cec5547.tar.bz2
llvm-d18a2c1eaefba1ccea7bfa7bb2b94c571cec5547.tar.xz
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/Unix/Path.inc')
-rw-r--r--lib/System/Unix/Path.inc11
1 files changed, 8 insertions, 3 deletions
diff --git a/lib/System/Unix/Path.inc b/lib/System/Unix/Path.inc
index a8dcedb741..3a651f957c 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();
}