avr-gcc 4.9.2 doesn't seem to know that the address space wraps, so that an rjmp in the last 2KB of the address space can reach code in the first 2KB. The following code works fine with a jmp, but if I change the jmp ResetVector to rjmp, I get: (.bootloader+0x4): relocation truncated to fit: R_AVR_13_PCREL against `no symbol'
I'm compiling with: avr-gcc -mmcu=atmega328p -nostartfiles -Wl,-section-start=.bootloader=0x7E00 picobootSTK500.S -o picobootSTK500 .text ; this will be address 0x0000 which is the reset vector ; user application will over-write blink code ; dimly lights LED (using internal pullup) with a 1.5 s cycle time ResetVector: Blink: sbi PINB, LEDPIN ldi ZH, 60 DelayLoop: ; 11.8M cycles =~ .74s @ 16Mhz rcall Delay3Cycle ; 256 * 3 cycles sbiw ZL, 1 brne DelayLoop rjmp Blink ; delay 3 cycles * r24 + 4 cycles (ret instruction) Delay3Cycle: dec r24 brne Delay3Cycle ret .section .bootloader,"ax",@progbits ; use -WL,--section-start=.bootloader=0xXf00 Boot: in Temp, MCUSR sbrs Temp, EXTRF JmpReset: jmp ResetVector ; jump to application code