[compiler-rt] r298159 - [asan] Fix dead stripping of globals on Linux (compiler-rt)
Evgeniy Stepanov via llvm-commits
llvm-commits at lists.llvm.org
Fri Mar 17 15:17:38 PDT 2017
Author: eugenis
Date: Fri Mar 17 17:17:38 2017
New Revision: 298159
URL: http://llvm.org/viewvc/llvm-project?rev=298159&view=rev
Log:
[asan] Fix dead stripping of globals on Linux (compiler-rt)
Runtime support for the new instrumentation of globals based on !associated, and a bunch of tests.
Differential Revision: https://reviews.llvm.org/D30120
Added:
compiler-rt/trunk/test/asan/TestCases/Linux/global-overflow-bfd.cc
compiler-rt/trunk/test/asan/TestCases/Linux/global-overflow-lld.cc
compiler-rt/trunk/test/asan/TestCases/Linux/globals-gc-sections-lld.cc
Modified:
compiler-rt/trunk/lib/asan/asan_globals.cc
compiler-rt/trunk/lib/asan/asan_interface.inc
compiler-rt/trunk/lib/asan/asan_interface_internal.h
compiler-rt/trunk/test/asan/CMakeLists.txt
compiler-rt/trunk/test/asan/TestCases/Linux/globals-gc-sections.cc
Modified: compiler-rt/trunk/lib/asan/asan_globals.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/asan_globals.cc?rev=298159&r1=298158&r2=298159&view=diff
==============================================================================
--- compiler-rt/trunk/lib/asan/asan_globals.cc (original)
+++ compiler-rt/trunk/lib/asan/asan_globals.cc Fri Mar 17 17:17:38 2017
@@ -332,6 +332,26 @@ void __asan_unregister_image_globals(upt
*flag = 0;
}
+void __asan_register_elf_globals(uptr *flag, void *start, void *stop) {
+ if (*flag) return;
+ if (!start) return;
+ CHECK_EQ(0, ((uptr)stop - (uptr)start) % sizeof(__asan_global));
+ __asan_global *globals_start = (__asan_global*)start;
+ __asan_global *globals_stop = (__asan_global*)stop;
+ __asan_register_globals(globals_start, globals_stop - globals_start);
+ *flag = 1;
+}
+
+void __asan_unregister_elf_globals(uptr *flag, void *start, void *stop) {
+ if (!*flag) return;
+ if (!start) return;
+ CHECK_EQ(0, ((uptr)stop - (uptr)start) % sizeof(__asan_global));
+ __asan_global *globals_start = (__asan_global*)start;
+ __asan_global *globals_stop = (__asan_global*)stop;
+ __asan_unregister_globals(globals_start, globals_stop - globals_start);
+ *flag = 0;
+}
+
// Register an array of globals.
void __asan_register_globals(__asan_global *globals, uptr n) {
if (!flags()->report_globals) return;
Modified: compiler-rt/trunk/lib/asan/asan_interface.inc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/asan_interface.inc?rev=298159&r1=298158&r2=298159&view=diff
==============================================================================
--- compiler-rt/trunk/lib/asan/asan_interface.inc (original)
+++ compiler-rt/trunk/lib/asan/asan_interface.inc Fri Mar 17 17:17:38 2017
@@ -64,6 +64,7 @@ INTERFACE_FUNCTION(__asan_poison_stack_m
INTERFACE_FUNCTION(__asan_print_accumulated_stats)
INTERFACE_FUNCTION(__asan_region_is_poisoned)
INTERFACE_FUNCTION(__asan_register_globals)
+INTERFACE_FUNCTION(__asan_register_elf_globals)
INTERFACE_FUNCTION(__asan_register_image_globals)
INTERFACE_FUNCTION(__asan_report_error)
INTERFACE_FUNCTION(__asan_report_exp_load1)
@@ -149,6 +150,7 @@ INTERFACE_FUNCTION(__asan_unpoison_intra
INTERFACE_FUNCTION(__asan_unpoison_memory_region)
INTERFACE_FUNCTION(__asan_unpoison_stack_memory)
INTERFACE_FUNCTION(__asan_unregister_globals)
+INTERFACE_FUNCTION(__asan_unregister_elf_globals)
INTERFACE_FUNCTION(__asan_unregister_image_globals)
INTERFACE_FUNCTION(__asan_version_mismatch_check_v8)
INTERFACE_FUNCTION(__sanitizer_finish_switch_fiber)
Modified: compiler-rt/trunk/lib/asan/asan_interface_internal.h
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/asan_interface_internal.h?rev=298159&r1=298158&r2=298159&view=diff
==============================================================================
--- compiler-rt/trunk/lib/asan/asan_interface_internal.h (original)
+++ compiler-rt/trunk/lib/asan/asan_interface_internal.h Fri Mar 17 17:17:38 2017
@@ -67,6 +67,11 @@ extern "C" {
SANITIZER_INTERFACE_ATTRIBUTE
void __asan_unregister_image_globals(uptr *flag);
+ SANITIZER_INTERFACE_ATTRIBUTE
+ void __asan_register_elf_globals(uptr *flag, void *start, void *stop);
+ SANITIZER_INTERFACE_ATTRIBUTE
+ void __asan_unregister_elf_globals(uptr *flag, void *start, void *stop);
+
// These two functions should be called by the instrumented code.
// 'globals' is an array of structures describing 'n' globals.
SANITIZER_INTERFACE_ATTRIBUTE
Modified: compiler-rt/trunk/test/asan/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/asan/CMakeLists.txt?rev=298159&r1=298158&r2=298159&view=diff
==============================================================================
--- compiler-rt/trunk/test/asan/CMakeLists.txt (original)
+++ compiler-rt/trunk/test/asan/CMakeLists.txt Fri Mar 17 17:17:38 2017
@@ -16,7 +16,7 @@ endmacro()
set(ASAN_TEST_DEPS ${SANITIZER_COMMON_LIT_TEST_DEPS})
if(NOT COMPILER_RT_STANDALONE_BUILD)
list(APPEND ASAN_TEST_DEPS asan)
- if(WIN32 AND COMPILER_RT_HAS_LLD_SOURCES)
+ if(NOT APPLE AND COMPILER_RT_HAS_LLD_SOURCES)
list(APPEND ASAN_TEST_DEPS
lld
)
Added: compiler-rt/trunk/test/asan/TestCases/Linux/global-overflow-bfd.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/asan/TestCases/Linux/global-overflow-bfd.cc?rev=298159&view=auto
==============================================================================
--- compiler-rt/trunk/test/asan/TestCases/Linux/global-overflow-bfd.cc (added)
+++ compiler-rt/trunk/test/asan/TestCases/Linux/global-overflow-bfd.cc Fri Mar 17 17:17:38 2017
@@ -0,0 +1,18 @@
+// Test that gc-sections-friendly instrumentation of globals does not introduce
+// false negatives with the BFD linker.
+// RUN: %clangxx_asan -fuse-ld=bfd -Wl,-gc-sections -ffunction-sections -fdata-sections -O0 %s -o %t && not %run %t 2>&1 | FileCheck %s
+
+#include <string.h>
+int main(int argc, char **argv) {
+ static char XXX[10];
+ static char YYY[10];
+ static char ZZZ[10];
+ memset(XXX, 0, 10);
+ memset(YYY, 0, 10);
+ memset(ZZZ, 0, 10);
+ int res = YYY[argc * 10]; // BOOOM
+ // CHECK: {{READ of size 1 at}}
+ // CHECK: {{located 0 bytes to the right of global variable}}
+ res += XXX[argc] + ZZZ[argc];
+ return res;
+}
Added: compiler-rt/trunk/test/asan/TestCases/Linux/global-overflow-lld.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/asan/TestCases/Linux/global-overflow-lld.cc?rev=298159&view=auto
==============================================================================
--- compiler-rt/trunk/test/asan/TestCases/Linux/global-overflow-lld.cc (added)
+++ compiler-rt/trunk/test/asan/TestCases/Linux/global-overflow-lld.cc Fri Mar 17 17:17:38 2017
@@ -0,0 +1,19 @@
+// Test that gc-sections-friendly instrumentation of globals does not introduce
+// false negatives with the LLD linker.
+// RUN: %clangxx_asan -fuse-ld=lld -Wl,-gc-sections -ffunction-sections -fdata-sections -O0 %s -o %t && not %run %t 2>&1 | FileCheck %s
+// REQUIRES: lld
+
+#include <string.h>
+int main(int argc, char **argv) {
+ static char XXX[10];
+ static char YYY[10];
+ static char ZZZ[10];
+ memset(XXX, 0, 10);
+ memset(YYY, 0, 10);
+ memset(ZZZ, 0, 10);
+ int res = YYY[argc * 10]; // BOOOM
+ // CHECK: {{READ of size 1 at}}
+ // CHECK: {{located 0 bytes to the right of global variable}}
+ res += XXX[argc] + ZZZ[argc];
+ return res;
+}
Added: compiler-rt/trunk/test/asan/TestCases/Linux/globals-gc-sections-lld.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/asan/TestCases/Linux/globals-gc-sections-lld.cc?rev=298159&view=auto
==============================================================================
--- compiler-rt/trunk/test/asan/TestCases/Linux/globals-gc-sections-lld.cc (added)
+++ compiler-rt/trunk/test/asan/TestCases/Linux/globals-gc-sections-lld.cc Fri Mar 17 17:17:38 2017
@@ -0,0 +1,15 @@
+// RUN: %clangxx_asan %s -o %t -Wl,--gc-sections -fuse-ld=lld -ffunction-sections -fdata-sections -mllvm -asan-globals=0
+// RUN: %clangxx_asan %s -o %t -Wl,--gc-sections -fuse-ld=lld -ffunction-sections -fdata-sections -mllvm -asan-globals=1
+
+// https://code.google.com/p/address-sanitizer/issues/detail?id=260
+// REQUIRES: lld
+
+int undefined();
+
+// On i386 clang adds --export-dynamic when linking with ASan, which adds all
+// non-hidden globals to GC roots.
+__attribute__((visibility("hidden"))) int (*unused)() = undefined;
+
+int main() {
+ return 0;
+}
Modified: compiler-rt/trunk/test/asan/TestCases/Linux/globals-gc-sections.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/asan/TestCases/Linux/globals-gc-sections.cc?rev=298159&r1=298158&r2=298159&view=diff
==============================================================================
--- compiler-rt/trunk/test/asan/TestCases/Linux/globals-gc-sections.cc (original)
+++ compiler-rt/trunk/test/asan/TestCases/Linux/globals-gc-sections.cc Fri Mar 17 17:17:38 2017
@@ -1,12 +1,18 @@
-// RUN: %clangxx_asan %s -o %t -Wl,--gc-sections -ffunction-sections -mllvm -asan-globals=0
-// RUN: %clangxx_asan %s -o %t -Wl,--gc-sections -ffunction-sections -mllvm -asan-globals=1
+// RUN: %clangxx_asan %s -o %t -Wl,--gc-sections -fuse-ld=bfd -ffunction-sections -fdata-sections -mllvm -asan-globals=0
+// RUN: %clangxx_asan %s -o %t -Wl,--gc-sections -fuse-ld=bfd -ffunction-sections -fdata-sections -mllvm -asan-globals=1
// https://code.google.com/p/address-sanitizer/issues/detail?id=260
-// XFAIL: *
int undefined();
-int (*unused)() = undefined;
+// bug in ld.bfd: with multiple "asan_globals" sections, __start_asan_globals is
+// treated as a strong GC reference to the first such section. As a result, the
+// first (for some definition of the word) global is never gc-ed.
+int first_unused = 42;
+
+// On i386 clang adds --export-dynamic when linking with ASan, which adds all
+// non-hidden globals to GC roots.
+__attribute__((visibility("hidden"))) int (*unused)() = undefined;
int main() {
return 0;
More information about the llvm-commits
mailing list