Emit a warning when -z relro is unsupported
[binutils-gdb.git] / ld / emultempl / armelf.em
index 35908236adb26a601666f3149edbbb22ed924348..34372ba7b0b64055097325f39cf1959de1e75cb3 100644 (file)
@@ -1,5 +1,5 @@
 # This shell script emits a C file. -*- C -*-
-#   Copyright (C) 1991-2018 Free Software Foundation, Inc.
+#   Copyright (C) 1991-2020 Free Software Foundation, Inc.
 #
 # This file is part of the GNU Binutils.
 #
@@ -19,7 +19,7 @@
 # MA 02110-1301, USA.
 #
 
-# This file is sourced from elf32.em, and defines extra arm-elf
+# This file is sourced from elf.em, and defines extra arm-elf
 # specific routines.
 #
 test -z "$TARGET2_TYPE" && TARGET2_TYPE="rel"
@@ -27,6 +27,7 @@ fragment <<EOF
 
 #include "ldctor.h"
 #include "elf/arm.h"
+#include "elf32-arm.h"
 
 static struct elf32_arm_params params =
 {
@@ -59,7 +60,13 @@ gld${EMULATION_NAME}_before_parse (void)
   config.has_shared = `if test -n "$GENERATE_SHLIB_SCRIPT" ; then echo TRUE ; else echo FALSE ; fi`;
   config.separate_code = `if test "x${SEPARATE_CODE}" = xyes ; then echo TRUE ; else echo FALSE ; fi`;
   link_info.check_relocs_after_open_input = TRUE;
+EOF
+if test -n "$COMMONPAGESIZE"; then
+fragment <<EOF
   link_info.relro = DEFAULT_LD_Z_RELRO;
+EOF
+fi
+fragment <<EOF
 }
 
 static void
@@ -111,7 +118,8 @@ arm_elf_before_allocation (void)
              || !bfd_elf32_arm_stm32l4xx_erratum_scan (is->the_bfd,
                                                        &link_info))
            /* xgettext:c-format */
-           einfo (_("Errors encountered processing file %s"), is->filename);
+           einfo (_("%P: errors encountered processing file %s\n"),
+                  is->filename);
        }
 
       /* We have seen it all.  Allocate it, and carry on.  */
@@ -225,13 +233,14 @@ elf32_arm_add_stub_section (const char * stub_sec_name,
   struct hook_stub_info info;
 
   flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_CODE
-          | SEC_HAS_CONTENTS | SEC_RELOC | SEC_IN_MEMORY | SEC_KEEP);
+          | SEC_HAS_CONTENTS | SEC_RELOC | SEC_IN_MEMORY | SEC_KEEP
+          | SEC_LINKER_CREATED);
   stub_sec = bfd_make_section_anyway_with_flags (stub_file->the_bfd,
                                                 stub_sec_name, flags);
   if (stub_sec == NULL)
     goto err_ret;
 
-  bfd_set_section_alignment (stub_file->the_bfd, stub_sec, alignment_power);
+  bfd_set_section_alignment (stub_sec, alignment_power);
 
   os = lang_output_section_get (output_section);
 
@@ -275,7 +284,7 @@ gldarm_layout_sections_again (void)
   /* If we have changed sizes of the stub sections, then we need
      to recalculate all the section offsets.  This may mean we need to
      add even more stubs.  */
-  gld${EMULATION_NAME}_map_segments (TRUE);
+  ldelf_map_segments (TRUE);
   need_laying_out = -1;
 }
 
@@ -405,14 +414,14 @@ gld${EMULATION_NAME}_after_allocation (void)
                                      & elf32_arm_add_stub_section,
                                      & gldarm_layout_sections_again))
            {
-             einfo (_("%X%P: cannot size stub section: %E\n"));
+             einfo (_("%X%P: can not size stub section: %E\n"));
              return;
            }
        }
     }
 
   if (need_laying_out != -1)
-    gld${EMULATION_NAME}_map_segments (need_laying_out);
+    ldelf_map_segments (need_laying_out);
 }
 
 static void
@@ -477,8 +486,7 @@ gld${EMULATION_NAME}_finish (void)
       /* Special procesing is required for a Thumb entry symbol.  The
         bottom bit of its address must be set.  */
       val = (h->u.def.value
-            + bfd_get_section_vma (link_info.output_bfd,
-                                   h->u.def.section->output_section)
+            + bfd_section_vma (h->u.def.section->output_section)
             + h->u.def.section->output_offset);
 
       val |= 1;
@@ -498,7 +506,7 @@ gld${EMULATION_NAME}_finish (void)
     }
   else
     einfo (_("%P: warning: cannot find thumb start symbol %s\n"),
-          params.thumb_entry_symbol);
+          h->root.string);
 }
 
 /* This is a convenient point to tell BFD about target specific flags.
@@ -512,8 +520,8 @@ arm_elf_create_output_section_statements (void)
         These will only be created if the output format is an arm format,
         hence we do not support linking and changing output formats at the
         same time.  Use a link followed by objcopy to change output formats.  */
-      einfo (_("%F%X%P: error: Cannot change output format "
-              "whilst linking ARM binaries.\n"));
+      einfo (_("%F%P: error: cannot change output format "
+              "whilst linking %s binaries\n"), "ARM");
       return;
     }
 
@@ -523,10 +531,10 @@ arm_elf_create_output_section_statements (void)
                                        bfd_get_target (link_info.output_bfd));
 
       if (params.in_implib_bfd == NULL)
-       einfo (_("%F%s: Can't open: %E\n"), in_implib_filename);
+       einfo (_("%F%P: %s: can't open: %E\n"), in_implib_filename);
 
       if (!bfd_check_format (params.in_implib_bfd, bfd_object))
-       einfo (_("%F%s: Not a relocatable file: %E\n"), in_implib_filename);
+       einfo (_("%F%P: %s: not a relocatable file: %E\n"), in_implib_filename);
     }
 
   bfd_elf32_arm_set_target_params (link_info.output_bfd, &link_info, &params);
@@ -540,7 +548,7 @@ arm_elf_create_output_section_statements (void)
                              bfd_get_arch (link_info.output_bfd),
                              bfd_get_mach (link_info.output_bfd)))
     {
-      einfo (_("%X%P: can not create BFD %E\n"));
+      einfo (_("%F%P: can not create BFD: %E\n"));
       return;
     }
 
@@ -552,26 +560,6 @@ arm_elf_create_output_section_statements (void)
   bfd_elf32_arm_get_bfd_for_interworking (stub_file->the_bfd, &link_info);
 }
 
-/* Avoid processing the fake stub_file in vercheck, stat_needed and
-   check_needed routines.  */
-
-static void (*real_func) (lang_input_statement_type *);
-
-static void arm_for_each_input_file_wrapper (lang_input_statement_type *l)
-{
-  if (l != stub_file)
-    (*real_func) (l);
-}
-
-static void
-arm_lang_for_each_input_file (void (*func) (lang_input_statement_type *))
-{
-  real_func = func;
-  lang_for_each_input_file (&arm_for_each_input_file_wrapper);
-}
-
-#define lang_for_each_input_file arm_lang_for_each_input_file
-
 EOF
 
 # Define some shell vars to insert bits of code into the standard elf
@@ -654,13 +642,13 @@ PARSE_AND_LIST_OPTIONS='
                    "                                remain stable\n"));
   fprintf (file, _("\
   --stub-group-size=N         Maximum size of a group of input sections that\n\
-                               can be handled by one stub section.  A negative\n\
-                               value locates all stubs after their branches\n\
-                               (with a group size of -N), while a positive\n\
-                               value allows two groups of input sections, one\n\
-                               before, and one after each stub section.\n\
-                               Values of +/-1 indicate the linker should\n\
-                               choose suitable defaults.\n"));
+                                can be handled by one stub section.  A negative\n\
+                                value locates all stubs after their branches\n\
+                                (with a group size of -N), while a positive\n\
+                                value allows two groups of input sections, one\n\
+                                before, and one after each stub section.\n\
+                                Values of +/-1 indicate the linker should\n\
+                                choose suitable defaults.\n"));
   fprintf (file, _("  --[no-]fix-cortex-a8        Disable/enable Cortex-A8 Thumb-2 branch erratum fix\n"));
   fprintf (file, _("  --no-merge-exidx-entries    Disable merging exidx entries\n"));
   fprintf (file, _("  --[no-]fix-arm1176          Disable/enable ARM1176 BLX immediate erratum fix\n"));
@@ -711,7 +699,7 @@ PARSE_AND_LIST_ARGS_CASES='
       else if (strcmp (optarg, "vector") == 0)
        params.vfp11_denorm_fix = BFD_ARM_VFP11_FIX_VECTOR;
       else
-       einfo (_("Unrecognized VFP11 fix type '\''%s'\''.\n"), optarg);
+       einfo (_("%P: unrecognized VFP11 fix type '\''%s'\''\n"), optarg);
       break;
 
     case OPTION_STM32L4XX_FIX:
@@ -724,7 +712,7 @@ PARSE_AND_LIST_ARGS_CASES='
       else if (strcmp (optarg, "all") == 0)
        params.stm32l4xx_fix = BFD_ARM_STM32L4XX_FIX_ALL;
       else
-       einfo (_("Unrecognized STM32L4XX fix type '\''%s'\''.\n"), optarg);
+       einfo (_("%P: unrecognized STM32L4XX fix type '\''%s'\''\n"), optarg);
       break;
 
     case OPTION_NO_ENUM_SIZE_WARNING:
@@ -745,7 +733,7 @@ PARSE_AND_LIST_ARGS_CASES='
 
        group_size = bfd_scan_vma (optarg, &end, 0);
        if (*end)
-         einfo (_("%P%F: invalid number `%s'\''\n"), optarg);
+         einfo (_("%F%P: invalid number `%s'\''\n"), optarg);
       }
       break;