diff options
author | Nick Clifton <nickc@redhat.com> | 2017-08-03 11:59:32 +0100 |
---|---|---|
committer | Nick Clifton <nickc@redhat.com> | 2017-08-03 11:59:32 +0100 |
commit | fd9770d81fba7ad860e8bcfbc13c77f21041f1f3 (patch) | |
tree | 9986b3b1e364d8f2e12a363206afe13298768c10 /ld/emultempl | |
parent | 2e9246e077cdbbff0a56a810c5750cc895382ba3 (diff) | |
download | gdb-fd9770d81fba7ad860e8bcfbc13c77f21041f1f3.zip gdb-fd9770d81fba7ad860e8bcfbc13c77f21041f1f3.tar.gz gdb-fd9770d81fba7ad860e8bcfbc13c77f21041f1f3.tar.bz2 |
Add more targets to the list of architectures not supporting format changing during linking. Fix seg-faults triggered when this is attempted.
PR ld/21884
* testsuite/ld-elf/pr21884.d: Add AVR, HPPA, IA64, M68HC1x and
SCORE to list of targets not supporting file format changes during
linking.
* testsuite/ld-unique/pr21529.d: Likewise.
* emultempl/avrelf.em (_before_allocation): Skip for non-ELF
output formats.
(avr_elf_create_output_section_statements): Fail if the output
format is not ELF.
(avr_finish): Do not access the ELF header in non-ELF format
output bfds.
* emultempl/m68hc1xelf.em (_before_allocation): Skip for non-ELF
output formats.
(m68hc11elf_create_output_section_statements): Fail if the putput
format is not ELF.
(m68hc11elf_after_allocation): Skip for non-ELF output formats.
Diffstat (limited to 'ld/emultempl')
-rw-r--r-- | ld/emultempl/avrelf.em | 24 | ||||
-rw-r--r-- | ld/emultempl/m68hc1xelf.em | 38 |
2 files changed, 45 insertions, 17 deletions
diff --git a/ld/emultempl/avrelf.em b/ld/emultempl/avrelf.em index 2072124..acb478f 100644 --- a/ld/emultempl/avrelf.em +++ b/ld/emultempl/avrelf.em @@ -71,6 +71,12 @@ avr_elf_${EMULATION_NAME}_before_allocation (void) gld${EMULATION_NAME}_before_allocation (); + if (bfd_get_flavour (link_info.output_bfd) != bfd_target_elf_flavour) + { + avr_no_stubs = TRUE; + return; + } + /* We only need stubs for avr6, avrxmega6, and avrxmega7. */ if (strcmp ("${EMULATION_NAME}","avr6") && strcmp ("${EMULATION_NAME}","avrxmega6") @@ -108,6 +114,12 @@ avr_elf_create_output_section_statements (void) { flagword flags; + if (bfd_get_flavour (link_info.output_bfd) != bfd_target_elf_flavour) + { + einfo ("%X%P: changing output format whilst linking is not supported\n"); + return; + } + stub_file = lang_add_input_file ("linker stubs", lang_input_file_is_fake_enum, NULL); @@ -204,10 +216,14 @@ avr_finish (void) } 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; + + if (bfd_get_flavour (link_info.output_bfd) == bfd_target_elf_flavour) + { + 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 (); } diff --git a/ld/emultempl/m68hc1xelf.em b/ld/emultempl/m68hc1xelf.em index bfe88d6..f7337da 100644 --- a/ld/emultempl/m68hc1xelf.em +++ b/ld/emultempl/m68hc1xelf.em @@ -66,6 +66,9 @@ m68hc11_elf_${EMULATION_NAME}_before_allocation (void) gld${EMULATION_NAME}_before_allocation (); + if (bfd_get_flavour (link_info.output_bfd) != bfd_target_elf_flavour) + return; + /* If generating a relocatable output file, then we don't have to generate the trampolines. */ if (bfd_link_relocatable (&link_info)) @@ -141,6 +144,12 @@ m68hc11_elf_${EMULATION_NAME}_before_allocation (void) static void m68hc11elf_create_output_section_statements (void) { + if (bfd_get_flavour (link_info.output_bfd) != bfd_target_elf_flavour) + { + einfo ("%X%P: changing output format whilst linking is not supported\n"); + return; + } + stub_file = lang_add_input_file ("linker stubs", lang_input_file_is_fake_enum, NULL); @@ -286,22 +295,25 @@ m68hc11elf_add_stub_section (const char *stub_sec_name, static void m68hc11elf_after_allocation (void) { - /* Now build the linker stubs. */ - if (stub_file->the_bfd->sections != NULL) + if (bfd_get_flavour (link_info.output_bfd) == bfd_target_elf_flavour) { - /* Call again the trampoline analyzer to initialize the trampoline - stubs with the correct symbol addresses. Since there could have - been relaxation, the symbol addresses that were found during - first call may no longer be correct. */ - if (!elf32_m68hc11_size_stubs (link_info.output_bfd, - stub_file->the_bfd, - &link_info, 0)) + /* Now build the linker stubs. */ + if (stub_file->the_bfd->sections != NULL) { - einfo ("%X%P: can not size stub section: %E\n"); - return; + /* Call again the trampoline analyzer to initialize the trampoline + stubs with the correct symbol addresses. Since there could have + been relaxation, the symbol addresses that were found during + first call may no longer be correct. */ + if (!elf32_m68hc11_size_stubs (link_info.output_bfd, + stub_file->the_bfd, + &link_info, 0)) + { + einfo ("%X%P: can not size stub section: %E\n"); + return; + } + if (!elf32_m68hc11_build_stubs (link_info.output_bfd, &link_info)) + einfo ("%X%P: can not build stubs: %E\n"); } - if (!elf32_m68hc11_build_stubs (link_info.output_bfd, &link_info)) - einfo ("%X%P: can not build stubs: %E\n"); } gld${EMULATION_NAME}_after_allocation (); |