Hi! Upstream has accepted my fix, so I've cherry-picked it to trunk and added another testcase, bootstrapped/regtested on x86_64-linux and i686-linux, committed to trunk.
2016-09-05 Jakub Jelinek <ja...@redhat.com> PR sanitizer/77396 * asan/asan_globals.cc: Cherry-pick upstream r280657. * g++.dg/asan/pr77396-2.C: New test. --- libsanitizer/asan/asan_globals.cc.jj +++ libsanitizer/asan/asan_globals.cc @@ -368,10 +368,10 @@ void __asan_unregister_globals(__asan_gl // initializer can only touch global variables in the same TU. void __asan_before_dynamic_init(const char *module_name) { if (!flags()->check_initialization_order || - !CanPoisonMemory()) + !CanPoisonMemory() || + !dynamic_init_globals) return; bool strict_init_order = flags()->strict_init_order; - CHECK(dynamic_init_globals); CHECK(module_name); CHECK(asan_inited); BlockingMutexLock lock(&mu_for_globals); @@ -394,7 +394,8 @@ void __asan_before_dynamic_init(const ch // TU are poisoned. It simply unpoisons all dynamically initialized globals. void __asan_after_dynamic_init() { if (!flags()->check_initialization_order || - !CanPoisonMemory()) + !CanPoisonMemory() || + !dynamic_init_globals) return; CHECK(asan_inited); BlockingMutexLock lock(&mu_for_globals); --- gcc/testsuite/g++.dg/asan/pr77396-2.C.jj 2016-09-05 14:55:06.569653141 +0200 +++ gcc/testsuite/g++.dg/asan/pr77396-2.C 2016-09-05 14:52:44.000000000 +0200 @@ -0,0 +1,12 @@ +// PR sanitizer/77396 +// { dg-do run } +// { dg-set-target-env-var ASAN_OPTIONS "check_initialization_order=true" } + +struct S { S () { asm volatile ("" : : : "memory"); } }; +static S c; + +int +main () +{ + return 0; +} Jakub