<div dir="ltr">Hi, <div><br></div><div>If you are trying to modify the libsanitizer files, please read here: </div><div><a href="https://code.google.com/p/address-sanitizer/wiki/HowToContribute">https://code.google.com/p/address-sanitizer/wiki/HowToContribute</a><br>

</div><div><br></div><div>--kcc </div></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Thu, Apr 17, 2014 at 5:49 PM, Bernhard Reutner-Fischer <span dir="ltr"><<a href="mailto:rep.dot.nop@gmail.com" target="_blank">rep.dot.nop@gmail.com</a>></span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Conditionalize usage of dlvsym(), nanosleep(), usleep();<br>
Conditionalize layout of struct sigaction and type of it's member<br>
sa_flags.<br>
Conditionalize glob_t members gl_closedir, gl_readdir, gl_opendir,<br>
gl_flags, gl_lstat, gl_stat.<br>
Check for availability of glob.h for use with above members.<br>
Check for availability of netrom/netrom.h, sys/ustat.h (for obsolete<br>
ustat() function), utime.h (for obsolete utime() function), wordexp.h.<br>
Determine size of sigset_t instead of hardcoding it.<br>
Determine size of struct statfs64, if available.<br>
<br>
Leave defaults to match what glibc expects but probe them for uClibc.<br>
<br>
Signed-off-by: Bernhard Reutner-Fischer <<a href="mailto:rep.dot.nop@gmail.com">rep.dot.nop@gmail.com</a>><br>
---<br>
 CMakeLists.txt                                     |  58 +++++++<br>
 cmake/Modules/CompilerRTUtils.cmake                |  15 ++<br>
 cmake/Modules/FunctionExistsNotStub.cmake          |  56 +++++++<br>
 lib/interception/interception_linux.cc             |   2 +<br>
 lib/interception/interception_linux.h              |   9 ++<br>
 .../sanitizer_common_interceptors.inc              | 101 +++++++++++-<br>
 .../sanitizer_platform_limits_posix.cc             |  44 ++++-<br>
 .../sanitizer_platform_limits_posix.h              |  27 +++-<br>
 lib/sanitizer_common/sanitizer_posix_libcdep.cc    |   9 ++<br>
 make/platform/<a href="http://clang_linux.mk" target="_blank">clang_linux.mk</a>                       | 180 +++++++++++++++++++++<br>
 make/platform/clang_linux_test_libc.c              |  68 ++++++++<br>
 11 files changed, 561 insertions(+), 8 deletions(-)<br>
 create mode 100644 cmake/Modules/FunctionExistsNotStub.cmake<br>
 create mode 100644 make/platform/clang_linux_test_libc.c<br>
<br>
diff --git a/CMakeLists.txt b/CMakeLists.txt<br>
index e1a7a1f..af8073e 100644<br>
--- a/CMakeLists.txt<br>
+++ b/CMakeLists.txt<br>
@@ -330,6 +330,64 @@ if(APPLE)<br>
     -isysroot ${IOSSIM_SDK_DIR})<br>
 endif()<br>
<br>
+set(ct_c ${COMPILER_RT_SOURCE_DIR}/make/platform/clang_linux_test_libc.c)<br>
+check_include_file(sys/ustat.h HAVE_SYS_USTAT_H)<br>
+check_include_file(utime.h HAVE_UTIME_H)<br>
+check_include_file(wordexp.h HAVE_WORDEXP_H)<br>
+check_include_file(glob.h HAVE_GLOB_H)<br>
+include(FunctionExistsNotStub)<br>
+check_function_exists_not_stub(${ct_c} nanosleep HAVE_NANOSLEEP)<br>
+check_function_exists_not_stub(${ct_c} usleep HAVE_USLEEP)<br>
+include(CheckTypeSize)<br>
+# check for sizeof sigset_t<br>
+set(oCMAKE_EXTRA_INCLUDE_FILES "${CMAKE_EXTRA_INCLUDE_FILES}")<br>
+set(CMAKE_EXTRA_INCLUDE_FILES ${CMAKE_EXTRA_INCLUDE_FILES} signal.h)<br>
+check_type_size("sigset_t" SIZEOF_SIGSET_T BUILTIN_TYPES_ONLY)<br>
+if(EXISTS HAVE_SIZEOF_SIGSET_T)<br>
+  set(SIZEOF_SIGSET_T ${HAVE_SIZEOF_SIGSET_T})<br>
+endif()<br>
+set(CMAKE_EXTRA_INCLUDE_FILES "${oCMAKE_EXTRA_INCLUDE_FILES}")<br>
+# check for sizeof struct statfs64<br>
+set(oCMAKE_EXTRA_INCLUDE_FILES "${CMAKE_EXTRA_INCLUDE_FILES}")<br>
+check_include_file(sys/statfs.h HAVE_SYS_STATFS_H)<br>
+check_include_file(sys/vfs.h HAVE_SYS_VFS_H)<br>
+if(HAVE_SYS_STATFS_H)<br>
+  set(CMAKE_EXTRA_INCLUDE_FILES ${CMAKE_EXTRA_INCLUDE_FILES} sys/statfs.h)<br>
+endif()<br>
+if(HAVE_SYS_VFS_H)<br>
+  set(CMAKE_EXTRA_INCLUDE_FILES ${CMAKE_EXTRA_INCLUDE_FILES} sys/vfs.h)<br>
+endif()<br>
+# Have to pass _LARGEFILE64_SOURCE otherwise there is no struct statfs64.<br>
+# We forcefully enable LFS to retain glibc legacy behaviour herein.<br>
+set(oCMAKE_REQUIRED_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS})<br>
+set(CMAKE_REQUIRED_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS} -D_LARGEFILE64_SOURCE)<br>
+check_type_size("struct statfs64" SIZEOF_STRUCT_STATFS64)<br>
+if(EXISTS HAVE_SIZEOF_STRUCT_STATFS64)<br>
+  set(SIZEOF_STRUCT_STATFS64 ${HAVE_SIZEOF_STRUCT_STATFS64})<br>
+else()<br>
+  set(CMAKE_REQUIRED_DEFINITIONS ${oCMAKE_REQUIRED_DEFINITIONS})<br>
+endif()<br>
+set(CMAKE_EXTRA_INCLUDE_FILES "${oCMAKE_EXTRA_INCLUDE_FILES}")<br>
+# do not set(CMAKE_REQUIRED_DEFINITIONS ${oCMAKE_REQUIRED_DEFINITIONS})<br>
+# it back here either way.<br>
+include(CheckStructHasMember)<br>
+check_struct_has_member(glob_t gl_flags glob.h HAVE_GLOB_T_GL_FLAGS)<br>
+check_struct_has_member(glob_t gl_closedir glob.h HAVE_GLOB_T_GL_CLOSEDIR)<br>
+check_struct_has_member(glob_t gl_readdir glob.h HAVE_GLOB_T_GL_READDIR)<br>
+check_struct_has_member(glob_t gl_opendir glob.h HAVE_GLOB_T_GL_OPENDIR)<br>
+check_struct_has_member(glob_t gl_lstat glob.h HAVE_GLOB_T_GL_LSTAT)<br>
+check_struct_has_member(glob_t gl_stat glob.h HAVE_GLOB_T_GL_STAT)<br>
+<br>
+# folks seem to have an aversion to configure_file? So be it..<br>
+foreach(x HAVE_SYS_USTAT_H HAVE_UTIME_H HAVE_WORDEXP_H HAVE_GLOB_H<br>
+HAVE_NANOSLEEP HAVE_USLEEP SIZEOF_SIGSET_T SIZEOF_STRUCT_STATFS64<br>
+HAVE_GLOB_T_GL_FLAGS HAVE_GLOB_T_GL_CLOSEDIR<br>
+HAVE_GLOB_T_GL_READDIR HAVE_GLOB_T_GL_OPENDIR<br>
+HAVE_GLOB_T_GL_LSTAT HAVE_GLOB_T_GL_STAT)<br>
+def_undef_string(${x} SANITIZER_COMMON_CFLAGS)<br>
+endforeach()<br>
+<br>
+<br>
 # Architectures supported by Sanitizer runtimes. Specific sanitizers may<br>
 # support only subset of these (e.g. TSan works on x86_64 only).<br>
 filter_available_targets(SANITIZER_COMMON_SUPPORTED_ARCH<br>
diff --git a/cmake/Modules/CompilerRTUtils.cmake b/cmake/Modules/CompilerRTUtils.cmake<br>
index e22e775..3a0beec 100644<br>
--- a/cmake/Modules/CompilerRTUtils.cmake<br>
+++ b/cmake/Modules/CompilerRTUtils.cmake<br>
@@ -59,3 +59,18 @@ macro(append_no_rtti_flag list)<br>
   append_if(COMPILER_RT_HAS_FNO_RTTI_FLAG -fno-rtti ${list})<br>
   append_if(COMPILER_RT_HAS_GR_FLAG /GR- ${list})<br>
 endmacro()<br>
+<br>
+# Appends -Dvalue=${value}/-Uvalue to all strings in ARGN<br>
+macro(def_undef_string condition)<br>
+  if("${${condition}}" STREQUAL "")<br>
+    foreach(str ${ARGN})<br>
+      set(${str} "${${str}} -U${condition}")<br>
+    endforeach()<br>
+  else()<br>
+    foreach(str ${ARGN})<br>
+      set(${str} "${${str}} '-D${condition}=${${condition}}'")<br>
+    endforeach()<br>
+  endif()<br>
+endmacro()<br>
+<br>
+<br>
diff --git a/cmake/Modules/FunctionExistsNotStub.cmake b/cmake/Modules/FunctionExistsNotStub.cmake<br>
new file mode 100644<br>
index 0000000..9f944dd<br>
--- /dev/null<br>
+++ b/cmake/Modules/FunctionExistsNotStub.cmake<br>
@@ -0,0 +1,56 @@<br>
+INCLUDE(CheckFunctionExists)<br>
+<br>
+# The following variables may be set before calling this macro to<br>
+# modify the way the check is run:<br>
+#<br>
+#  CMAKE_REQUIRED_FLAGS = string of compile command line flags<br>
+#  CMAKE_REQUIRED_DEFINITIONS = list of macros to define (-DFOO=bar)<br>
+#  CMAKE_REQUIRED_INCLUDES = list of include directories<br>
+<br>
+macro(CHECK_FUNCTION_EXISTS_NOT_STUB CSRC FUNCTION VARIABLE)<br>
+  if(NOT DEFINED CHECKED_STUB_${VARIABLE})<br>
+    set(CHECKED_STUB_${VARIABLE} "done" CACHE INTERNAL "checked stub of ${FUNCTION}")<br>
+    CHECK_FUNCTION_EXISTS("${FUNCTION}" "${VARIABLE}")<br>
+    if(DEFINED ${VARIABLE})<br>
+      if(NOT CMAKE_REQUIRED_QUIET)<br>
+        message(STATUS "Looking for stubbed out ${FUNCTION}")<br>
+      endif()<br>
+      if(CMAKE_REQUIRED_INCLUDES)<br>
+        set(MACRO_CHECK_FUNCTION_EXISTS_NOT_STUB_INCLUDES<br>
+          "-DINCLUDE_DIRECTORIES:STRING=${CMAKE_REQUIRED_INCLUDES}")<br>
+      else()<br>
+        set(MACRO_CHECK_FUNCTION_EXISTS_NOT_STUB_INCLUDES)<br>
+      endif()<br>
+      set(MACRO_CHECK_FUNCTION_EXISTS_NOT_STUB_FLAGS ${CMAKE_REQUIRED_FLAGS})<br>
+      try_compile(${VARIABLE}<br>
+        ${CMAKE_BINARY_DIR}<br>
+        "${CSRC}"<br>
+        COMPILE_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS}<br>
+        CMAKE_FLAGS<br>
+        "-DCOMPILE_DEFINITIONS:STRING=-DL_features_h -DL_AC_CHECK_FUNC=${FUNCTION} -DL_AC_CHECK_FUNC_stub='defined __stub_${FUNCTION} || defined __stub___${FUNCTION}'"<br>
+        "${MACRO_CHECK_FUNCTION_EXISTS_NOT_STUB_FLAGS}"<br>
+        "${MACRO_CHECK_FUNCTION_EXISTS_NOT_STUB_INCLUDES}"<br>
+        OUTPUT_VARIABLE OUTPUT<br>
+      )<br>
+    endif()<br>
+    if(${VARIABLE})<br>
+      set(${VARIABLE} 1 CACHE INTERNAL "Have function ${FUNCTION}")<br>
+      file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log<br>
+        "Determining if function ${FUNCTION} is a stub "<br>
+        "passed with the following output:\n"<br>
+        "${OUTPUT}\n\n")<br>
+      if(NOT CMAKE_REQUIRED_QUIET)<br>
+        message(STATUS "Looking for stubbed out ${FUNCTION} - no stub")<br>
+      endif()<br>
+    else()<br>
+      set(${VARIABLE} "" CACHE INTERNAL "Have function ${FUNCTION}")<br>
+      file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log<br>
+        "Determining if function ${FUNCTION} is a stub "<br>
+        "failed with the following output:\n"<br>
+        "${OUTPUT}\n\n")<br>
+      if(NOT CMAKE_REQUIRED_QUIET)<br>
+        message(STATUS "Looking for stubbed out ${FUNCTION} - stub found")<br>
+      endif()<br>
+    endif()<br>
+  endif()<br>
+endmacro()<br>
diff --git a/lib/interception/interception_linux.cc b/lib/interception/interception_linux.cc<br>
index 6e908ac..c9b4a6e 100644<br>
--- a/lib/interception/interception_linux.cc<br>
+++ b/lib/interception/interception_linux.cc<br>
@@ -24,11 +24,13 @@ bool GetRealFunctionAddress(const char *func_name, uptr *func_addr,<br>
   return real == wrapper;<br>
 }<br>
<br>
+#ifdef HAVE_DLVSYM<br>
 #if !defined(__ANDROID__)  // android does not have dlvsym<br>
 void *GetFuncAddrVer(const char *func_name, const char *ver) {<br>
   return dlvsym(RTLD_NEXT, func_name, ver);<br>
 }<br>
 #endif  // !defined(__ANDROID__)<br>
+#endif // HAVE_DLVSYM<br>
<br>
 }  // namespace __interception<br>
<br>
diff --git a/lib/interception/interception_linux.h b/lib/interception/interception_linux.h<br>
index d3f774b..4802fe5 100644<br>
--- a/lib/interception/interception_linux.h<br>
+++ b/lib/interception/interception_linux.h<br>
@@ -25,7 +25,9 @@ namespace __interception {<br>
 // returns true if a function with the given name was found.<br>
 bool GetRealFunctionAddress(const char *func_name, uptr *func_addr,<br>
     uptr real, uptr wrapper);<br>
+# ifdef HAVE_DLVSYM<br>
 void *GetFuncAddrVer(const char *func_name, const char *ver);<br>
+# endif /* HAVE_DLVSYM */<br>
 }  // namespace __interception<br>
<br>
 #define INTERCEPT_FUNCTION_LINUX_OR_FREEBSD(func)                          \<br>
@@ -43,5 +45,12 @@ void *GetFuncAddrVer(const char *func_name, const char *ver);<br>
      INTERCEPT_FUNCTION_LINUX_OR_FREEBSD(func)<br>
 #endif  // !defined(__ANDROID__)<br>
<br>
+#ifndef HAVE_DLVSYM<br>
+/* Undo marketing crap above. Probe functionality, use result to decide.  */<br>
+# undef INTERCEPT_FUNCTION_VER_LINUX_OR_FREEBSD<br>
+# define INTERCEPT_FUNCTION_VER_LINUX_OR_FREEBSD(func, symver) \<br>
+            INTERCEPT_FUNCTION_LINUX_OR_FREEBSD(func)<br>
+#endif<br>
+<br>
 #endif  // INTERCEPTION_LINUX_H<br>
 #endif  // __linux__ || __FreeBSD__<br>
diff --git a/lib/sanitizer_common/sanitizer_common_interceptors.inc b/lib/sanitizer_common/sanitizer_common_interceptors.inc<br>
index 0d076a0..0a767d4 100644<br>
--- a/lib/sanitizer_common/sanitizer_common_interceptors.inc<br>
+++ b/lib/sanitizer_common/sanitizer_common_interceptors.inc<br>
@@ -1273,33 +1273,43 @@ static void unpoison_glob_t(void *ctx, __sanitizer_glob_t *pglob) {<br>
<br>
 static THREADLOCAL __sanitizer_glob_t *pglob_copy;<br>
<br>
+#ifdef HAVE_GLOB_T_GL_CLOSEDIR<br>
 static void wrapped_gl_closedir(void *dir) {<br>
   COMMON_INTERCEPTOR_UNPOISON_PARAM(1);<br>
   IndirectExternCall(pglob_copy->gl_closedir)(dir);<br>
 }<br>
+#endif<br>
<br>
+#ifdef HAVE_GLOB_T_GL_READDIR<br>
 static void *wrapped_gl_readdir(void *dir) {<br>
   COMMON_INTERCEPTOR_UNPOISON_PARAM(1);<br>
   return IndirectExternCall(pglob_copy->gl_readdir)(dir);<br>
 }<br>
+#endif<br>
<br>
+#ifdef HAVE_GLOB_T_GL_OPENDIR<br>
 static void *wrapped_gl_opendir(const char *s) {<br>
   COMMON_INTERCEPTOR_UNPOISON_PARAM(1);<br>
   COMMON_INTERCEPTOR_INITIALIZE_RANGE(s, REAL(strlen)(s) + 1);<br>
   return IndirectExternCall(pglob_copy->gl_opendir)(s);<br>
 }<br>
+#endif<br>
<br>
+#ifdef HAVE_GLOB_T_GL_LSTAT<br>
 static int wrapped_gl_lstat(const char *s, void *st) {<br>
   COMMON_INTERCEPTOR_UNPOISON_PARAM(2);<br>
   COMMON_INTERCEPTOR_INITIALIZE_RANGE(s, REAL(strlen)(s) + 1);<br>
   return IndirectExternCall(pglob_copy->gl_lstat)(s, st);<br>
 }<br>
+#endif<br>
<br>
+#ifdef HAVE_GLOB_T_GL_STAT<br>
 static int wrapped_gl_stat(const char *s, void *st) {<br>
   COMMON_INTERCEPTOR_UNPOISON_PARAM(2);<br>
   COMMON_INTERCEPTOR_INITIALIZE_RANGE(s, REAL(strlen)(s) + 1);<br>
   return IndirectExternCall(pglob_copy->gl_stat)(s, st);<br>
 }<br>
+#endif<br>
<br>
 INTERCEPTOR(int, glob, const char *pattern, int flags,<br>
             int (*errfunc)(const char *epath, int eerrno),<br>
@@ -1307,24 +1317,64 @@ INTERCEPTOR(int, glob, const char *pattern, int flags,<br>
   void *ctx;<br>
   COMMON_INTERCEPTOR_ENTER(ctx, glob, pattern, flags, errfunc, pglob);<br>
   __sanitizer_glob_t glob_copy = {<br>
-      0,                  0,                   0,<br>
-      0,                  wrapped_gl_closedir, wrapped_gl_readdir,<br>
-      wrapped_gl_opendir, wrapped_gl_lstat,    wrapped_gl_stat};<br>
+       0,<br>
+       0,<br>
+       0<br>
+#ifdef HAVE_GLOB_T_GL_FLAGS<br>
+       ,0<br>
+#endif<br>
+#ifdef HAVE_GLOB_T_GL_CLOSEDIR<br>
+       ,wrapped_gl_closedir<br>
+#endif<br>
+#ifdef HAVE_GLOB_T_GL_READDIR<br>
+       ,wrapped_gl_readdir<br>
+#endif<br>
+#ifdef HAVE_GLOB_T_GL_OPENDIR<br>
+       ,wrapped_gl_opendir<br>
+#endif<br>
+#ifdef HAVE_GLOB_T_GL_LSTAT<br>
+       ,wrapped_gl_lstat<br>
+#endif<br>
+#ifdef HAVE_GLOB_T_GL_STAT<br>
+       ,wrapped_gl_stat<br>
+#endif<br>
+  };<br>
+<br>
   if (flags & glob_altdirfunc) {<br>
+#ifdef HAVE_GLOB_T_GL_CLOSEDIR<br>
     Swap(pglob->gl_closedir, glob_copy.gl_closedir);<br>
+#endif<br>
+#ifdef HAVE_GLOB_T_GL_READDIR<br>
     Swap(pglob->gl_readdir, glob_copy.gl_readdir);<br>
+#endif<br>
+#ifdef HAVE_GLOB_T_GL_OPENDIR<br>
     Swap(pglob->gl_opendir, glob_copy.gl_opendir);<br>
+#endif<br>
+#ifdef HAVE_GLOB_T_GL_LSTAT<br>
     Swap(pglob->gl_lstat, glob_copy.gl_lstat);<br>
+#endif<br>
+#ifdef HAVE_GLOB_T_GL_STAT<br>
     Swap(pglob->gl_stat, glob_copy.gl_stat);<br>
+#endif<br>
     pglob_copy = &glob_copy;<br>
   }<br>
   int res = REAL(glob)(pattern, flags, errfunc, pglob);<br>
   if (flags & glob_altdirfunc) {<br>
+#ifdef HAVE_GLOB_T_GL_CLOSEDIR<br>
     Swap(pglob->gl_closedir, glob_copy.gl_closedir);<br>
+#endif<br>
+#ifdef HAVE_GLOB_T_GL_READDIR<br>
     Swap(pglob->gl_readdir, glob_copy.gl_readdir);<br>
+#endif<br>
+#ifdef HAVE_GLOB_T_GL_OPENDIR<br>
     Swap(pglob->gl_opendir, glob_copy.gl_opendir);<br>
+#endif<br>
+#ifdef HAVE_GLOB_T_GL_LSTAT<br>
     Swap(pglob->gl_lstat, glob_copy.gl_lstat);<br>
+#endif<br>
+#ifdef HAVE_GLOB_T_GL_STAT<br>
     Swap(pglob->gl_stat, glob_copy.gl_stat);<br>
+#endif<br>
   }<br>
   pglob_copy = 0;<br>
   if ((!res || res == glob_nomatch) && pglob) unpoison_glob_t(ctx, pglob);<br>
@@ -1337,24 +1387,63 @@ INTERCEPTOR(int, glob64, const char *pattern, int flags,<br>
   void *ctx;<br>
   COMMON_INTERCEPTOR_ENTER(ctx, glob64, pattern, flags, errfunc, pglob);<br>
   __sanitizer_glob_t glob_copy = {<br>
-      0,                  0,                   0,<br>
-      0,                  wrapped_gl_closedir, wrapped_gl_readdir,<br>
-      wrapped_gl_opendir, wrapped_gl_lstat,    wrapped_gl_stat};<br>
+       0,<br>
+       0,<br>
+       0<br>
+#ifdef HAVE_GLOB_T_GL_FLAGS<br>
+       ,0<br>
+#endif<br>
+#ifdef HAVE_GLOB_T_GL_CLOSEDIR<br>
+       ,wrapped_gl_closedir<br>
+#endif<br>
+#ifdef HAVE_GLOB_T_GL_READDIR<br>
+       ,wrapped_gl_readdir<br>
+#endif<br>
+#ifdef HAVE_GLOB_T_GL_OPENDIR<br>
+       ,wrapped_gl_opendir<br>
+#endif<br>
+#ifdef HAVE_GLOB_T_GL_LSTAT<br>
+       ,wrapped_gl_lstat<br>
+#endif<br>
+#ifdef HAVE_GLOB_T_GL_STAT<br>
+       ,wrapped_gl_stat<br>
+#endif<br>
+  };<br>
   if (flags & glob_altdirfunc) {<br>
+#ifdef HAVE_GLOB_T_GL_CLOSEDIR<br>
     Swap(pglob->gl_closedir, glob_copy.gl_closedir);<br>
+#endif<br>
+#ifdef HAVE_GLOB_T_GL_READDIR<br>
     Swap(pglob->gl_readdir, glob_copy.gl_readdir);<br>
+#endif<br>
+#ifdef HAVE_GLOB_T_GL_OPENDIR<br>
     Swap(pglob->gl_opendir, glob_copy.gl_opendir);<br>
+#endif<br>
+#ifdef HAVE_GLOB_T_GL_LSTAT<br>
     Swap(pglob->gl_lstat, glob_copy.gl_lstat);<br>
+#endif<br>
+#ifdef HAVE_GLOB_T_GL_STAT<br>
     Swap(pglob->gl_stat, glob_copy.gl_stat);<br>
+#endif<br>
     pglob_copy = &glob_copy;<br>
   }<br>
   int res = REAL(glob64)(pattern, flags, errfunc, pglob);<br>
   if (flags & glob_altdirfunc) {<br>
+#ifdef HAVE_GLOB_T_GL_CLOSEDIR<br>
     Swap(pglob->gl_closedir, glob_copy.gl_closedir);<br>
+#endif<br>
+#ifdef HAVE_GLOB_T_GL_READDIR<br>
     Swap(pglob->gl_readdir, glob_copy.gl_readdir);<br>
+#endif<br>
+#ifdef HAVE_GLOB_T_GL_OPENDIR<br>
     Swap(pglob->gl_opendir, glob_copy.gl_opendir);<br>
+#endif<br>
+#ifdef HAVE_GLOB_T_GL_LSTAT<br>
     Swap(pglob->gl_lstat, glob_copy.gl_lstat);<br>
+#endif<br>
+#ifdef HAVE_GLOB_T_GL_STAT<br>
     Swap(pglob->gl_stat, glob_copy.gl_stat);<br>
+#endif<br>
   }<br>
   pglob_copy = 0;<br>
   if ((!res || res == glob_nomatch) && pglob) unpoison_glob_t(ctx, pglob);<br>
diff --git a/lib/sanitizer_common/sanitizer_platform_limits_posix.cc b/lib/sanitizer_common/sanitizer_platform_limits_posix.cc<br>
index 9ae4870..645777f 100644<br>
--- a/lib/sanitizer_common/sanitizer_platform_limits_posix.cc<br>
+++ b/lib/sanitizer_common/sanitizer_platform_limits_posix.cc<br>
@@ -103,14 +103,18 @@<br>
 #endif<br>
<br>
 #if SANITIZER_LINUX || SANITIZER_FREEBSD<br>
+# ifdef HAVE_UTIME_H<br>
 # include <utime.h><br>
+# endif<br>
 # include <sys/ptrace.h><br>
 #endif<br>
<br>
 #if !SANITIZER_ANDROID<br>
 #include <ifaddrs.h><br>
 #include <sys/ucontext.h><br>
+# ifdef HAVE_WORDEXP_H<br>
 #include <wordexp.h><br>
+# endif<br>
 #endif<br>
<br>
 #if SANITIZER_LINUX && !SANITIZER_ANDROID<br>
@@ -119,7 +123,9 @@<br>
 #include <net/if_ppp.h><br>
 #include <netax25/ax25.h><br>
 #include <netipx/ipx.h><br>
+# ifdef HAVE_NETROM_NETROM_H<br>
 #include <netrom/netrom.h><br>
+# endif<br>
 #include <rpc/xdr.h><br>
 #include <scsi/scsi.h><br>
 #include <sys/mtio.h><br>
@@ -128,7 +134,9 @@<br>
 #include <sys/statvfs.h><br>
 #include <sys/timex.h><br>
 #include <sys/user.h><br>
+# ifdef HAVE_SYS_USTAT_H<br>
 #include <sys/ustat.h><br>
+# endif<br>
 #include <linux/cyclades.h><br>
 #include <linux/if_eql.h><br>
 #include <linux/if_plip.h><br>
@@ -215,12 +223,16 @@ namespace __sanitizer {<br>
 #if SANITIZER_LINUX || SANITIZER_FREEBSD<br>
   unsigned struct_rlimit_sz = sizeof(struct rlimit);<br>
   unsigned struct_timespec_sz = sizeof(struct timespec);<br>
+# ifdef HAVE_UTIME_H<br>
   unsigned struct_utimbuf_sz = sizeof(struct utimbuf);<br>
+# endif<br>
   unsigned struct_itimerspec_sz = sizeof(struct itimerspec);<br>
 #endif  // SANITIZER_LINUX || SANITIZER_FREEBSD<br>
<br>
 #if SANITIZER_LINUX && !SANITIZER_ANDROID<br>
+# ifdef HAVE_SYS_USTAT_H<br>
   unsigned struct_ustat_sz = sizeof(struct ustat);<br>
+# endif<br>
   unsigned struct_rlimit64_sz = sizeof(struct rlimit64);<br>
   unsigned struct_statvfs64_sz = sizeof(struct statvfs64);<br>
 #endif  // SANITIZER_LINUX && !SANITIZER_ANDROID<br>
@@ -266,7 +278,9 @@ namespace __sanitizer {<br>
<br>
 #if (SANITIZER_LINUX || SANITIZER_FREEBSD) && !SANITIZER_ANDROID<br>
   int glob_nomatch = GLOB_NOMATCH;<br>
+# ifdef GLOB_ALTDIRFUNC<br>
   int glob_altdirfunc = GLOB_ALTDIRFUNC;<br>
+# endif<br>
 #endif<br>
<br>
 #if SANITIZER_LINUX && !SANITIZER_ANDROID && \<br>
@@ -370,7 +384,9 @@ namespace __sanitizer {<br>
   unsigned struct_kbkeycode_sz = sizeof(struct kbkeycode);<br>
   unsigned struct_kbsentry_sz = sizeof(struct kbsentry);<br>
   unsigned struct_mtconfiginfo_sz = sizeof(struct mtconfiginfo);<br>
+# ifdef HAVE_NETROM_NETROM_H<br>
   unsigned struct_nr_parms_struct_sz = sizeof(struct nr_parms_struct);<br>
+# endif<br>
   unsigned struct_scc_modem_sz = sizeof(struct scc_modem);<br>
   unsigned struct_scc_stat_sz = sizeof(struct scc_stat);<br>
   unsigned struct_serial_multiport_struct_sz<br>
@@ -805,10 +821,18 @@ namespace __sanitizer {<br>
   unsigned IOCTL_SIOCAX25SETPARMS = SIOCAX25SETPARMS;<br>
   unsigned IOCTL_SIOCDEVPLIP = SIOCDEVPLIP;<br>
   unsigned IOCTL_SIOCIPXCFGDATA = SIOCIPXCFGDATA;<br>
+# ifdef SIOCNRDECOBS<br>
   unsigned IOCTL_SIOCNRDECOBS = SIOCNRDECOBS;<br>
+# endif<br>
+# ifdef SIOCNRGETPARMS<br>
   unsigned IOCTL_SIOCNRGETPARMS = SIOCNRGETPARMS;<br>
+# endif<br>
+# ifdef SIOCNRRTCTL<br>
   unsigned IOCTL_SIOCNRRTCTL = SIOCNRRTCTL;<br>
+# endif<br>
+# ifdef SIOCNRSETPARMS<br>
   unsigned IOCTL_SIOCNRSETPARMS = SIOCNRSETPARMS;<br>
+# endif<br>
   unsigned IOCTL_TIOCGSERIAL = TIOCGSERIAL;<br>
   unsigned IOCTL_TIOCSERGETMULTI = TIOCSERGETMULTI;<br>
   unsigned IOCTL_TIOCSERSETMULTI = TIOCSERSETMULTI;<br>
@@ -890,12 +914,24 @@ CHECK_TYPE_SIZE(glob_t);<br>
 CHECK_SIZE_AND_OFFSET(glob_t, gl_pathc);<br>
 CHECK_SIZE_AND_OFFSET(glob_t, gl_pathv);<br>
 CHECK_SIZE_AND_OFFSET(glob_t, gl_offs);<br>
+# ifdef HAVE_GLOB_T_GL_FLAGS<br>
 CHECK_SIZE_AND_OFFSET(glob_t, gl_flags);<br>
+# endif<br>
+# ifdef HAVE_GLOB_T_GL_CLOSEDIR<br>
 CHECK_SIZE_AND_OFFSET(glob_t, gl_closedir);<br>
+# endif<br>
+# ifdef HAVE_GLOB_T_GL_READDIR<br>
 CHECK_SIZE_AND_OFFSET(glob_t, gl_readdir);<br>
+# endif<br>
+# ifdef HAVE_GLOB_T_GL_OPENDIR<br>
 CHECK_SIZE_AND_OFFSET(glob_t, gl_opendir);<br>
+# endif<br>
+# ifdef HAVE_GLOB_T_GL_LSTAT<br>
 CHECK_SIZE_AND_OFFSET(glob_t, gl_lstat);<br>
+# endif<br>
+# ifdef HAVE_GLOB_T_GL_STAT<br>
 CHECK_SIZE_AND_OFFSET(glob_t, gl_stat);<br>
+# endif<br>
 #endif<br>
<br>
 CHECK_TYPE_SIZE(addrinfo);<br>
@@ -967,11 +1003,17 @@ CHECK_TYPE_SIZE(sigset_t);<br>
 COMPILER_CHECK(sizeof(__sanitizer_sigaction) == sizeof(struct sigaction));<br>
 // Can't write checks for sa_handler and sa_sigaction due to them being<br>
 // preprocessor macros.<br>
+#if HAVE_STRUCT_SIGACTION_SA_MASK_LAST<br>
+CHECK_STRUCT_SIZE_AND_OFFSET(sigaction, sa_flags);<br>
+CHECK_STRUCT_SIZE_AND_OFFSET(sigaction, sa_restorer);<br>
+CHECK_STRUCT_SIZE_AND_OFFSET(sigaction, sa_mask);<br>
+#else // HAVE_STRUCT_SIGACTION_SA_MASK_LAST<br>
 CHECK_STRUCT_SIZE_AND_OFFSET(sigaction, sa_mask);<br>
 CHECK_STRUCT_SIZE_AND_OFFSET(sigaction, sa_flags);<br>
 #if SANITIZER_LINUX<br>
 CHECK_STRUCT_SIZE_AND_OFFSET(sigaction, sa_restorer);<br>
 #endif<br>
+#endif // HAVE_STRUCT_SIGACTION_SA_MASK_LAST<br>
<br>
 #if SANITIZER_LINUX<br>
 CHECK_TYPE_SIZE(__sysctl_args);<br>
@@ -991,7 +1033,7 @@ CHECK_TYPE_SIZE(__kernel_loff_t);<br>
 CHECK_TYPE_SIZE(__kernel_fd_set);<br>
 #endif<br>
<br>
-#if !SANITIZER_ANDROID<br>
+#ifdef HAVE_WORDEXP_H<br>
 CHECK_TYPE_SIZE(wordexp_t);<br>
 CHECK_SIZE_AND_OFFSET(wordexp_t, we_wordc);<br>
 CHECK_SIZE_AND_OFFSET(wordexp_t, we_wordv);<br>
diff --git a/lib/sanitizer_common/sanitizer_platform_limits_posix.h b/lib/sanitizer_common/sanitizer_platform_limits_posix.h<br>
index a780ee2..04c6a96 100644<br>
--- a/lib/sanitizer_common/sanitizer_platform_limits_posix.h<br>
+++ b/lib/sanitizer_common/sanitizer_platform_limits_posix.h<br>
@@ -478,7 +478,8 @@ namespace __sanitizer {<br>
 #elif SANITIZER_LINUX<br>
   struct __sanitizer_sigset_t {<br>
     // The size is determined by looking at sizeof of real sigset_t on linux.<br>
-    uptr val[128 / sizeof(uptr)];<br>
+    /* .. except this should be * sizeof(uptr), not '/', no? */<br>
+    uptr val[SIZEOF_SIGSET_T / sizeof(uptr)];<br>
   };<br>
 #elif SANITIZER_FREEBSD<br>
   struct __sanitizer_sigset_t {<br>
@@ -487,6 +488,17 @@ namespace __sanitizer {<br>
   };<br>
 #endif<br>
<br>
+#if HAVE_STRUCT_SIGACTION_SA_MASK_LAST<br>
+  struct __sanitizer_sigaction {<br>
+    union {<br>
+      void (*sigaction)(int sig, void *siginfo, void *uctx);<br>
+      void (*handler)(int sig);<br>
+    };<br>
+    STRUCT_SIGACTION_SA_FLAGS_TYPE sa_flags;<br>
+    void (*sa_restorer)();<br>
+    __sanitizer_sigset_t sa_mask;<br>
+  };<br>
+#else // HAVE_STRUCT_SIGACTION_SA_MASK_LAST<br>
   // Linux system headers define the 'sa_handler' and 'sa_sigaction' macros.<br>
   struct __sanitizer_sigaction {<br>
     union {<br>
@@ -504,6 +516,7 @@ namespace __sanitizer {<br>
     void (*sa_restorer)();<br>
 #endif<br>
   };<br>
+#endif // HAVE_STRUCT_SIGACTION_SA_MASK_LAST<br>
<br>
 #if SANITIZER_FREEBSD<br>
   typedef __sanitizer_sigset_t __sanitizer_kernel_sigset_t;<br>
@@ -588,13 +601,25 @@ namespace __sanitizer {<br>
     uptr gl_pathc;<br>
     char **gl_pathv;<br>
     uptr gl_offs;<br>
+#  ifdef HAVE_GLOB_T_GL_FLAGS<br>
     int gl_flags;<br>
+#  endif<br>
<br>
+#  ifdef HAVE_GLOB_T_GL_CLOSEDIR<br>
     void (*gl_closedir)(void *dirp);<br>
+#  endif<br>
+#  ifdef HAVE_GLOB_T_GL_READDIR<br>
     void *(*gl_readdir)(void *dirp);<br>
+#  endif<br>
+#  ifdef HAVE_GLOB_T_GL_OPENDIR<br>
     void *(*gl_opendir)(const char *);<br>
+#  endif<br>
+#  ifdef HAVE_GLOB_T_GL_LSTAT<br>
     int (*gl_lstat)(const char *, void *);<br>
+#  endif<br>
+#  ifdef HAVE_GLOB_T_GL_STAT<br>
     int (*gl_stat)(const char *, void *);<br>
+#  endif<br>
   };<br>
 # elif SANITIZER_FREEBSD<br>
   struct __sanitizer_glob_t {<br>
diff --git a/lib/sanitizer_common/sanitizer_posix_libcdep.cc b/lib/sanitizer_common/sanitizer_posix_libcdep.cc<br>
index bb6e587..973f698 100644<br>
--- a/lib/sanitizer_common/sanitizer_posix_libcdep.cc<br>
+++ b/lib/sanitizer_common/sanitizer_posix_libcdep.cc<br>
@@ -73,7 +73,16 @@ void SleepForSeconds(int seconds) {<br>
 }<br>
<br>
 void SleepForMillis(int millis) {<br>
+#ifdef HAVE_NANOSLEEP<br>
+  struct timespec ts;<br>
+  ts.tv_sec = millis / 1000;<br>
+  ts.tv_nsec = (millis % 1000) * 1000000;<br>
+  nanosleep(&ts, NULL); /* could as well loop here */<br>
+#elif defined HAVE_USLEEP<br>
   usleep(millis * 1000);<br>
+# else<br>
+  dunno how to SleepForMillis<br>
+#endif<br>
 }<br>
<br>
 void Abort() {<br>
diff --git a/make/platform/<a href="http://clang_linux.mk" target="_blank">clang_linux.mk</a> b/make/platform/<a href="http://clang_linux.mk" target="_blank">clang_linux.mk</a><br>
index c6921ea..5ce1567 100644<br>
--- a/make/platform/<a href="http://clang_linux.mk" target="_blank">clang_linux.mk</a><br>
+++ b/make/platform/<a href="http://clang_linux.mk" target="_blank">clang_linux.mk</a><br>
@@ -74,6 +74,185 @@ Arch.dfsan-x86_64 := x86_64<br>
 Arch.lsan-x86_64 := x86_64<br>
 endif<br>
<br>
+# TryCompile2 compiler source flags<br>
+# Returns exit code of running a compiler invocation.<br>
+# Same as TryCompile but in outer scope, don't want to touch the other one<br>
+TryCompile2 = \<br>
+  $(shell \<br>
+    cflags=""; \<br>
+    for flag in $(3); do \<br>
+      cflags="$$cflags $$flag"; \<br>
+    done; \<br>
+    $(1) $$cflags $(2) -o /dev/null > /dev/null 2> /dev/null ; \<br>
+    echo $$?)<br>
+<br>
+# our conftest.c<br>
+ct_c = $(ProjSrcRoot)/make/platform/clang_linux_test_libc.c<br>
+<br>
+HAVE_DLVSYM := 1<br>
+HAVE_NETROM_NETROM_H := 1<br>
+HAVE_GLOB_H := 1<br>
+HAVE_NANOSLEEP := 1<br>
+HAVE_GLOB_T_GL_CLOSEDIR := 1<br>
+HAVE_GLOB_T_GL_FLAGS := 1<br>
+HAVE_GLOB_T_GL_LSTAT := 1<br>
+HAVE_GLOB_T_GL_OPENDIR := 1<br>
+HAVE_GLOB_T_GL_READDIR := 1<br>
+HAVE_GLOB_T_GL_STAT := 1<br>
+HAVE_STRUCT_SIGACTION_SA_MASK_LAST := 0<br>
+HAVE_SYS_USTAT_H := 1<br>
+HAVE_USLEEP := 1<br>
+HAVE_UTIME_H := 1<br>
+HAVE_WORDEXP_H := 1<br>
+SIZEOF_STRUCT_STATFS64 := 120<br>
+SIZEOF_SIGSET_T := 128<br>
+STRUCT_SIGACTION_SA_FLAGS_TYPE := int<br>
+<br>
+#ifneq ($(findstring -uclibc,$(CompilerTargetTriple)),)<br>
+# does not work, cross-compilation seems to be non-working?<br>
+ifeq ($(call TryCompile2,$(CC),$(ct_c) -DL_MAIN -DL_AC_CHECK_UCLIBC -DL_AC_CHECK_HEADER="<stdio.h>",),0)<br>
+  HAVE_DLVSYM :=<br>
+  HAVE_NETROM_NETROM_H :=<br>
+  STRUCT_SIGACTION_SA_FLAGS_TYPE := unsigned long<br>
+ifneq ($(filter alpha%,$(CompilerTargetTriple)),)<br>
+  STRUCT_SIGACTION_SA_FLAGS_TYPE := unsigned<br>
+endif<br>
+ifneq ($(filter mips%,$(CompilerTargetTriple)),)<br>
+  STRUCT_SIGACTION_SA_FLAGS_TYPE := unsigned<br>
+endif<br>
+  HAVE_STRUCT_SIGACTION_SA_MASK_LAST := 1<br>
+ifneq ($(call TryCompile2,$(CC),$(ct_c) -DL_MAIN -DL_AC_CHECK_HEADER="<sys/ustat.h>",),0)<br>
+  HAVE_SYS_USTAT_H :=<br>
+endif<br>
+ifneq ($(call TryCompile2,$(CC),$(ct_c) -DL_MAIN -DL_AC_CHECK_HEADER="<utime.h>",),0)<br>
+  HAVE_UTIME_H :=<br>
+endif<br>
+ifneq ($(call TryCompile2,$(CC),$(ct_c) -DL_MAIN -DL_AC_CHECK_HEADER="<wordexp.h>",),0)<br>
+  HAVE_WORDEXP_H :=<br>
+endif<br>
+glob_h := -DL_AC_CHECK_HEADER="<glob.h>"<br>
+ifneq ($(call TryCompile2,$(CC),$(ct_c) -DL_MAIN $(glob_h),),0)<br>
+  HAVE_GLOB_H :=<br>
+endif<br>
+# check for struct glob members (check for GNU extensions)<br>
+glob_h += -DL_AC_STRUCT="glob_t"<br>
+ifneq ($(call TryCompile2,$(CC),$(ct_c) $(glob_h) -DL_AC_CHECK_STRUCT_MEMBER=gl_flags,),0)<br>
+  HAVE_GLOB_T_GL_FLAGS :=<br>
+endif<br>
+ifneq ($(call TryCompile2,$(CC),$(ct_c) $(glob_h) -DL_AC_CHECK_STRUCT_MEMBER=gl_closedir,),0)<br>
+  HAVE_GLOB_T_GL_CLOSEDIR :=<br>
+endif<br>
+ifneq ($(call TryCompile2,$(CC),$(ct_c) $(glob_h) -DL_AC_CHECK_STRUCT_MEMBER=gl_readdir,),0)<br>
+  HAVE_GLOB_T_GL_READDIR :=<br>
+endif<br>
+ifneq ($(call TryCompile2,$(CC),$(ct_c) $(glob_h) -DL_AC_CHECK_STRUCT_MEMBER=gl_opendir,),0)<br>
+  HAVE_GLOB_T_GL_OPENDIR :=<br>
+endif<br>
+ifneq ($(call TryCompile2,$(CC),$(ct_c) $(glob_h) -DL_AC_CHECK_STRUCT_MEMBER=gl_lstat,),0)<br>
+  HAVE_GLOB_T_GL_LSTAT :=<br>
+endif<br>
+ifneq ($(call TryCompile2,$(CC),$(ct_c) $(glob_h) -DL_AC_CHECK_STRUCT_MEMBER=gl_stat,),0)<br>
+  HAVE_GLOB_T_GL_STAT :=<br>
+endif<br>
+# check misc functions<br>
+# for __stub_* on glibc and uClibc including features.h is enough<br>
+ifneq ($(call TryCompile2,$(CC),$(ct_c) -DL_features_h -DL_AC_CHECK_FUNC=nanosleep -DL_AC_CHECK_FUNC_stub="defined __stub_nanosleep || defined __stub___nanosleep",),0)<br>
+  HAVE_NANOSLEEP :=<br>
+endif<br>
+ifneq ($(call TryCompile2,$(CC),$(ct_c) -DL_features_h -DL_AC_CHECK_FUNC=usleep -DL_AC_CHECK_FUNC_stub="defined __stub_usleep || defined __stub___usleep",),0)<br>
+  HAVE_USLEEP :=<br>
+endif<br>
+<br>
+# AC_CHECK_SIZEOF, in make<br>
+define ac_check_sizeof<br>
+$(shell \<br>
+if test $$($(CC) $(1) -DL_AC_SIZEOF_GE=0 -o /dev/null > /dev/null 2> /dev/null; echo $$?) -eq 0; \<br>
+then \<br>
+  ac_lo=0 ac_mid=0; \<br>
+  while :; \<br>
+  do \<br>
+  if test $$($(CC) $(1) -DL_AC_SIZEOF_LE=$$ac_mid -o /dev/null > /dev/null 2> /dev/null; echo $$?) -eq 0; then \<br>
+    ac_hi=$$ac_mid; \<br>
+    break; \<br>
+  else \<br>
+    ac_lo=$$(( $$ac_mid + 1 )); \<br>
+    if test $$ac_lo -le $$ac_mid; then ac_lo= ac_hi=; break; fi; \<br>
+    ac_mid=$$(( 2 * $$ac_mid + 1 )); \<br>
+  fi; \<br>
+  done; \<br>
+else \<br>
+  if test $$($(CC) $(1) -DL_AC_SIZEOF_LT=0 -o /dev/null > /dev/null 2> /dev/null; echo $$?) -eq 0; then \<br>
+    ac_hi=-1 ac_mid=-1; \<br>
+    while :; \<br>
+    do \<br>
+    if test $$($(CC) $(1) -DL_AC_SIZEOF_GE=$$ac_mid -o /dev/null > /dev/null 2> /dev/null; echo $$?) -eq 0; then \<br>
+      ac_lo=$$ac_mid; \<br>
+      break; \<br>
+    else \<br>
+      ac_hi=$$(( ($$ac_mid) - 1 )); \<br>
+      if test $$ac_mid -le $$ac_hi; then ac_lo= ac_hi=; break; fi; \<br>
+      ac_mid=$$(( 2 * $$ac_mid )); \<br>
+    fi; \<br>
+    done; \<br>
+  else \<br>
+    ac_lo= ac_hi=; \<br>
+  fi; \<br>
+fi; \<br>
+while test "x$$ac_lo" != "x$$ac_hi"; \<br>
+do \<br>
+  ac_mid=$$(( ($$ac_hi - $$ac_lo) / 2 + $$ac_lo )); \<br>
+  if test $$($(CC) $(1) -DL_AC_SIZEOF_LE=$$ac_mid -o /dev/null > /dev/null 2> /dev/null; echo $$?) -eq 0; then \<br>
+    ac_hi=$$ac_mid; \<br>
+  else \<br>
+    ac_lo=$$(( ($$ac_mid) + 1 )); \<br>
+  fi; \<br>
+done; \<br>
+echo $$(( $$ac_lo + 0 )); \<br>
+)<br>
+endef<br>
+<br>
+# determine sizeof sigset_t<br>
+SIZEOF_SIGSET_T := $(call ac_check_sizeof,$(ct_c) -DL_AC_CHECK_HEADER="<signal.h>" -DL_AC_SIZEOF="sigset_t")<br>
+<br>
+# determine sizeof struct statfs64<br>
+SIZEOF_STRUCT_STATFS64 := 0<br>
+ifeq ($(call TryCompile2,$(CC),$(ct_c) -DL_MAIN -DL_AC_CHECK_HEADER="<sys/statfs.h>",),0)<br>
+SIZEOF_STRUCT_STATFS64 := $(call ac_check_sizeof,$(ct_c) -DL_AC_CHECK_HEADER="<sys/statfs.h>" -DL_AC_SIZEOF="struct statfs64")<br>
+else<br>
+ ifeq ($(call TryCompile2,$(CC),$(ct_c) -DL_MAIN -DL_AC_CHECK_HEADER="<sys/vfs.h>",),0)<br>
+ SIZEOF_STRUCT_STATFS64 := $(call ac_check_sizeof,$(ct_c) -DL_AC_CHECK_HEADER="<sys/vfs.h>" -DL_AC_SIZEOF="struct statfs64")<br>
+ endif<br>
+endif<br>
+# end of -uclibc handling<br>
+endif<br>
+<br>
+define add_config_h_cppflag<br>
+ifeq ($($(1)),)<br>
+CONFIG_H_CPPFLAGS += -U$(1)<br>
+else<br>
+CONFIG_H_CPPFLAGS += '-D$(1)=$($(1))'<br>
+endif<br>
+endef<br>
+<br>
+CONFIG_H_CPPFLAGS :=<br>
+$(eval $(call add_config_h_cppflag,HAVE_DLVSYM))<br>
+$(eval $(call add_config_h_cppflag,HAVE_GLOB_H))<br>
+$(eval $(call add_config_h_cppflag,HAVE_NANOSLEEP))<br>
+$(eval $(call add_config_h_cppflag,HAVE_NETROM_NETROM_H))<br>
+$(eval $(call add_config_h_cppflag,HAVE_GLOB_T_GL_CLOSEDIR))<br>
+$(eval $(call add_config_h_cppflag,HAVE_GLOB_T_GL_FLAGS))<br>
+$(eval $(call add_config_h_cppflag,HAVE_GLOB_T_GL_LSTAT))<br>
+$(eval $(call add_config_h_cppflag,HAVE_GLOB_T_GL_OPENDIR))<br>
+$(eval $(call add_config_h_cppflag,HAVE_GLOB_T_GL_READDIR))<br>
+$(eval $(call add_config_h_cppflag,HAVE_GLOB_T_GL_STAT))<br>
+$(eval $(call add_config_h_cppflag,HAVE_STRUCT_SIGACTION_SA_MASK_LAST))<br>
+$(eval $(call add_config_h_cppflag,HAVE_SYS_USTAT_H))<br>
+$(eval $(call add_config_h_cppflag,HAVE_USLEEP))<br>
+$(eval $(call add_config_h_cppflag,HAVE_UTIME_H))<br>
+$(eval $(call add_config_h_cppflag,HAVE_WORDEXP_H))<br>
+$(eval $(call add_config_h_cppflag,SIZEOF_STRUCT_STATFS64))<br>
+$(eval $(call add_config_h_cppflag,SIZEOF_SIGSET_T))<br>
+$(eval $(call add_config_h_cppflag,STRUCT_SIGACTION_SA_FLAGS_TYPE))<br>
 endif<br>
<br>
 ifneq ($(LLVM_ANDROID_TOOLCHAIN_DIR),)<br>
@@ -87,6 +266,7 @@ endif<br>
<br>
 CFLAGS := -Wall -Werror -O3 -fomit-frame-pointer<br>
 SANITIZER_CFLAGS := -fPIE -fno-builtin -gline-tables-only<br>
+CFLAGS += $(CONFIG_H_CPPFLAGS)<br>
<br>
 CFLAGS.full-i386 := $(CFLAGS) -m32<br>
 CFLAGS.full-x86_64 := $(CFLAGS) -m64<br>
diff --git a/make/platform/clang_linux_test_libc.c b/make/platform/clang_linux_test_libc.c<br>
new file mode 100644<br>
index 0000000..2f9bba8<br>
--- /dev/null<br>
+++ b/make/platform/clang_linux_test_libc.c<br>
@@ -0,0 +1,68 @@<br>
+/* This file is used to check for libc characteristics and features */<br>
+#ifdef L_features_h<br>
+# include <features.h><br>
+#endif<br>
+<br>
+#ifdef L_AC_CHECK_HEADER<br>
+/* compile-time check for availability of a header */<br>
+# include L_AC_CHECK_HEADER<br>
+#endif<br>
+<br>
+#ifdef L_AC_CHECK_UCLIBC<br>
+# ifndef __UCLIBC__<br>
+choke me /* not uClibc */<br>
+# endif<br>
+#endif<br>
+<br>
+#ifdef L_MAIN<br>
+/* provide a dummy main for the linker */<br>
+int main()<br>
+{<br>
+  return 0;<br>
+}<br>
+#endif<br>
+<br>
+#ifdef L_AC_CHECK_STRUCT_MEMBER<br>
+/* compile-time check for presence of struct member */<br>
+int main()<br>
+{<br>
+  static L_AC_STRUCT ac_aggr;<br>
+  if (ac_aggr.L_AC_CHECK_STRUCT_MEMBER)<br>
+    return 0;<br>
+  return 0;<br>
+}<br>
+#endif<br>
+<br>
+#ifdef L_AC_CHECK_FUNC<br>
+/* check if function (or macro) is available */<br>
+# ifdef __cplusplus<br>
+extern "C"<br>
+# endif<br>
+# if L_AC_CHECK_FUNC_stub<br>
+choke me /* function 'L_AC_CHECK_FUNC' stubbed out! */<br>
+# endif<br>
+char L_AC_CHECK_FUNC ();<br>
+int main ()<br>
+{<br>
+       return L_AC_CHECK_FUNC ();<br>
+}<br>
+#endif<br>
+<br>
+#ifdef L_AC_SIZEOF<br>
+/* Determine sizeof expression */<br>
+int main ()<br>
+{<br>
+# define s (long int) (sizeof (L_AC_SIZEOF))<br>
+# if defined L_AC_SIZEOF_GE<br>
+  static int test_array [1 - 2 * !((s) >= L_AC_SIZEOF_GE)];<br>
+# elif defined L_AC_SIZEOF_LE<br>
+  static int test_array [1 - 2 * !((s) <= L_AC_SIZEOF_LE)];<br>
+# elif defined L_AC_SIZEOF_LT<br>
+  static int test_array [1 - 2 * !((s) <  L_AC_SIZEOF_LT)];<br>
+# else<br>
+#  error no such comparison operator<br>
+# endif<br>
+  test_array [0] = 0;<br>
+  return 0;<br>
+}<br>
+#endif<br>
<span class="HOEnZb"><font color="#888888">--<br>
1.9.1<br>
<br>
</font></span></blockquote></div><br></div>