X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=ld%2Femultempl%2Fm68kelf.em;h=e909f755da73937515a6d4a5bf3c5b8f3111b76c;hb=307f2595ddeebff38f95045b25be937e6b72eff2;hp=cb64d850d4b7fcf96689207bb7f2cd3a7c45976a;hpb=f96b4a7b0f17a2bf74a83908c6245053310560fd;p=binutils-gdb.git diff --git a/ld/emultempl/m68kelf.em b/ld/emultempl/m68kelf.em index cb64d850d4b..e909f755da7 100644 --- a/ld/emultempl/m68kelf.em +++ b/ld/emultempl/m68kelf.em @@ -1,5 +1,5 @@ # This shell script emits a C file. -*- C -*- -# Copyright 2000, 2001, 2003, 2007 Free Software Foundation, Inc. +# Copyright (C) 2000-2020 Free Software Foundation, Inc. # Written by Michael Sokolov , based on armelf.em # # This file is part of the GNU Binutils. @@ -20,9 +20,9 @@ # MA 02110-1301, USA. -# This file is sourced from elf32.em, and defines some extra routines for m68k +# This file is sourced from elf.em, and defines some extra routines for m68k # embedded systems using ELF and for some other systems using m68k ELF. While -# it is sourced from elf32.em for all m68k ELF configurations, here we include +# it is sourced from elf.em for all m68k ELF configurations, here we include # only the features we want depending on the configuration. case ${target} in @@ -31,7 +31,29 @@ case ${target} in ;; esac -cat >>e${EMULATION_NAME}.c <link_next) + for (abfd = link_info.input_bfds; abfd != NULL; abfd = abfd->link.next) { asection *datasec; - /* As first-order business, make sure that each input BFD is either - COFF or ELF. We need to call a special BFD backend function to - generate the embedded relocs, and we have such functions only for - COFF and ELF. */ - if (bfd_get_flavour (abfd) != bfd_target_coff_flavour - && bfd_get_flavour (abfd) != bfd_target_elf_flavour) - einfo ("%F%B: all input objects must be COFF or ELF for --embedded-relocs\n"); + if (bfd_get_flavour (abfd) != bfd_target_elf_flavour) + einfo (_("%F%P: %pB: all input objects must be ELF " + "for --embedded-relocs\n")); datasec = bfd_get_section_by_name (abfd, ".data"); @@ -80,17 +98,15 @@ m68k_elf_after_open (void) { asection *relsec; - relsec = bfd_make_section (abfd, ".emreloc"); + relsec = bfd_make_section_with_flags (abfd, ".emreloc", + (SEC_ALLOC + | SEC_LOAD + | SEC_HAS_CONTENTS + | SEC_IN_MEMORY)); if (relsec == NULL - || ! bfd_set_section_flags (abfd, relsec, - (SEC_ALLOC - | SEC_LOAD - | SEC_HAS_CONTENTS - | SEC_IN_MEMORY)) - || ! bfd_set_section_alignment (abfd, relsec, 2) - || ! bfd_set_section_size (abfd, relsec, - datasec->reloc_count * 12)) - einfo ("%F%B: can not create .emreloc section: %E\n"); + || !bfd_set_section_alignment (relsec, 2) + || !bfd_set_section_size (relsec, datasec->reloc_count * 12)) + einfo (_("%F%P: %pB: can not create .emreloc section: %E\n")); } /* Double check that all other data sections are empty, as is @@ -108,11 +124,11 @@ m68k_elf_after_open (void) static void check_sections (bfd *abfd, asection *sec, void *datasec) { - if ((bfd_get_section_flags (abfd, sec) & SEC_DATA) + if ((bfd_section_flags (sec) & SEC_DATA) && sec != datasec && sec->reloc_count != 0) - einfo ("%B%X: section %s has relocs; can not use --embedded-relocs\n", - abfd, bfd_get_section_name (abfd, sec)); + einfo (_("%X%P: %pB: section %s has relocs; can not use --embedded-relocs\n"), + abfd, bfd_section_name (sec)); } #endif /* SUPPORT_EMBEDDED_RELOCS */ @@ -124,17 +140,17 @@ static void m68k_elf_after_allocation (void) { /* Call the standard elf routine. */ - after_allocation_default (); + gld${EMULATION_NAME}_after_allocation (); #ifdef SUPPORT_EMBEDDED_RELOCS if (command_line.embedded_relocs - && (! link_info.relocatable)) + && (!bfd_link_relocatable (&link_info))) { bfd *abfd; /* If we are generating embedded relocs, call a special BFD backend routine to do the work. */ - for (abfd = link_info.input_bfds; abfd != NULL; abfd = abfd->link_next) + for (abfd = link_info.input_bfds; abfd != NULL; abfd = abfd->link.next) { asection *datasec, *relsec; char *errmsg; @@ -147,31 +163,19 @@ m68k_elf_after_allocation (void) relsec = bfd_get_section_by_name (abfd, ".emreloc"); ASSERT (relsec != NULL); - if (bfd_get_flavour (abfd) == bfd_target_coff_flavour) - { - if (! bfd_m68k_coff_create_embedded_relocs (abfd, &link_info, - datasec, relsec, - &errmsg)) - { - if (errmsg == NULL) - einfo ("%B%X: can not create runtime reloc information: %E\n", - abfd); - else - einfo ("%X%B: can not create runtime reloc information: %s\n", - abfd, errmsg); - } - } - else if (bfd_get_flavour (abfd) == bfd_target_elf_flavour) + if (bfd_get_flavour (abfd) == bfd_target_elf_flavour) { if (! bfd_m68k_elf32_create_embedded_relocs (abfd, &link_info, datasec, relsec, &errmsg)) { if (errmsg == NULL) - einfo ("%B%X: can not create runtime reloc information: %E\n", + einfo (_("%X%P: %pB: can not create " + "runtime reloc information: %E\n"), abfd); else - einfo ("%X%B: can not create runtime reloc information: %s\n", + einfo (_("%X%P: %pB: can not create " + "runtime reloc information: %s\n"), abfd, errmsg); } } @@ -182,9 +186,49 @@ m68k_elf_after_allocation (void) #endif /* SUPPORT_EMBEDDED_RELOCS */ } +/* This is a convenient point to tell BFD about target specific flags. + After the output has been created, but before inputs are read. */ + +static void +elf_m68k_create_output_section_statements (void) +{ + bfd_elf_m68k_set_target_options (&link_info, got_handling); +} + EOF +# Define some shell vars to insert bits of code into the standard elf +# parse_args and list_options functions. +# +PARSE_AND_LIST_PROLOGUE=' +#define OPTION_GOT 301 +' + +PARSE_AND_LIST_LONGOPTS=' + { "got", required_argument, NULL, OPTION_GOT}, +' + +PARSE_AND_LIST_OPTIONS=' + fprintf (file, _(" --got= Specify GOT handling scheme\n")); +' + +PARSE_AND_LIST_ARGS_CASES=' + case OPTION_GOT: + if (strcmp (optarg, "target") == 0) + got_handling = GOT_HANDLING_TARGET_DEFAULT; + else if (strcmp (optarg, "single") == 0) + got_handling = 0; + else if (strcmp (optarg, "negative") == 0) + got_handling = 1; + else if (strcmp (optarg, "multigot") == 0) + got_handling = 2; + else + einfo (_("%P: unrecognized --got argument '\''%s'\''\n"), optarg); + break; +' + # We have our own after_open and after_allocation functions, but they call # the standard routines, so give them a different name. LDEMUL_AFTER_OPEN=m68k_elf_after_open LDEMUL_AFTER_ALLOCATION=m68k_elf_after_allocation +LDEMUL_CREATE_OUTPUT_SECTION_STATEMENTS=elf_m68k_create_output_section_statements