ld: Add --warn-textrel and obsolete --warn-shared-textrel
authorH.J. Lu <hjl.tools@gmail.com>
Wed, 27 May 2020 11:53:54 +0000 (04:53 -0700)
committerH.J. Lu <hjl.tools@gmail.com>
Wed, 27 May 2020 11:54:10 +0000 (04:54 -0700)
--warn-shared-textrel and -z text apply to both shared object and PIE.
Add --warn-textrel and obsolete --warn-shared-textrel.  Consolidate
--warn-textrel and -z text/notext/textoff implementation.

bfd/

PR ld/22909
* elflink.c (bfd_elf_final_link): Use bfd_link_textrel_check.
Check bfd_link_dll when issue a DT_TEXTREL warning.
* elfxx-x86.c (maybe_set_textrel): Likewise.
(_bfd_x86_elf_size_dynamic_sections): Likewise.

include/

PR ld/22909
* bfdlink.h (textrel_check_method): New enum.
(bfd_link_textrel_check): New.
(bfd_link_info): Replace warn_shared_textrel and error_textrel
with textrel_check.

ld/

PR ld/22909
* NEWS: Mention --warn-textrel.
* ld.texi: Update -z text/notext/textoff.  Add --warn-textrel.
Remove --warn-shared-textrel.
* ldlex.h (option_values): Rename OPTION_WARN_SHARED_TEXTREL to
OPTION_WARN_TEXTREL.
* lexsup.c (ld_options): Add --warn-textrel.  Obsolete
--warn-shared-textrel.
(parse_args): Updated.
(elf_shlib_list_options): Check link_info.textrel_check.
* emultempl/elf.em: Updated.
* testsuite/ld-elf/pr19539.d: Replace -z notext with
--warn-textrel.  Expect a warning.
* testsuite/ld-i386/warn1.d: Update expected warning.

13 files changed:
bfd/ChangeLog
bfd/elflink.c
bfd/elfxx-x86.c
include/ChangeLog
include/bfdlink.h
ld/ChangeLog
ld/NEWS
ld/emultempl/elf.em
ld/ld.texi
ld/ldlex.h
ld/lexsup.c
ld/testsuite/ld-elf/pr19539.d
ld/testsuite/ld-i386/warn1.d

index f165b00515e3ff859eb0660f2740ff8904302453..0fe164458ed97ec9b68f78e01fc910d28ab2c01f 100644 (file)
@@ -1,3 +1,11 @@
+2020-05-27  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR ld/22909
+       * elflink.c (bfd_elf_final_link): Use bfd_link_textrel_check.
+       Check bfd_link_dll when issue a DT_TEXTREL warning.
+       * elfxx-x86.c (maybe_set_textrel): Likewise.
+       (_bfd_x86_elf_size_dynamic_sections): Likewise.
+
 2020-05-26  Nick Clifton  <nickc@redhat.com>
 
        * plugin.c (try_load_plugin): Extend error message when a plugin
index c157aea90dc527e3625a831c8d85ba505a2e34de..f87927f0bd8f7b71d41ff23c517d49d8895728ad 100644 (file)
@@ -12896,8 +12896,7 @@ bfd_elf_final_link (bfd *abfd, struct bfd_link_info *info)
        goto error_return;
 
       /* Check for DT_TEXTREL (late, in case the backend removes it).  */
-      if (((info->warn_shared_textrel && bfd_link_pic (info))
-          || info->error_textrel)
+      if (bfd_link_textrel_check (info)
          && (o = bfd_get_linker_section (dynobj, ".dynamic")) != NULL)
        {
          bfd_byte *dyncon, *dynconend;
@@ -12912,12 +12911,15 @@ bfd_elf_final_link (bfd *abfd, struct bfd_link_info *info)
 
              if (dyn.d_tag == DT_TEXTREL)
                {
-                 if (info->error_textrel)
+                 if (info->textrel_check == textrel_check_error)
                    info->callbacks->einfo
                      (_("%P%X: read-only segment has dynamic relocations\n"));
+                 else if (bfd_link_dll (info))
+                   info->callbacks->einfo
+                     (_("%P: warning: creating DT_TEXTREL in a shared object\n"));
                  else
                    info->callbacks->einfo
-                     (_("%P: warning: creating a DT_TEXTREL in a shared object\n"));
+                     (_("%P: warning: creating DT_TEXTREL in a PIE\n"));
                  break;
                }
            }
index 9679dca981e77923e7ad2c0bccd5bdb827cba6e5..6cc47afd7eadc1b6f5b42a33cf84dbd6183effda 100644 (file)
@@ -575,8 +575,7 @@ maybe_set_textrel (struct elf_link_hash_entry *h, void *inf)
                                "in read-only section `%pA'\n"),
                              sec->owner, h->root.root.string, sec);
 
-      if ((info->warn_shared_textrel && bfd_link_pic (info))
-         || info->error_textrel)
+      if (bfd_link_textrel_check (info))
        /* xgettext:c-format */
        info->callbacks->einfo (_("%P: %pB: warning: relocation against `%s' "
                                  "in read-only section `%pA'\n"),
@@ -1117,8 +1116,7 @@ _bfd_x86_elf_size_dynamic_sections (bfd *output_bfd,
                      && (info->flags & DF_TEXTREL) == 0)
                    {
                      info->flags |= DF_TEXTREL;
-                     if ((info->warn_shared_textrel && bfd_link_pic (info))
-                         || info->error_textrel)
+                     if (bfd_link_textrel_check (info))
                        /* xgettext:c-format */
                        info->callbacks->einfo
                          (_("%P: %pB: warning: relocation "
index 53f50e513f4459f6d73f12a4c8bee05c7251ad75..7d114012b13310e2ecc15892eb1303fd3dda4bf2 100644 (file)
@@ -1,3 +1,11 @@
+2020-05-27  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR ld/22909
+       * bfdlink.h (textrel_check_method): New enum.
+       (bfd_link_textrel_check): New.
+       (bfd_link_info): Replace warn_shared_textrel and error_textrel
+       with textrel_check.
+
 2020-05-25  H.J. Lu  <hongjiu.lu@intel.com>
 
        * elf/common.h: Update comments for ET_EXEC and ET_DYN.
index ec97679e6f1de2a15202f33b3e153d02813b79ea..34a0d2ec4efaec3334af336e729be2d1cb1a6e93 100644 (file)
@@ -273,6 +273,18 @@ enum report_method
   RM_DIAGNOSE,
 };
 
+/* How to handle DT_TEXTREL.  */
+
+enum textrel_check_method
+{
+  textrel_check_none,
+  textrel_check_warning,
+  textrel_check_error
+};
+
+#define bfd_link_textrel_check(info) \
+  (info->textrel_check != textrel_check_none)
+
 typedef enum {with_flags, without_flags} flag_type;
 
 /* A section flag list.  */
@@ -410,11 +422,8 @@ struct bfd_link_info
      should be created.  1 for DWARF2 tables, 2 for compact tables.  */
   unsigned int eh_frame_hdr_type: 2;
 
-  /* TRUE if we should warn when adding a DT_TEXTREL to a shared object.  */
-  unsigned int warn_shared_textrel: 1;
-
-  /* TRUE if we should error when adding a DT_TEXTREL.  */
-  unsigned int error_textrel: 1;
+  /* What to do with DT_TEXTREL in output.  */
+  ENUM_BITFIELD (textrel_check_method) textrel_check: 2;
 
   /* TRUE if .hash section should be created.  */
   unsigned int emit_hash: 1;
index f0d6c269d570215ad0ad3a84872e1e2ad9daab7e..3fd9b7457ee87d3fbb1c923e8576fe5e27db2f64 100644 (file)
@@ -1,3 +1,20 @@
+2020-05-27  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR ld/22909
+       * NEWS: Mention --warn-textrel.
+       * ld.texi: Update -z text/notext/textoff.  Add --warn-textrel.
+       Remove --warn-shared-textrel.
+       * ldlex.h (option_values): Rename OPTION_WARN_SHARED_TEXTREL to
+       OPTION_WARN_TEXTREL.
+       * lexsup.c (ld_options): Add --warn-textrel.  Obsolete
+       --warn-shared-textrel.
+       (parse_args): Updated.
+       (elf_shlib_list_options): Check link_info.textrel_check.
+       * emultempl/elf.em: Updated.
+       * testsuite/ld-elf/pr19539.d: Replace -z notext with
+       --warn-textrel.  Expect a warning.
+       * testsuite/ld-i386/warn1.d: Update expected warning.
+
 2020-05-26  H.J. Lu  <hongjiu.lu@intel.com>
 
        * testsuite/ld-ifunc/ifunc-23a-x86.d: Skip *-*-lynxos *-*-nto*.
diff --git a/ld/NEWS b/ld/NEWS
index 9f5bbe51cf61e6c2ffc60c2eae82828e461c67e2..0aaa13d4874c1428849391422a56abd3708fcfe6 100644 (file)
--- a/ld/NEWS
+++ b/ld/NEWS
@@ -1,5 +1,8 @@
 -*- text -*-
 
+* Add a command-line option for ELF linker, --warn-textrel, to warn that
+  DT_TEXTREL is set in a position-independent executable or shared object.
+
 * Add command-line options --enable-non-contiguous-regions and
   --enable-non-contiguous-regions-warnings.
 
index 4fd6fdffe75fdadcb61bd1c6b146ec6431e86169..c4979eb9538234f9629bc32a5272ad07c2d358cd 100644 (file)
@@ -803,11 +803,11 @@ fragment <<EOF
       else if (strcmp (optarg, "nocommon") == 0)
        link_info.elf_stt_common = no_elf_stt_common;
       else if (strcmp (optarg, "text") == 0)
-       link_info.error_textrel = TRUE;
+       link_info.textrel_check = textrel_check_error;
       else if (strcmp (optarg, "notext") == 0)
-       link_info.error_textrel = FALSE;
+       link_info.textrel_check = textrel_check_none;
       else if (strcmp (optarg, "textoff") == 0)
-       link_info.error_textrel = FALSE;
+       link_info.textrel_check = textrel_check_none;
 EOF
 fi
 
index 4dc78e65fa251aa5487e3811fff97214b63136c4..a7ec0d01b3dd2675937ac6a5b57cd72e6f827cf1 100644 (file)
@@ -1358,9 +1358,9 @@ Specifying zero will override any default non-zero sized
 @item text
 @itemx notext
 @itemx textoff
-Report an error if DT_TEXTREL is set, i.e., if the binary has dynamic
-relocations in read-only sections.  Don't report an error if
-@samp{notext} or @samp{textoff}.
+Report an error if DT_TEXTREL is set, i.e., if the position-independent
+or shared object has dynamic relocations in read-only sections.  Don't
+report an error if @samp{notext} or @samp{textoff}.
 
 @item undefs
 Do not report unresolved symbol references from regular object files,
@@ -2404,9 +2404,10 @@ The address will only be changed if it not explicitly specified; that
 is, if the @code{SECTIONS} command does not specify a start address for
 the section (@pxref{SECTIONS}).
 
-@kindex --warn-shared-textrel
-@item --warn-shared-textrel
-Warn if the linker adds a DT_TEXTREL to a shared object.
+@kindex --warn-textrel
+@item --warn-textrel
+Warn if the linker adds DT_TEXTREL to a position-independent executable
+or shared object.
 
 @kindex --warn-alternate-em
 @item --warn-alternate-em
index 22b928d2d9049dbcd558eba94544fdf3e719e3b2..318ac7a789d663969ea9c5b99e30b5acf847f7a7 100644 (file)
@@ -130,7 +130,7 @@ enum option_values
   OPTION_UNRESOLVED_SYMBOLS,
   OPTION_WARN_UNRESOLVED_SYMBOLS,
   OPTION_ERROR_UNRESOLVED_SYMBOLS,
-  OPTION_WARN_SHARED_TEXTREL,
+  OPTION_WARN_TEXTREL,
   OPTION_WARN_ALTERNATE_EM,
   OPTION_REDUCE_MEMORY_OVERHEADS,
 #ifdef ENABLE_PLUGINS
index 04db2f129f872891b5d97ccb223e023a6cf21140..3733a7c8935a6c16286a6ff587978767dab6a4c3 100644 (file)
@@ -516,9 +516,11 @@ static const struct ld_option ld_options[] =
   { {"warn-section-align", no_argument, NULL, OPTION_WARN_SECTION_ALIGN},
     '\0', NULL, N_("Warn if start of section changes due to alignment"),
     TWO_DASHES },
-  { {"warn-shared-textrel", no_argument, NULL, OPTION_WARN_SHARED_TEXTREL},
-    '\0', NULL, N_("Warn if shared object has DT_TEXTREL"),
+  { {"warn-textrel", no_argument, NULL, OPTION_WARN_TEXTREL},
+    '\0', NULL, N_("Warn if outpout has DT_TEXTREL"),
     TWO_DASHES },
+  { {"warn-shared-textrel", no_argument, NULL, OPTION_WARN_TEXTREL},
+    '\0', NULL, NULL, NO_HELP },
   { {"warn-alternate-em", no_argument, NULL, OPTION_WARN_ALTERNATE_EM},
     '\0', NULL, N_("Warn if an object has alternate ELF machine code"),
     TWO_DASHES },
@@ -1438,8 +1440,8 @@ parse_args (unsigned argc, char **argv)
        case OPTION_WARN_SECTION_ALIGN:
          config.warn_section_align = TRUE;
          break;
-       case OPTION_WARN_SHARED_TEXTREL:
-         link_info.warn_shared_textrel = TRUE;
+       case OPTION_WARN_TEXTREL:
+         link_info.textrel_check = textrel_check_warning;
          break;
        case OPTION_WARN_ALTERNATE_EM:
          link_info.warn_alternate_em = TRUE;
@@ -1846,12 +1848,26 @@ elf_shlib_list_options (FILE *file)
   -z nocommon                 Generate common symbols with STT_OBJECT type\n"));
   fprintf (file, _("\
   -z stack-size=SIZE          Set size of stack segment\n"));
-  fprintf (file, _("\
-  -z text                     Treat DT_TEXTREL in shared object as error\n"));
-  fprintf (file, _("\
-  -z notext                   Don't treat DT_TEXTREL in shared object as error\n"));
-  fprintf (file, _("\
-  -z textoff                  Don't treat DT_TEXTREL in shared object as error\n"));
+  if (link_info.textrel_check == textrel_check_error)
+    fprintf (file, _("\
+  -z text                     Treat DT_TEXTREL in output as error (default)\n"));
+  else
+    fprintf (file, _("\
+  -z text                     Treat DT_TEXTREL in output as error\n"));
+  if (link_info.textrel_check == textrel_check_none)
+    {
+      fprintf (file, _("\
+  -z notext                   Don't treat DT_TEXTREL in output as error (default)\n"));
+      fprintf (file, _("\
+  -z textoff                  Don't treat DT_TEXTREL in output as error (default)\n"));
+    }
+  else
+    {
+      fprintf (file, _("\
+  -z notext                   Don't treat DT_TEXTREL in output as error\n"));
+      fprintf (file, _("\
+  -z textoff                  Don't treat DT_TEXTREL in output as error\n"));
+    }
 }
 
 static void
index 56e6502ca6ed5a2bcfe54cd9be0548a39158fc48..211d3e16398ad272278fb297fa0c2eb5faab0ee3 100644 (file)
@@ -1,7 +1,8 @@
 #source: start.s
 #source: pr19539.s
-#ld: -pie -T pr19539.t -z notext
+#ld: -pie -T pr19539.t --warn-textrel
 #readelf : --dyn-syms --wide
+#warning: .*: creating DT_TEXTREL in a PIE
 #target: *-*-linux* *-*-gnu* *-*-solaris* arm*-*-uclinuxfdpiceabi
 #xfail: cris*-*-* ![check_pie_support] 
 
index 3c78f31efdcda1fb71b729f585e5077039307040..c00fdb36dc19196014be855ba690d5943ecc196a 100644 (file)
@@ -1,4 +1,4 @@
 #name: --warn-shared-textrel --fatal-warnings
 #as: --32
 #ld: -shared -melf_i386 --warn-shared-textrel --fatal-warnings
-#error: .*warning: creating DT_TEXTREL in a shared object
+#error: .*warning: creating DT_TEXTREL in a shared object