By now I had a very close look at the compiler output:
/home/udo/Desktop/arduino-1.0.1/hardware/tools/avr/bin/avr-g++ -c -g -Os -Wall -fno-exceptions -ffunction-sections -fdata-sections -mmcu=atmega328p -DF_CPU=16000000L -MMD -DUSB_VID=null -DUSB_PID=null -DARDUINO=101 -I/home/udo/Desktop/arduino-1.0.1/hardware/arduino/cores/arduino -I/home/udo/Desktop/arduino-1.0.1/hardware/arduino/variants/eightanaloginputs -I/home/udo/Desktop/arduino-1.0.1/libraries/dcf77 /tmp/build8292172423459455253.tmp/MB_Emulator.cpp -o /tmp/build8292172423459455253.tmp/MB_Emulator.cpp.o
<snip>
/home/udo/Desktop/arduino-1.0.1/hardware/tools/avr/bin/avr-gcc -Os -Wl,--gc-sections -mmcu=atmega328p -o /tmp/build8292172423459455253.tmp/MB_Emulator.cpp.elf /tmp/build8292172423459455253.tmp/MB_Emulator.cpp.o /tmp/build8292172423459455253.tmp/dcf77/dcf77.cpp.o /tmp/build8292172423459455253.tmp/core.a -L/tmp/build8292172423459455253.tmp -lm
/home/udo/Desktop/arduino-1.0.1/hardware/tools/avr/bin/avr-objcopy -O ihex -j .eeprom --set-section-flags=.eeprom=alloc,load --no-change-warnings --change-section-lma .eeprom=0 /tmp/build8292172423459455253.tmp/MB_Emulator.cpp.elf /tmp/build8292172423459455253.tmp/MB_Emulator.cpp.eep
/home/udo/Desktop/arduino-1.0.1/hardware/tools/avr/bin/avr-objcopy -O ihex -R .eeprom /tmp/build8292172423459455253.tmp/MB_Emulator.cpp.elf /tmp/build8292172423459455253.tmp/MB_Emulator.cpp.hex
Binary sketch size: 19,400 bytes (of a 30,720 byte maximum)
avr-g++ -c -g -Os -Wall -fno-exceptions -ffunction-sections -fdata-sections -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=100 -I/usr/share/arduino/hardware/arduino/cores/arduino -I/usr/share/arduino/hardware/arduino/variants/eightanaloginputs -I/usr/share/arduino/libraries/dcf77 /tmp/build8021356485289965020.tmp/MB_Emulator.cpp -o/tmp/build8021356485289965020.tmp/MB_Emulator.cpp.o
<snip>
avr-gcc -Os -Wl,--gc-sections -mmcu=atmega328p -o /tmp/build8021356485289965020.tmp/MB_Emulator.cpp.elf /tmp/build8021356485289965020.tmp/MB_Emulator.cpp.o /tmp/build8021356485289965020.tmp/dcf77/dcf77.cpp.o /tmp/build8021356485289965020.tmp/core.a -L/tmp/build8021356485289965020.tmp -lm
avr-objcopy -O ihex -j .eeprom --set-section-flags=.eeprom=alloc,load --no-change-warnings --change-section-lma .eeprom=0 /tmp/build8021356485289965020.tmp/MB_Emulator.cpp.elf /tmp/build8021356485289965020.tmp/MB_Emulator.cpp.eep
avr-objcopy -O ihex -R .eeprom /tmp/build8021356485289965020.tmp/MB_Emulator.cpp.elf /tmp/build8021356485289965020.tmp/MB_Emulator.cpp.hex
Binary sketch size: 18078 bytes (of a 30720 byte maximum)
So the most obvious difference is the compiler. I checked the version of the compilers:
avr-gcc: /usr/bin/avr-gcc /usr/bin/X11/avr-gcc
~$ nautilus /usr/bin/avr-gcc
~$ /home/udo/Desktop/arduino-1.0.2/hardware/tools/avr/bin/avr-g++ --version
avr-g++ (GCC) 4.3.2
Copyright (C) 2008 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.
~$ /usr/bin/avr-g++ --version
avr-g++ (GCC) 4.5.3
Copyright (C) 2010 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.
So the newer versions of Arduino come with an older compiler. This explains a lot. Is there any reason why Arduino uses 4.3.2 instead of 4.5.3?