diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2020-05-27 04:53:54 -0700 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2020-05-27 04:54:10 -0700 |
commit | a6dbf402de65fe66f4ec99b56527dfd00d077cb6 (patch) | |
tree | a264f6b6544f748f3d7dea562ee44cb47a8d9dd1 | |
parent | 25e1eca8faf1c29d28e57b37d6b5e3810b7b870b (diff) | |
download | gdb-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/ChangeLog | 8 | ||||
-rw-r--r-- | bfd/elflink.c | 10 | ||||
-rw-r--r-- | bfd/elfxx-x86.c | 6 | ||||
-rw-r--r-- | include/ChangeLog | 8 | ||||
-rw-r--r-- | include/bfdlink.h | 19 | ||||
-rw-r--r-- | ld/ChangeLog | 17 | ||||
-rw-r--r-- | ld/NEWS | 3 | ||||
-rw-r--r-- | ld/emultempl/elf.em | 6 | ||||
-rw-r--r-- | ld/ld.texi | 13 | ||||
-rw-r--r-- | ld/ldlex.h | 2 | ||||
-rw-r--r-- | ld/lexsup.c | 36 | ||||
-rw-r--r-- | ld/testsuite/ld-elf/pr19539.d | 3 | ||||
-rw-r--r-- | ld/testsuite/ld-i386/warn1.d | 2 |
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*. @@ -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 @@ -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 @@ -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 |