toplev.c emits __gnu_lto markers to assembler: /* Emit LTO marker if LTO info has been previously emitted. This is used by collect2 to determine whether an object file contains IL. We used to emit an undefined reference here, but this produces link errors if an object file with IL is stored into a shared library without invoking lto1. */ if (flag_generate_lto) { #if defined ASM_OUTPUT_ALIGNED_DECL_COMMON ASM_OUTPUT_ALIGNED_DECL_COMMON (asm_out_file, NULL_TREE, "__gnu_lto_v1", (unsigned HOST_WIDE_INT) 1, 8); #elif defined ASM_OUTPUT_ALIGNED_COMMON ASM_OUTPUT_ALIGNED_COMMON (asm_out_file, "__gnu_lto_v1", (unsigned HOST_WIDE_INT) 1, 8); #else ASM_OUTPUT_COMMON (asm_out_file, "__gnu_lto_v1", (unsigned HOST_WIDE_INT) 1, (unsigned HOST_WIDE_INT) 1); #endif
... Am I right that this is just used as marker for linker/lto1 to detect presence and style of IL representation? Background is as follows: A trivial program, compiled for avr and without LTO, at the and of assembler output there is .ident "GCC: (GNU) 4.7.0 20120220 (experimental)" whereas with the LTO there is: .comm __gnu_lto_v1,1,1 .ident "GCC: (GNU) 4.7.0 20120220 (experimental)" .global __do_clear_bss avr only supports static linking. The avr backend thinks that the symbol occupies space on the silicon and needs to be allocated and initialized so that a part of the startup code is dragged in which is not needed. Is it always save to ignore __gnu_lto_* symbols when deciding which parts of startup code are needed? Thanks, Johann