x86 map file textrel

bfd/
	* elfxx-x86.c (readonly_dynrelocs): New function.
	(maybe_set_textrel): New function.  Always prints via minfo and
	correct "readonly" to "read-only" in warning message., replacing..
	(_bfd_x86_elf_readonly_dynrelocs): ..this.
	(_bfd_x86_elf_size_dynamic_sections): Correct "readonly" to
	"read-only" in warning message.  Formatting.
	(_bfd_x86_elf_adjust_dynamic_symbol): Use readonly_dynrelocs.
	* linker.c (bfd_link_hash_traverse): Comment typo fix.
ld/
	* testsuite/ld-i386/pr17935-1.d: Adjust expected error.
	* testsuite/ld-i386/pr17935-2.d: Likewise.
	* testsuite/ld-x86-64/pr17935-1.d: Likewise.
	* testsuite/ld-x86-64/pr17935-2.d: Likewise.
This commit is contained in:
Alan Modra
2017-12-02 14:48:50 +10:30
parent e21126b7b3
commit 826c3f1edc
8 changed files with 72 additions and 47 deletions

View File

@ -1,3 +1,14 @@
2017-12-04 Alan Modra <amodra@gmail.com>
* elfxx-x86.c (readonly_dynrelocs): New function.
(maybe_set_textrel): New function. Always prints via minfo and
correct "readonly" to "read-only" in warning message., replacing..
(_bfd_x86_elf_readonly_dynrelocs): ..this.
(_bfd_x86_elf_size_dynamic_sections): Correct "readonly" to
"read-only" in warning message. Formatting.
(_bfd_x86_elf_adjust_dynamic_symbol): Use readonly_dynrelocs.
* linker.c (bfd_link_hash_traverse): Comment typo fix.
2017-12-01 H.J. Lu <hongjiu.lu@intel.com> 2017-12-01 H.J. Lu <hongjiu.lu@intel.com>
* elfxx-x86.c (_bfd_x86_elf_readonly_dynrelocs): Print symbol * elfxx-x86.c (_bfd_x86_elf_readonly_dynrelocs): Print symbol

View File

@ -521,45 +521,58 @@ elf_x86_allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
return TRUE; return TRUE;
} }
/* Find any dynamic relocs that apply to read-only sections. */ /* Find dynamic relocs for H that apply to read-only sections. */
bfd_boolean static asection *
_bfd_x86_elf_readonly_dynrelocs (struct elf_link_hash_entry *h, readonly_dynrelocs (struct elf_link_hash_entry *h)
void *inf)
{ {
struct elf_x86_link_hash_entry *eh;
struct elf_dyn_relocs *p; struct elf_dyn_relocs *p;
for (p = elf_x86_hash_entry (h)->dyn_relocs; p != NULL; p = p->next)
{
asection *s = p->sec->output_section;
if (s != NULL && (s->flags & SEC_READONLY) != 0)
return p->sec;
}
return NULL;
}
/* Set DF_TEXTREL if we find any dynamic relocs that apply to
read-only sections. */
static bfd_boolean
maybe_set_textrel (struct elf_link_hash_entry *h, void *inf)
{
asection *sec;
if (h->root.type == bfd_link_hash_indirect)
return TRUE;
/* Skip local IFUNC symbols. */ /* Skip local IFUNC symbols. */
if (h->forced_local && h->type == STT_GNU_IFUNC) if (h->forced_local && h->type == STT_GNU_IFUNC)
return TRUE; return TRUE;
eh = (struct elf_x86_link_hash_entry *) h; sec = readonly_dynrelocs (h);
for (p = eh->dyn_relocs; p != NULL; p = p->next) if (sec != NULL)
{ {
asection *s = p->sec->output_section; struct bfd_link_info *info = (struct bfd_link_info *) inf;
if (s != NULL && (s->flags & SEC_READONLY) != 0) info->flags |= DF_TEXTREL;
{ /* xgettext:c-format */
struct bfd_link_info *info = (struct bfd_link_info *) inf; info->callbacks->minfo (_("%B: dynamic relocation against `%T' "
"in read-only section `%A'\n"),
sec->owner, h->root.root.string, sec);
info->flags |= DF_TEXTREL; if ((info->warn_shared_textrel && bfd_link_pic (info))
|| info->error_textrel)
/* xgettext:c-format */
info->callbacks->einfo (_("%P: %B: warning: relocation against `%s' "
"in read-only section `%A'\n"),
sec->owner, h->root.root.string, sec);
if ((info->warn_shared_textrel && bfd_link_pic (info)) /* Not an error, just cut short the traversal. */
|| info->error_textrel) return FALSE;
/* xgettext:c-format */
info->callbacks->einfo (_("%P: %B: warning: relocation against `%s' in readonly section `%A'\n"),
p->sec->owner, h->root.root.string,
p->sec);
else
/* xgettext:c-format */
info->callbacks->minfo
(_("%B: dynamic relocation against `%T' in read-only section `%A'\n"),
p->sec->owner, h->root.root.string, p->sec);
/* Not an error, just cut short the traversal. */
return FALSE;
}
} }
return TRUE; return TRUE;
} }
@ -937,8 +950,10 @@ _bfd_x86_elf_size_dynamic_sections (bfd *output_bfd,
if ((info->warn_shared_textrel && bfd_link_pic (info)) if ((info->warn_shared_textrel && bfd_link_pic (info))
|| info->error_textrel) || info->error_textrel)
/* xgettext:c-format */ /* xgettext:c-format */
info->callbacks->einfo (_("%P: %B: warning: relocation in readonly section `%A'\n"), info->callbacks->einfo
p->sec->owner, p->sec); (_("%P: %B: warning: relocation "
"in read-only section `%A'\n"),
p->sec->owner, p->sec);
} }
} }
} }
@ -1262,16 +1277,15 @@ _bfd_x86_elf_size_dynamic_sections (bfd *output_bfd,
/* If any dynamic relocs apply to a read-only section, /* If any dynamic relocs apply to a read-only section,
then we need a DT_TEXTREL entry. */ then we need a DT_TEXTREL entry. */
if ((info->flags & DF_TEXTREL) == 0) if ((info->flags & DF_TEXTREL) == 0)
elf_link_hash_traverse (&htab->elf, elf_link_hash_traverse (&htab->elf, maybe_set_textrel, info);
_bfd_x86_elf_readonly_dynrelocs,
info);
if ((info->flags & DF_TEXTREL) != 0) if ((info->flags & DF_TEXTREL) != 0)
{ {
if (htab->readonly_dynrelocs_against_ifunc) if (htab->readonly_dynrelocs_against_ifunc)
{ {
info->callbacks->einfo info->callbacks->einfo
(_("%P%X: read-only segment has dynamic IFUNC relocations; recompile with -fPIC\n")); (_("%P%X: read-only segment has dynamic IFUNC relocations;"
" recompile with -fPIC\n"));
bfd_set_error (bfd_error_bad_value); bfd_set_error (bfd_error_bad_value);
return FALSE; return FALSE;
} }
@ -1824,17 +1838,10 @@ _bfd_x86_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
|| (!eh->gotoff_ref || (!eh->gotoff_ref
&& htab->target_os != is_vxworks))) && htab->target_os != is_vxworks)))
{ {
for (p = eh->dyn_relocs; p != NULL; p = p->next) /* If we don't find any dynamic relocs in read-only sections,
{
s = p->sec->output_section;
if (s != NULL && (s->flags & SEC_READONLY) != 0)
break;
}
/* If we didn't find any dynamic relocs in read-only sections,
then we'll be keeping the dynamic relocs and avoiding the copy then we'll be keeping the dynamic relocs and avoiding the copy
reloc. */ reloc. */
if (p == NULL) if (!readonly_dynrelocs (h))
{ {
h->non_got_ref = 0; h->non_got_ref = 0;
return TRUE; return TRUE;

View File

@ -632,7 +632,7 @@ unwrap_hash_lookup (struct bfd_link_info *info,
/* Traverse a generic link hash table. Differs from bfd_hash_traverse /* Traverse a generic link hash table. Differs from bfd_hash_traverse
in the treatment of warning symbols. When warning symbols are in the treatment of warning symbols. When warning symbols are
created they replace the real symbol, so you don't get to see the created they replace the real symbol, so you don't get to see the
real symbol in a bfd_hash_travere. This traversal calls func with real symbol in a bfd_hash_traverse. This traversal calls func with
the real symbol. */ the real symbol. */
void void

View File

@ -1,3 +1,10 @@
2017-12-04 Alan Modra <amodra@gmail.com>
* testsuite/ld-i386/pr17935-1.d: Adjust expected error.
* testsuite/ld-i386/pr17935-2.d: Likewise.
* testsuite/ld-x86-64/pr17935-1.d: Likewise.
* testsuite/ld-x86-64/pr17935-2.d: Likewise.
2017-12-04 Alan Modra <amodra@gmail.com> 2017-12-04 Alan Modra <amodra@gmail.com>
* testsuite/ld-powerpc/powerpc.exp (ppceabitests): Add -a32 -mbig * testsuite/ld-powerpc/powerpc.exp (ppceabitests): Add -a32 -mbig

View File

@ -1,3 +1,3 @@
# as: --32 # as: --32
# ld: -m elf_i386 -shared -z text # ld: -m elf_i386 -shared -z text
# error: warning: relocation against `foo' in readonly section `.text' # error: warning: relocation against `foo' in read-only section `.text'

View File

@ -1,3 +1,3 @@
# as: --32 # as: --32
# ld: -m elf_i386 -shared -z text # ld: -m elf_i386 -shared -z text
# error: warning: relocation in readonly section `.text' # error: warning: relocation in read-only section `.text'

View File

@ -1,3 +1,3 @@
# as: --64 # as: --64
# ld: -m elf_x86_64 -shared -z text # ld: -m elf_x86_64 -shared -z text
# error: warning: relocation against `foo' in readonly section `.text' # error: warning: relocation against `foo' in read-only section `.text'

View File

@ -1,3 +1,3 @@
# as: --64 # as: --64
# ld: -m elf_x86_64 -shared -z text # ld: -m elf_x86_64 -shared -z text
# error: warning: relocation in readonly section `.text' # error: warning: relocation in read-only section `.text'