http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56533
Bug #: 56533 Summary: Linker problem on avr with lto and main function inside archive Classification: Unclassified Product: gcc Version: 4.7.2 Status: UNCONFIRMED Severity: normal Priority: P3 Component: target AssignedTo: unassig...@gcc.gnu.org ReportedBy: matth...@stdin.nl When trying to add lto to my Arduino program, it stopped compiling complaining about missing symbols. I've managed to reduce the problem to below minimal example. Note that removing anything from below example makes the problem disappear. In particular, the problem disappears when: * any of the linker options is removed: -mmcu=atmega328p -Os -flto -fwhole-program * the -flto compiler option is removed * using normal gcc (amd64) instead of avr-gcc * linking main.o instead of main.a * declaring realmain as externally_visible in realmain.c Note that in this example, the actual main() function is inside an archive, which is probably the reason for this bug / problem. $ avr-gcc --version avr-gcc (GCC) 4.7.2 Copyright (C) 2012 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. $ avr-ld --version GNU ld (GNU Binutils) 2.20.1.20100303 Copyright 2009 Free Software Foundation, Inc. This program is free software; you may redistribute it under the terms of the GNU General Public License version 3 or (at your option) a later version. This program has absolutely no warranty. $ cat main.c int realmain(void); int main(void) { return realmain(); } $ cat realmain.c int realmain(void) { } $ cat do #!/bin/sh set -x rm -f main.a /usr/bin/avr-gcc -c main.c -o main.o /usr/bin/avr-ar rcs main.a main.o /usr/bin/avr-gcc -c -flto realmain.c -o realmain.o /usr/bin/avr-gcc -mmcu=atmega328p -Os -flto -fwhole-program realmain.o main.a $ ./do + rm -f main.a + /usr/bin/avr-gcc -c main.c -o main.o + /usr/bin/avr-ar rcs main.a main.o + /usr/bin/avr-gcc -c -flto realmain.c -o realmain.o + /usr/bin/avr-gcc -mmcu=atmega328p -Os -flto -fwhole-program realmain.o main.a main.a(main.o): In function `main': main.c:(.text+0x8): undefined reference to `realmain' collect2: error: ld returned 1 exit status