AVR/ld: Propagate link-relax elf header flag correctly.
authorAndrew Burgess <andrew.burgess@embecosm.com>
Sat, 22 Nov 2014 23:25:17 +0000 (23:25 +0000)
committerAndrew Burgess <andrew.burgess@embecosm.com>
Tue, 23 Dec 2014 15:45:11 +0000 (15:45 +0000)
commit9d7b48dc6e8415e95f5228a6f66b414827eb0204
treef39ae3d084904c79247eb69c55285809da8aad51
parenteac7440d805bec68f583db395aa42c38615daf14
AVR/ld: Propagate link-relax elf header flag correctly.

The AVR target has an elf header flag to indicate if an object was
assembler ready for linker relaxation.  If a partial link is performed
then it is important that the link-relax flag in the output object is
set correctly, otherwise, during the final link, we might try to perform
linker relaxation on code that was not assembled suitably.

As the link-relax elf header covers the entire object file we must be
conservative when setting the flag in the output object, so, for a
partial link, any input object that does not have the link-relax flag
set will cause the output object to also not have the link-relax flag
set.

This conservative approach could be softened in future, we only need to
disable the link relax flag if an input file is not marked link-relax
ready, and the input file contains a relaxable section.  However, I've
left this optimisation for a later day.

For the final link I've overloaded the use of the link-relax elf header
flag, in a final executable, the flag now indicates if the executable
was built with linker relaxation on or not.

ld/ChangeLog:

* emultempl/avrelf.em: Add include of elf/avr.h.
(avr_finish): New function.
(LDEMUL_FINISH): Added.

ld/testsuite/ChangeLog:

* ld-avr/relax-elf-flags-01.d: New file.
* ld-avr/relax-elf-flags-02.d: New file.
* ld-avr/relax-elf-flags-03.d: New file.
* ld-avr/relax-elf-flags-04.d: New file.
* ld-avr/relax-elf-flags-05.d: New file.
* ld-avr/relax-elf-flags-06.d: New file.
* ld-avr/relax-elf-flags-07.d: New file.
* ld-avr/relax-elf-flags-08.d: New file.
* ld-avr/relax-elf-flags-a.s: New file.
* ld-avr/relax-elf-flags-b.s: New file.
13 files changed:
ld/ChangeLog
ld/emultempl/avrelf.em
ld/testsuite/ChangeLog
ld/testsuite/ld-avr/relax-elf-flags-01.d [new file with mode: 0644]
ld/testsuite/ld-avr/relax-elf-flags-02.d [new file with mode: 0644]
ld/testsuite/ld-avr/relax-elf-flags-03.d [new file with mode: 0644]
ld/testsuite/ld-avr/relax-elf-flags-04.d [new file with mode: 0644]
ld/testsuite/ld-avr/relax-elf-flags-05.d [new file with mode: 0644]
ld/testsuite/ld-avr/relax-elf-flags-06.d [new file with mode: 0644]
ld/testsuite/ld-avr/relax-elf-flags-07.d [new file with mode: 0644]
ld/testsuite/ld-avr/relax-elf-flags-08.d [new file with mode: 0644]
ld/testsuite/ld-avr/relax-elf-flags-a.s [new file with mode: 0644]
ld/testsuite/ld-avr/relax-elf-flags-b.s [new file with mode: 0644]