aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2020-05-27 04:53:54 -0700
committerH.J. Lu <hjl.tools@gmail.com>2020-05-27 04:54:10 -0700
commita6dbf402de65fe66f4ec99b56527dfd00d077cb6 (patch)
treea264f6b6544f748f3d7dea562ee44cb47a8d9dd1
parent25e1eca8faf1c29d28e57b37d6b5e3810b7b870b (diff)
downloadgdb-a6dbf402de65fe66f4ec99b56527dfd00d077cb6.zip
gdb-a6dbf402de65fe66f4ec99b56527dfd00d077cb6.tar.gz
gdb-a6dbf402de65fe66f4ec99b56527dfd00d077cb6.tar.bz2
ld: Add --warn-textrel and obsolete --warn-shared-textrel
--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.
-rw-r--r--bfd/ChangeLog8
-rw-r--r--bfd/elflink.c10
-rw-r--r--bfd/elfxx-x86.c6
-rw-r--r--include/ChangeLog8
-rw-r--r--include/bfdlink.h19
-rw-r--r--ld/ChangeLog17
-rw-r--r--ld/NEWS3
-rw-r--r--ld/emultempl/elf.em6
-rw-r--r--ld/ld.texi13
-rw-r--r--ld/ldlex.h2
-rw-r--r--ld/lexsup.c36
-rw-r--r--ld/testsuite/ld-elf/pr19539.d3
-rw-r--r--ld/testsuite/ld-i386/warn1.d2
13 files changed, 98 insertions, 35 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index f165b00..0fe1644 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -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
diff --git a/bfd/elflink.c b/bfd/elflink.c
index c157aea..f87927f 100644
--- a/bfd/elflink.c
+++ b/bfd/elflink.c
@@ -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;
}
}
diff --git a/bfd/elfxx-x86.c b/bfd/elfxx-x86.c
index 9679dca..6cc47af 100644
--- a/bfd/elfxx-x86.c
+++ b/bfd/elfxx-x86.c
@@ -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 "
diff --git a/include/ChangeLog b/include/ChangeLog
index 53f50e5..7d11401 100644
--- a/include/ChangeLog
+++ b/include/ChangeLog
@@ -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.
diff --git a/include/bfdlink.h b/include/bfdlink.h
index ec97679..34a0d2e 100644
--- a/include/bfdlink.h
+++ b/include/bfdlink.h
@@ -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;
diff --git a/ld/ChangeLog b/ld/ChangeLog
index f0d6c26..3fd9b74 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -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 9f5bbe5..0aaa13d 100644
--- 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.
diff --git a/ld/emultempl/elf.em b/ld/emultempl/elf.em
index 4fd6fdf..c4979eb 100644
--- a/ld/emultempl/elf.em
+++ b/ld/emultempl/elf.em
@@ -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
diff --git a/ld/ld.texi b/ld/ld.texi
index 4dc78e6..a7ec0d0 100644
--- a/ld/ld.texi
+++ b/ld/ld.texi
@@ -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
diff --git a/ld/ldlex.h b/ld/ldlex.h
index 22b928d..318ac7a 100644
--- a/ld/ldlex.h
+++ b/ld/ldlex.h
@@ -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
diff --git a/ld/lexsup.c b/ld/lexsup.c
index 04db2f1..3733a7c 100644
--- a/ld/lexsup.c
+++ b/ld/lexsup.c
@@ -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
diff --git a/ld/testsuite/ld-elf/pr19539.d b/ld/testsuite/ld-elf/pr19539.d
index 56e6502..211d3e1 100644
--- a/ld/testsuite/ld-elf/pr19539.d
+++ b/ld/testsuite/ld-elf/pr19539.d
@@ -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]
diff --git a/ld/testsuite/ld-i386/warn1.d b/ld/testsuite/ld-i386/warn1.d
index 3c78f31..c00fdb3 100644
--- a/ld/testsuite/ld-i386/warn1.d
+++ b/ld/testsuite/ld-i386/warn1.d
@@ -1,4 +1,4 @@
#name: --warn-shared-textrel --fatal-warnings
#as: --32
#ld: -shared -melf_i386 --warn-shared-textrel --fatal-warnings
-#error: .*warning: creating a DT_TEXTREL in a shared object
+#error: .*warning: creating DT_TEXTREL in a shared object