summaryrefslogtreecommitdiff
blob: 6ad78c7cde08a48159b2db16f2f1b512a5068867 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
Upstream commit to find wrappers in lib64 directory.

commit 3f9c2ecf18d8fa37fad5a7062f80952692eaa8e7
Author: Alexander Monakov <amonakov@ispras.ru>
Date:   Wed Oct 16 20:51:47 2013 +0400

    cli: use $LIB to handle multilib automagically on glibc

--- apitrace/cli/CMakeLists.txt
+++ apitrace/cli/CMakeLists.txt
@@ -31,6 +31,7 @@ target_link_libraries (apitrace
     ${ZLIB_LIBRARIES}
     ${SNAPPY_LIBRARIES}
     ${GETOPT_LIBRARIES}
+    dl
 )
 
 if (NOT CMAKE_CROSSCOMPILING)
--- apitrace/cli/cli_resources.cpp
+++ apitrace/cli/cli_resources.cpp
@@ -32,6 +32,20 @@
 
 #include "cli_resources.hpp"
 
+#ifdef __GLIBC__
+
+#include <dlfcn.h>
+
+static bool
+tryLib(const os::String &path)
+{
+    void *handle = dlopen(path.str(), RTLD_LAZY);
+    bool exists = (handle != NULL);
+    if (exists)
+        dlclose(handle);
+    return exists;
+}
+#endif
 
 os::String
 findProgram(const char*programFilename)
@@ -76,6 +90,17 @@ findWrapper(const char *wrapperFilename)
         return wrapperPath;
     }
 
+#ifdef __GLIBC__
+    // We want to take advantage of $LIB dynamic string token expansion in
+    // glibc dynamic linker to handle multilib layout for us
+    wrapperPath = processDir;
+    wrapperPath.join("../$LIB/apitrace/wrappers");
+    wrapperPath.join(wrapperFilename);
+    if (tryLib(wrapperPath)) {
+        return wrapperPath;
+    }
+#endif
+
     // Try relative install directory
     wrapperPath = processDir;
 #if defined(_WIN32)