diff options
Diffstat (limited to 'ld/emultempl')
-rw-r--r-- | ld/emultempl/avrelf.em | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/ld/emultempl/avrelf.em b/ld/emultempl/avrelf.em index 170dc3e..f4e2654 100644 --- a/ld/emultempl/avrelf.em +++ b/ld/emultempl/avrelf.em @@ -28,6 +28,7 @@ fragment <<EOF #include "elf32-avr.h" #include "ldctor.h" +#include "elf/avr.h" /* The fake file and it's corresponding section meant to hold the linker stubs if needed. */ @@ -175,6 +176,41 @@ avr_elf_before_parse (void) gld${EMULATION_NAME}_before_parse (); } +static void +avr_finish (void) +{ + bfd *abfd; + bfd_boolean avr_link_relax; + + if (link_info.relocatable) + { + avr_link_relax = TRUE; + for (abfd = link_info.input_bfds; abfd != NULL; abfd = abfd->link.next) + { + /* Don't let the linker stubs prevent the final object being + marked as link-relax ready. */ + if ((elf_elfheader (abfd)->e_flags + & EF_AVR_LINKRELAX_PREPARED) == 0 + && abfd != stub_file->the_bfd) + { + avr_link_relax = FALSE; + break; + } + } + } + else + { + avr_link_relax = RELAXATION_ENABLED; + } + + abfd = link_info.output_bfd; + if (avr_link_relax) + elf_elfheader (abfd)->e_flags |= EF_AVR_LINKRELAX_PREPARED; + else + elf_elfheader (abfd)->e_flags &= ~EF_AVR_LINKRELAX_PREPARED; + + finish_default (); +} EOF @@ -274,3 +310,4 @@ LDEMUL_BEFORE_PARSE=avr_elf_before_parse LDEMUL_BEFORE_ALLOCATION=avr_elf_${EMULATION_NAME}_before_allocation LDEMUL_AFTER_ALLOCATION=avr_elf_after_allocation LDEMUL_CREATE_OUTPUT_SECTION_STATEMENTS=avr_elf_create_output_section_statements +LDEMUL_FINISH=avr_finish |