http://gcc.gnu.org/bugzilla/show_bug.cgi?id=51255
Bug #: 51255 Summary: Using -flto breaks code which puts values in .ctors or .init_array Classification: Unclassified Product: gcc Version: 4.7.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: lto AssignedTo: unassig...@gcc.gnu.org ReportedBy: i...@airs.com A test case similar to this is used by the gcc configure script (HAVE_INITFINI_ARRAY in gcc/acinclude.m4): extern void abort (); static int count; static void init1005 () { if (count != 0) abort (); count = 1005; } void (*const init_array1005[]) () __attribute__ ((section (".init_array.01005"), aligned (sizeof (void *)))) = { init1005 }; static void fini1005 () { if (count != 1005) abort (); } void (*const fini_array1005[]) () __attribute__ ((section (".fini_array.01005"), aligned (sizeof (void *)))) = { fini1005 }; static void ctor1007 () { if (count != 1005) abort (); count = 1007; } void (*const ctors1007[]) () __attribute__ ((section (".ctors.64528"), aligned (sizeof (void *)))) = { ctor1007 }; static void dtor1007 () { if (count != 1007) abort (); count = 1005; } void (*const dtors1007[]) () __attribute__ ((section (".dtors.64528"), aligned (sizeof (void *)))) = { dtor1007 }; static void init65530 () { if (count != 1007) abort (); count = 65530; } void (*const init_array65530[]) () __attribute__ ((section (".init_array.65530"), aligned (sizeof (void *)))) = { init65530 }; static void fini65530 () { if (count != 65530) abort (); count = 1007; } void (*const fini_array65530[]) () __attribute__ ((section (".fini_array.65530"), aligned (sizeof (void *)))) = { fini65530 }; static void ctor65535 () { if (count != 65530) abort (); count = 65535; } void (*const ctors65535[]) () __attribute__ ((section (".ctors"), aligned (sizeof (void *)))) = { ctor65535 }; static void dtor65535 () { if (count != 65535) abort (); count = 65530; } void (*const dtors65535[]) () __attribute__ ((section (".dtors"), aligned (sizeof (void *)))) = { dtor65535 }; int main () { if (count != 65535) abort (); return 0; } When using a recent version of GNU ld or gold, this program is intended to compile and run correctly. However, if compiled with "-flto -O", it fails, even using a recent linker. It fails because the LTO pass does not realize that the functions in the .ctors and .init_array sections are going to be run before main.