[Bug other/58082] New: avr-gcc vector table relocation truncation error with -mrelax option

acmeexhibits at gmail dot com gcc-bugzilla@gcc.gnu.org
Mon Aug 5 00:21:00 GMT 2013


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58082

            Bug ID: 58082
           Summary: avr-gcc vector table relocation truncation error with
                    -mrelax option
           Product: gcc
           Version: unknown
            Status: UNCONFIRMED
          Severity: major
          Priority: P3
         Component: other
          Assignee: unassigned at gcc dot gnu.org
          Reporter: acmeexhibits at gmail dot com

Created attachment 30613
  --> http://gcc.gnu.org/bugzilla/attachment.cgi?id=30613&action=edit
pads the space between the vector table and text area to move the rjmp/jmp
transition.

When the attached code compiles properly, we get this vector table:

00000000 <__vectors>:
       0:       0c 94 08 08     jmp     0x1010  ; 0x1010 <__ctors_end>
       4:       0c 94 12 08     jmp     0x1024  ; 0x1024 <__bad_interrupt>
       8:       0c 94 12 08     jmp     0x1024  ; 0x1024 <__bad_interrupt>
       c:       0c 94 12 08     jmp     0x1024  ; 0x1024 <__bad_interrupt>
      10:       0c 94 12 08     jmp     0x1024  ; 0x1024 <__bad_interrupt>
      14:       0c 94 12 08     jmp     0x1024  ; 0x1024 <__bad_interrupt>
      18:       0c 94 12 08     jmp     0x1024  ; 0x1024 <__bad_interrupt>
      1c:       0c 94 12 08     jmp     0x1024  ; 0x1024 <__bad_interrupt>
      20:       0c 94 12 08     jmp     0x1024  ; 0x1024 <__bad_interrupt>
      24:       ff c7           rjmp    .+4094          ; 0x1024
<__bad_interrupt>
      26:       00 00           nop
      28:       fd c7           rjmp    .+4090          ; 0x1024
<__bad_interrupt>
      2a:       00 00           nop
      2c:       fb c7           rjmp    .+4086          ; 0x1024
<__bad_interrupt>
      2e:       00 00           nop

I believe the -mrelax option says to use rjmp (relative jumps) when possible,
which for the Atmel 2560 chip is +/- 4k.  We can see that the jumps for vectors
 0 to 8 are too far for a relative jump so the linker/compiler switches to jmp,
an absolute jump.

For reasons I don't understand, if the __bad_interrupt label is 2 bytes farther
away, the linker cannot figure out how to make vector 9 a jmp.  Instead it
generates the error message:

/usr/lib/gcc/avr/4.7.2/../../../avr/lib/avr6/crtm2560.o: In function
`__bad_interrupt':
../../../../crt1/gcrt1.S:195: relocation truncated to fit: R_AVR_13_PCREL
against symbol `__vector_9' defined in .text section in
/usr/lib/gcc/avr/4.7.2/../../../avr/lib/avr6/crtm2560.o

There are bands where the rjmp/jmp transition works and other bands where it
doesn't work.  Omitting the -mrelax flag does solve the problem as only jmp
instructions are generated.

Thankfully, source code that irritates the bug is trivial



More information about the Gcc-bugs mailing list