[compiler-rt] r236551 - [asan] Use a version script to limit the symbols exported by the ASan shared runtime library.

Evgeniy Stepanov eugeni.stepanov at gmail.com
Tue May 5 15:51:36 PDT 2015


Author: eugenis
Date: Tue May  5 17:51:35 2015
New Revision: 236551

URL: http://llvm.org/viewvc/llvm-project?rev=236551&view=rev
Log:
[asan] Use a version script to limit the symbols exported by the ASan shared runtime library.

Modified:
    compiler-rt/trunk/cmake/Modules/SanitizerUtils.cmake
    compiler-rt/trunk/lib/asan/CMakeLists.txt
    compiler-rt/trunk/lib/sanitizer_common/scripts/gen_dynamic_list.py

Modified: compiler-rt/trunk/cmake/Modules/SanitizerUtils.cmake
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/cmake/Modules/SanitizerUtils.cmake?rev=236551&r1=236550&r2=236551&view=diff
==============================================================================
--- compiler-rt/trunk/cmake/Modules/SanitizerUtils.cmake (original)
+++ compiler-rt/trunk/cmake/Modules/SanitizerUtils.cmake Tue May  5 17:51:35 2015
@@ -13,9 +13,13 @@ set(SANITIZER_LINT_SCRIPT
 #   add_sanitizer_rt_symbols(<name> <files with extra symbols to export>)
 macro(add_sanitizer_rt_symbols name)
   set(stamp ${CMAKE_CURRENT_BINARY_DIR}/${name}.syms-stamp)
+  set(extra_args)
+  foreach(arg ${ARGN})
+    list(APPEND extra_args "--extra" ${arg})
+  endforeach()
   add_custom_command(OUTPUT ${stamp}
     COMMAND ${PYTHON_EXECUTABLE}
-      ${SANITIZER_GEN_DYNAMIC_LIST} $<TARGET_FILE:${name}> ${ARGN}
+      ${SANITIZER_GEN_DYNAMIC_LIST} ${extra_args} $<TARGET_FILE:${name}>
       > $<TARGET_FILE:${name}>.syms
     COMMAND ${CMAKE_COMMAND} -E touch ${stamp}
     DEPENDS ${name} ${SANITIZER_GEN_DYNAMIC_LIST} ${ARGN}
@@ -44,6 +48,29 @@ macro(add_sanitizer_rt_symbols name)
   endif()
 endmacro()
 
+macro(add_sanitizer_rt_version_list name)
+  set(vers ${CMAKE_CURRENT_BINARY_DIR}/${name}.vers)
+  parse_arguments(ARG "LIB;EXTRA" "" ${ARGN})
+  set(args)
+  foreach(arg ${ARG_EXTRA})
+    list(APPEND args "--extra" ${arg})
+  endforeach()
+  foreach(arg ${ARG_LIB})
+    list(APPEND args "$<TARGET_FILE:${arg}>")
+  endforeach()
+  add_custom_command(OUTPUT ${vers}
+    COMMAND ${PYTHON_EXECUTABLE}
+      ${SANITIZER_GEN_DYNAMIC_LIST} --version-list ${args}
+      > ${vers}
+    DEPENDS ${SANITIZER_GEN_DYNAMIC_LIST} ${ARG_EXTRA} ${ARG_LIB}
+    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
+    COMMENT "Generating version list for ${name}"
+    VERBATIM)
+
+  add_custom_target(${name}-version-list ALL
+    DEPENDS ${vers})
+endmacro()
+
 # Add target to check code style for sanitizer runtimes.
 if(UNIX)
   add_custom_target(SanitizerLintCheck

Modified: compiler-rt/trunk/lib/asan/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/CMakeLists.txt?rev=236551&r1=236550&r2=236551&view=diff
==============================================================================
--- compiler-rt/trunk/lib/asan/CMakeLists.txt (original)
+++ compiler-rt/trunk/lib/asan/CMakeLists.txt Tue May  5 17:51:35 2015
@@ -145,6 +145,15 @@ else()
       DEFS ${ASAN_COMMON_DEFINITIONS})
     add_dependencies(asan clang_rt.asan-preinit-${arch})
 
+    if (UNIX AND NOT ${arch} MATCHES "i386|i686")
+      add_sanitizer_rt_version_list(clang_rt.asan-dynamic-${arch}
+                                    LIB clang_rt.asan-${arch} clang_rt.asan_cxx-${arch}
+                                    EXTRA asan.syms.extra)
+      add_dependencies(asan clang_rt.asan-dynamic-${arch}-version-list)
+      list(APPEND ASAN_DYNAMIC_LINK_FLAGS
+           -Wl,--version-script,${CMAKE_CURRENT_BINARY_DIR}/clang_rt.asan-dynamic-${arch}.vers)
+    endif()
+
     if (WIN32)
       set(SHARED_ASAN_NAME clang_rt.asan_dynamic-${arch}${COMPILER_RT_OS_SUFFIX})
     else()
@@ -162,6 +171,7 @@ else()
     add_dependencies(asan clang_rt.asan-dynamic-${arch})
 
     if (UNIX AND NOT ${arch} MATCHES "i386|i686")
+      add_dependencies(clang_rt.asan-dynamic-${arch} clang_rt.asan-dynamic-${arch}-version-list)
       add_sanitizer_rt_symbols(clang_rt.asan_cxx-${arch})
       add_dependencies(asan clang_rt.asan_cxx-${arch}-symbols)
       add_sanitizer_rt_symbols(clang_rt.asan-${arch} asan.syms.extra)

Modified: compiler-rt/trunk/lib/sanitizer_common/scripts/gen_dynamic_list.py
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/scripts/gen_dynamic_list.py?rev=236551&r1=236550&r2=236551&view=diff
==============================================================================
--- compiler-rt/trunk/lib/sanitizer_common/scripts/gen_dynamic_list.py (original)
+++ compiler-rt/trunk/lib/sanitizer_common/scripts/gen_dynamic_list.py Tue May  5 17:51:35 2015
@@ -14,6 +14,7 @@
 #   gen_dynamic_list.py libclang_rt.*san*.a [ files ... ]
 #
 #===------------------------------------------------------------------------===#
+import argparse
 import os
 import re
 import subprocess
@@ -49,10 +50,17 @@ def get_global_functions(library):
   return functions
 
 def main(argv):
+  parser = argparse.ArgumentParser()
+  parser.add_argument('--version-list', action='store_true')
+  parser.add_argument('--extra', default=[], action='append')
+  parser.add_argument('libraries', default=[], nargs='+')
+  args = parser.parse_args()
+
   result = []
 
-  library = argv[1]
-  all_functions = get_global_functions(library)
+  all_functions = []
+  for library in args.libraries:
+    all_functions.extend(get_global_functions(library))
   function_set = set(all_functions)
   for func in all_functions:
     # Export new/delete operators.
@@ -74,15 +82,20 @@ def main(argv):
       result.append(func)
 
   # Additional exported functions from files.
-  for fname in argv[2:]:
+  for fname in args.extra:
     f = open(fname, 'r')
     for line in f:
       result.append(line.rstrip())
   # Print the resulting list in the format recognized by ld.
   print('{')
+  if args.version_list:
+    print('global:')
   result.sort()
   for f in result:
-    print('  ' + f + ';')
+    print('  ' + f.encode('utf-8') + ';')
+  if args.version_list:
+    print('local:')
+    print('  *;')
   print('};')
 
 if __name__ == '__main__':





More information about the llvm-commits mailing list