From bf6e7848a0e26fa855ce8330dfda04dd4aca83bd Mon Sep 17 00:00:00 2001 From: Kuba Brecka Date: Mon, 31 Oct 2016 18:52:32 +0000 Subject: [PATCH] [asan] Move instrumented null-terminated strings to a special section, compiler-rt part On Darwin, simple C null-terminated constant strings normally end up in the __TEXT,__cstring section of the resulting Mach-O binary. When instrumented with ASan, these strings are transformed in a way that they cannot be in __cstring (the linker unifies the content of this section and strips extra NUL bytes, which would break instrumentation), and are put into a generic __const section. This breaks some of the tools that we have: Some tools need to scan all C null-terminated strings in Mach-O binaries, and scanning all the contents of __const has a large performance penalty. This patch instead introduces a special section, __asan_cstring which will now hold the instrumented null-terminated strings. Differential Revision: https://reviews.llvm.org/D25026 llvm-svn: 285620 --- .../asan/TestCases/Darwin/cstring_section.c | 17 +++++++++++++++++ .../test/asan/TestCases/Darwin/odr-lto.cc | 8 ++++++-- 2 files changed, 23 insertions(+), 2 deletions(-) create mode 100644 compiler-rt/test/asan/TestCases/Darwin/cstring_section.c diff --git a/compiler-rt/test/asan/TestCases/Darwin/cstring_section.c b/compiler-rt/test/asan/TestCases/Darwin/cstring_section.c new file mode 100644 index 000000000000..952d6fcdd465 --- /dev/null +++ b/compiler-rt/test/asan/TestCases/Darwin/cstring_section.c @@ -0,0 +1,17 @@ +// Test that AddressSanitizer moves constant strings into a separate section. + +// RUN: %clang_asan -c -o %t %s +// RUN: llvm-objdump -s %t | FileCheck %s + +// Check that "Hello.\n" is in __asan_cstring and not in __cstring. +// CHECK: Contents of section __asan_cstring: +// CHECK: 48656c6c {{.*}} Hello. +// CHECK: Contents of section __const: +// CHECK-NOT: 48656c6c {{.*}} Hello. +// CHECK: Contents of section __cstring: +// CHECK-NOT: 48656c6c {{.*}} Hello. + +int main(int argc, char *argv[]) { + argv[0] = "Hello.\n"; + return 0; +} diff --git a/compiler-rt/test/asan/TestCases/Darwin/odr-lto.cc b/compiler-rt/test/asan/TestCases/Darwin/odr-lto.cc index 23f1e05c3e1e..40abec5827d5 100644 --- a/compiler-rt/test/asan/TestCases/Darwin/odr-lto.cc +++ b/compiler-rt/test/asan/TestCases/Darwin/odr-lto.cc @@ -19,9 +19,11 @@ void putstest(); #if PART == 1 +static const char *my_global = "test\n\00abc"; + int main() { - fputs("test\n", stderr); + fputs(my_global, stderr); putstest(); fprintf(stderr, "Done.\n"); return 0; @@ -29,9 +31,11 @@ int main() #else // PART == 1 +static const char *my_other_global = "test\n\00abc"; + void putstest() { - fputs("test\n", stderr); + fputs(my_other_global, stderr); } #endif // PART == 1