https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79042
Bug ID: 79042 Summary: LTO doesn't propagate node->dynamically_initialized bit for varpool nodes. Product: gcc Version: 7.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: lto Assignee: unassigned at gcc dot gnu.org Reporter: m.ostapenko at samsung dot com Target Milestone: --- Host: x86_64-pc-linux-gnu Target: x86_64-pc-linux-gnu Build: x86_64-pc-linux-gnu Created attachment 40490 --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=40490&action=edit Trivial fix Consider following testcase: $ cat test.cc class A { public: A () : x_(0) {}; private: int x_; }; static A a; int main () { return 0; } Running this with ASan and LTO gives us: $ ~/install/master/bin/g++ -fsanitize=address test.cc -static-libasan -flto $ ASAN_OPTIONS=report_globals=3 ./a.out #0 0x41d7b6 in __asan_register_globals /home/max/workspace/downloads/gcc/libsanitizer/asan/asan_globals.cc:326 #1 0x58a186 in _GLOBAL__sub_I_00099_1_main.4327 (/tmp/usr/apps/ise-default/mobile/bin/a.out+0x58a186) #2 0x58a1dc in __libc_csu_init (/tmp/usr/apps/ise-default/mobile/bin/a.out+0x58a1dc) #3 0x7f16b2316ed4 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x21ed4) #4 0x405e68 (/tmp/usr/apps/ise-default/mobile/bin/a.out+0x405e68) === ID 1098907649; 0x0000007c6f40 0x0000007c6f80 ==16281==Added Global[0x0000007c6f40]: beg=0x00000142bd60 size=4/64 name=a module=/tmp/ccQdsNjQ.ltrans0.o dyn_init=0 The dyn_init field should be equal to 1 (we have a global constructor), as we can confirm running the testcase without LTO: $ ~/install/master/bin/g++ -fsanitize=address test.cc -static-libasan $ ASAN_OPTIONS=report_globals=3 ./a.out #0 0x41d7b6 in __asan_register_globals /home/max/workspace/downloads/gcc/libsanitizer/asan/asan_globals.cc:326 #1 0x58a138 in _GLOBAL__sub_I_00099_1_main (/tmp/usr/apps/ise-default/mobile/bin/a.out+0x58a138) #2 0x58a1dc in __libc_csu_init (/tmp/usr/apps/ise-default/mobile/bin/a.out+0x58a1dc) #3 0x7f9cdad24ed4 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x21ed4) #4 0x405e68 (/tmp/usr/apps/ise-default/mobile/bin/a.out+0x405e68) === ID 385875969; 0x0000007c6f40 0x0000007c6f40 ==16302==Added Global[0x0000007c6f40]: beg=0x00000142bd20 size=4/64 name=a module=test.cc dyn_init=1 This happens because LTO doesn't propagate node->dynamically_initialized to LTRANS stage. The trivial fix (untested) is attached.