[asan] Use a version script to limit the symbols exported by the ASan shared runtime library.
llvm-svn: 236551
This commit is contained in:
parent
ce9ad757c7
commit
e8b9d791c2
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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__':
|
||||
|
|
Loading…
Reference in New Issue