add and deal with -fvisibility=hidden everywhere
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 453cc61..3945440 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -23,7 +23,12 @@
 	message(FATAL_ERROR "libdrm not found")
 endif()
 
-set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c99 -Werror -Wall -Wextra -Wno-sign-compare -Wno-unused-parameter")
+if (CMAKE_COMPILER_IS_GNUCC)
+    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c99 -Werror -Wall -Wextra -Wno-sign-compare -Wno-unused-parameter")
+    if (UNIX)
+        set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fvisibility=hidden")
+    endif()
+endif()
 
 set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${PROJECT_SOURCE_DIR}/cmake")
 include(GetGitRevisionDescription)
diff --git a/loader/loader.c b/loader/loader.c
index 860ffb9..a90d656 100644
--- a/loader/loader.c
+++ b/loader/loader.c
@@ -35,8 +35,7 @@
 #include <dlfcn.h>
 #include <pthread.h>
 
-#include <xgl.h>
-#include <xglDbg.h>
+#include "loader.h"
 
 typedef XGL_RESULT (XGLAPI *InitAndEnumerateGpusT)(const XGL_APPLICATION_INFO* pAppInfo, const XGL_ALLOC_CALLBACKS* pAllocCb, XGL_UINT maxGpus, XGL_UINT* pGpuCount, XGL_PHYSICAL_GPU* pGpus);
 typedef XGL_RESULT (XGLAPI *DbgRegisterMsgCallbackT)(XGL_DBG_MSG_CALLBACK_FUNCTION pfnMsgCallback, XGL_VOID* pUserData);
@@ -337,7 +336,7 @@
     loader.scanned = true;
 }
 
-XGL_RESULT XGLAPI xglInitAndEnumerateGpus(const XGL_APPLICATION_INFO* pAppInfo, const XGL_ALLOC_CALLBACKS* pAllocCb, XGL_UINT maxGpus, XGL_UINT* pGpuCount, XGL_PHYSICAL_GPU* pGpus)
+LOADER_EXPORT XGL_RESULT XGLAPI xglInitAndEnumerateGpus(const XGL_APPLICATION_INFO* pAppInfo, const XGL_ALLOC_CALLBACKS* pAllocCb, XGL_UINT maxGpus, XGL_UINT* pGpuCount, XGL_PHYSICAL_GPU* pGpus)
 {
     static pthread_once_t once = PTHREAD_ONCE_INIT;
     const struct loader_icd *icd;
@@ -376,7 +375,7 @@
     return (count > 0) ? XGL_SUCCESS : res;
 }
 
-XGL_RESULT XGLAPI xglDbgRegisterMsgCallback(XGL_DBG_MSG_CALLBACK_FUNCTION pfnMsgCallback, XGL_VOID* pUserData)
+LOADER_EXPORT XGL_RESULT XGLAPI xglDbgRegisterMsgCallback(XGL_DBG_MSG_CALLBACK_FUNCTION pfnMsgCallback, XGL_VOID* pUserData)
 {
     const struct loader_icd *icd = loader.icds;
     XGL_RESULT res;
@@ -409,7 +408,7 @@
     return XGL_SUCCESS;
 }
 
-XGL_RESULT XGLAPI xglDbgUnregisterMsgCallback(XGL_DBG_MSG_CALLBACK_FUNCTION pfnMsgCallback)
+LOADER_EXPORT XGL_RESULT XGLAPI xglDbgUnregisterMsgCallback(XGL_DBG_MSG_CALLBACK_FUNCTION pfnMsgCallback)
 {
     const struct loader_icd *icd = loader.icds;
     XGL_RESULT res = XGL_SUCCESS;
@@ -429,7 +428,7 @@
     return res;
 }
 
-XGL_RESULT XGLAPI xglDbgSetGlobalOption(XGL_DBG_GLOBAL_OPTION dbgOption, XGL_SIZE dataSize, const XGL_VOID* pData)
+LOADER_EXPORT XGL_RESULT XGLAPI xglDbgSetGlobalOption(XGL_DBG_GLOBAL_OPTION dbgOption, XGL_SIZE dataSize, const XGL_VOID* pData)
 {
     const struct loader_icd *icd = loader.icds;
     XGL_RESULT res = XGL_SUCCESS;
diff --git a/loader/loader.h b/loader/loader.h
new file mode 100644
index 0000000..19aba3f
--- /dev/null
+++ b/loader/loader.h
@@ -0,0 +1,39 @@
+/*
+ * XGL
+ *
+ * Copyright (C) 2014 LunarG, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+#ifndef LOADER_H
+#define LOADER_H
+
+#include <xgl.h>
+#include <xglDbg.h>
+
+#if defined(__GNUC__) && __GNUC__ >= 4
+#  define LOADER_EXPORT __attribute__((visibility("default")))
+#elif defined(__SUNPRO_C) && (__SUNPRO_C >= 0x590)
+#  define LOADER_EXPORT __attribute__((visibility("default")))
+#else
+#  define LOADER_EXPORT
+#endif
+
+#endif /* LOADER_H */
diff --git a/xgl-generate.py b/xgl-generate.py
index 5ffa583..865f7a6 100755
--- a/xgl-generate.py
+++ b/xgl-generate.py
@@ -81,7 +81,10 @@
     %s;
 };""" % ";\n    ".join(entries)
 
-    def _generate_icd_dispatch_entrypoints(self):
+    def _generate_icd_dispatch_entrypoints(self, qual=""):
+        if qual:
+            qual += " "
+
         funcs = []
         for proto in self.protos:
             if not xgl.is_dispatchable(proto):
@@ -92,12 +95,12 @@
             if proto.ret != "XGL_VOID":
                 stmt = "return " + stmt
 
-            funcs.append("%s\n"
+            funcs.append("%s%s\n"
                          "{\n"
                          "    const struct icd_dispatch_table * const *disp =\n"
                          "        (const struct icd_dispatch_table * const *) %s;\n"
                          "    %s;\n"
-                         "}" % (decl, proto.params[0].name, stmt))
+                         "}" % (qual, decl, proto.params[0].name, stmt))
 
         return "\n\n".join(funcs)
 
@@ -135,13 +138,11 @@
 
 class LoaderSubcommand(Subcommand):
     def generate_header(self):
-        return "\n".join([
-            "#include <xgl.h>",
-            "#include <xglDbg.h>"])
+        return "#include \"loader.h\""
 
     def generate_body(self):
         body = [self._generate_icd_dispatch_table(),
-                self._generate_icd_dispatch_entrypoints()]
+                self._generate_icd_dispatch_entrypoints("LOADER_EXPORT")]
 
         return "\n\n".join(body)
 
@@ -164,20 +165,11 @@
         return self._generate_icd_dispatch_table()
 
 class IcdDispatchEntrypointsSubcommand(Subcommand):
-    def run(self):
-        if len(self.argv) != 1:
-            print("IcdDispatchEntrypointsSubcommand requires a header to include")
-            return
-        super().run()
-
     def generate_header(self):
-        return "\n".join([
-            "#include <xgl.h>",
-            "#include <xglDbg.h>",
-            "#include \"%s\"" % self.argv[0]])
+        return "#include \"icd.h\""
 
     def generate_body(self):
-        return self._generate_icd_dispatch_entrypoints()
+        return self._generate_icd_dispatch_entrypoints("ICD_EXPORT")
 
 def main():
     subcommands = {