x86; Don't add elf64-x86-64.lo nor elf64.lo together with elfxx-x86.lo

Don't set r_info and r_sym fields in _bfd_x86_elf_link_hash_table_create.
Instead, set them in _bfd_x86_elf_link_setup_gnu_properties.  We can
avoid adding elf64-x86-64.lo and elf64.lo together with elfxx-x86.lo to
bfd_backends.

	* configure.ac (bfd_backends): Don't add elf64-x86-64.lo nor
	elf64.lo together with elfxx-x86.lo for 64-bit BFD.
	* configure: Regenerated.
	* elf32-i386.c (elf_i386_link_setup_gnu_properties): Set r_info
	and r_sym fields of plt_layout.
	* elf64-x86-64.c (elf_x86_64_link_setup_gnu_properties):
	Likewise.
	* elfxx-x86.c (elf_x86_64_is_reloc_section): Remove BFD64 check.
	(_bfd_x86_elf_link_hash_table_create): Likewise.  Don't set
	r_info nor r_sym fields.
	(_bfd_x86_elf_link_setup_gnu_properties): Set r_info and r_sym
	fields of htab.
	* elfxx-x86.h (elf_x86_plt_layout_table): Add r_info and r_sym.
This commit is contained in:
H.J. Lu 2017-09-07 17:19:10 -07:00
parent bd757a5bf2
commit 7a382c1c50
7 changed files with 38 additions and 26 deletions

View File

@ -1,3 +1,19 @@
2017-09-07 H.J. Lu <hongjiu.lu@intel.com>
* configure.ac (bfd_backends): Don't add elf64-x86-64.lo nor
elf64.lo together with elfxx-x86.lo for 64-bit BFD.
* configure: Regenerated.
* elf32-i386.c (elf_i386_link_setup_gnu_properties): Set r_info
and r_sym fields of plt_layout.
* elf64-x86-64.c (elf_x86_64_link_setup_gnu_properties):
Likewise.
* elfxx-x86.c (elf_x86_64_is_reloc_section): Remove BFD64 check.
(_bfd_x86_elf_link_hash_table_create): Likewise. Don't set
r_info nor r_sym fields.
(_bfd_x86_elf_link_setup_gnu_properties): Set r_info and r_sym
fields of htab.
* elfxx-x86.h (elf_x86_plt_layout_table): Add r_info and r_sym.
2017-09-07 Palmer Dabbelt <palmer@dabbelt.com>
* (_bfd_riscv_relax_align): Call bfd_set_error and

7
bfd/configure vendored
View File

@ -14758,13 +14758,6 @@ rm -f conftest*
;;
esac
# elfxx-x86.lo needs elf64-x86-64.lo and elf64.lo with 64-bit BFD.
case "${bfd_backends}-${wordsize}" in
*elfxx-x86.lo*-64*)
bfd_backends="${bfd_backends} elf64-x86-64.lo elf64.lo"
;;
esac
tdefaults=""
test -n "${defvec}" && tdefaults="${tdefaults} -DDEFAULT_VECTOR=${defvec}"
test -n "${selvecs}" && tdefaults="${tdefaults} -DSELECT_VECS='${selvecs}'"

View File

@ -825,13 +825,6 @@ case ${host64}-${target64}-${want64} in
;;
esac
# elfxx-x86.lo needs elf64-x86-64.lo and elf64.lo with 64-bit BFD.
case "${bfd_backends}-${wordsize}" in
*elfxx-x86.lo*-64*)
bfd_backends="${bfd_backends} elf64-x86-64.lo elf64.lo"
;;
esac
tdefaults=""
test -n "${defvec}" && tdefaults="${tdefaults} -DDEFAULT_VECTOR=${defvec}"
test -n "${selvecs}" && tdefaults="${tdefaults} -DSELECT_VECS='${selvecs}'"

View File

@ -4628,6 +4628,9 @@ elf_i386_link_setup_gnu_properties (struct bfd_link_info *info)
break;
}
plt_layout.r_info = elf32_r_info;
plt_layout.r_sym = elf32_r_sym;
return _bfd_x86_elf_link_setup_gnu_properties (info, &plt_layout);
}

View File

@ -5185,6 +5185,17 @@ elf_x86_64_link_setup_gnu_properties (struct bfd_link_info *info)
plt_layout.normal_target = FALSE;
}
if (ABI_64_P (info->output_bfd))
{
plt_layout.r_info = elf64_r_info;
plt_layout.r_sym = elf64_r_sym;
}
else
{
plt_layout.r_info = elf32_r_info;
plt_layout.r_sym = elf32_r_sym;
}
return _bfd_x86_elf_link_setup_gnu_properties (info, &plt_layout);
}

View File

@ -731,13 +731,11 @@ elf_i386_is_reloc_section (const char *secname)
return CONST_STRNEQ (secname, ".rel");
}
#ifdef BFD64
static bfd_boolean
elf_x86_64_is_reloc_section (const char *secname)
{
return CONST_STRNEQ (secname, ".rela");
}
#endif
/* Create an x86 ELF linker hash table. */
@ -762,8 +760,6 @@ _bfd_x86_elf_link_hash_table_create (bfd *abfd)
return NULL;
}
#ifdef BFD64
/* NB: If BFD64 isn't defined, only i386 will be supported. */
if (bed->target_id == X86_64_ELF_DATA)
{
ret->is_reloc_section = elf_x86_64_is_reloc_section;
@ -775,18 +771,13 @@ _bfd_x86_elf_link_hash_table_create (bfd *abfd)
}
if (ABI_64_P (abfd))
{
ret->r_info = elf64_r_info;
ret->r_sym = elf64_r_sym;
ret->sizeof_reloc = sizeof (Elf64_External_Rela);
ret->pointer_r_type = R_X86_64_64;
ret->dynamic_interpreter = ELF64_DYNAMIC_INTERPRETER;
ret->dynamic_interpreter_size = sizeof ELF64_DYNAMIC_INTERPRETER;
}
else
#endif
{
ret->r_info = elf32_r_info;
ret->r_sym = elf32_r_sym;
if (bed->target_id == X86_64_ELF_DATA)
{
ret->sizeof_reloc = sizeof (Elf32_External_Rela);
@ -2188,9 +2179,6 @@ error_alignment:
pbfd = _bfd_elf_link_setup_gnu_properties (info);
if (bfd_link_relocatable (info))
return pbfd;
bed = get_elf_backend_data (info->output_bfd);
htab = elf_x86_hash_table (info, bed->target_id);
@ -2198,6 +2186,11 @@ error_alignment:
return pbfd;
htab->is_vxworks = plt_layout->is_vxworks;
htab->r_info = plt_layout->r_info;
htab->r_sym = plt_layout->r_sym;
if (bfd_link_relocatable (info))
return pbfd;
use_ibt_plt = info->ibtplt || info->ibt;
if (!use_ibt_plt && pbfd != NULL)

View File

@ -362,6 +362,9 @@ struct elf_x86_plt_layout_table
/* TRUE if this is a VxWorks x86 target. */
bfd_boolean is_vxworks;
bfd_vma (*r_info) (bfd_vma, bfd_vma);
bfd_vma (*r_sym) (bfd_vma);
};
struct elf_x86_obj_tdata