ELF: Add target_os to elf_link_hash_table/elf_backend_data
Add target_os to elf_backend_data to identify target OS. Add target_os, to elf_link_hash_table to identify target OS for linker output. * elf-bfd.h (elf_target_os): New. (elf_link_hash_table): Add target_os. (elf_backend_data): Add target_os. * elf32-arm.c (elf32_arm_link_hash_table): Remove vxworks_p, symbian_p and nacl_p. (create_got_section): Updated. (elf32_arm_create_dynamic_sections): Likewise. (arm_type_of_stub): Likewise. (elf32_arm_create_or_find_stub_sec): Likewise. (elf32_arm_allocate_plt_entry): Likewise. (elf32_arm_populate_plt_entry): Likewise. (elf32_arm_final_link_relocate): Likewise. (elf32_arm_check_relocs): Likewise. (allocate_dynrelocs_for_symbol): Likewise. (elf32_arm_finish_dynamic_symbol): Likewise. (elf32_arm_finish_dynamic_sections): Likewise. (elf32_arm_output_plt_map_1): Likewise. (elf32_arm_output_arch_local_syms): Likewise. (elf32_arm_add_symbol_hook): Likewise. (elf32_arm_nacl_link_hash_table_create): Likewise. (elf32_arm_vxworks_link_hash_table_create): Likewise. (elf32_arm_symbian_link_hash_table_create): Likewise. (ELF_TARGET_OS): New. * elf32-i386.c (elf_i386_arch_bed): Removed. (elf_backend_arch_data): Likewise. (elf_i386_solaris_arch_bed): Likewise. (elf_i386_nacl_arch_bed): Likewise. (elf_i386_vxworks_arch_bed): Likewise. (elf_i386_relocate_section): Updated. (elf_i386_finish_dynamic_sections): Likewise. (elf_i386_get_synthetic_symtab): Likewise. (elf_i386_link_setup_gnu_properties): Likewise. (ELF_TARGET_OS): New. * elf32-mips.c (ELF_TARGET_OS): New. * elf32-ppc.c (ppc_elf_link_hash_table): Remove is_vxworks. (ppc_elf_create_got): Updated. (ppc_elf_create_dynamic_sections): Likewise. (ppc_elf_check_relocs): Likewise. (ppc_elf_adjust_dynamic_symbol): Likewise. (ppc_elf_size_dynamic_sections): Likewise. (ppc_elf_relocate_section): Likewise. (ppc_elf_finish_dynamic_sections): Likewise. (ppc_elf_vxworks_link_hash_table_create): Likewise. (ELF_TARGET_OS): New. * elf32-sh.c (elf_sh_link_hash_table): Remove vxworks_p. (sh_elf_link_hash_table_create): Updated. (sh_elf_create_dynamic_sections): Likewise. (allocate_dynrelocs): Likewise. (sh_elf_size_dynamic_sections): Likewise. (sh_elf_relocate_section): Likewise. (sh_elf_finish_dynamic_symbol): Likewise. (sh_elf_finish_dynamic_sections): Likewise. (ELF_TARGET_OS): New. * elf32-sparc.c (elf32_sparc_vxworks_link_hash_table_create): Removed. (bfd_elf32_bfd_link_hash_table_create): Likewise. (ELF_TARGET_OS): New. * elf64-x86-64.c (elf_x86_64_arch_bed): Removed. (elf_x86_64_solaris_arch_bed): Likewise. (elf_x86_64_nacl_arch_bed): Likewise. (elf_x86_64_finish_dynamic_sections): Updated. (elf_x86_64_get_synthetic_symtab): Likewise. (elf_x86_64_link_setup_gnu_properties): Likewise. (ELF_TARGET_OS): New. * elflink.c (_bfd_elf_link_hash_table_init): Initialize target_o. * elfxx-mips.c (mips_elf_link_hash_table): Remove is_vxworks. (MIPS_ELF_REL_DYN_NAME): Updated. (ELF_MIPS_GP_OFFSET): Likewise. (mips_elf_create_local_got_entry): Likewise. (mips_elf_allocate_dynamic_relocations): Likewise. (mips_elf_count_got_symbols): Likewise. (is_gott_symbol): Likewise. (mips_elf_calculate_relocation): Likewise. (mips_elf_create_dynamic_relocation): Likewise. (_bfd_mips_elf_check_relocs): Likewise. (allocate_dynrelocs): Likewise. (_bfd_mips_elf_adjust_dynamic_symbol): Likewise. (mips_elf_lay_out_got): Likewise. (mips_elf_set_plt_sym_value): Likewise. (_bfd_mips_elf_size_dynamic_sections): Likewise. (_bfd_mips_elf_finish_dynamic_symbol): Likewise. (_bfd_mips_elf_finish_dynamic_sections): Likewise. (_bfd_mips_elf_final_link): Likewise. (_bfd_mips_init_file_header): Likewise. * elfxx-sparc.c (_bfd_sparc_elf_create_dynamic_sections): Likewise. (allocate_dynrelocs): Likewise. (_bfd_sparc_elf_size_dynamic_sections): Likewise. (_bfd_sparc_elf_relocate_section): Likewise. (_bfd_sparc_elf_finish_dynamic_symbol): Likewise. (sparc_finish_dyn): Likewise. (_bfd_sparc_elf_finish_dynamic_sections): Likewise. * elfxx-target.h (ELF_TARGET_OS): New. (elfNN_bed): Add ELF_TARGET_OS. * elfxx-x86.c (elf_x86_allocate_dynrelocs): Updated. (_bfd_x86_elf_link_hash_table_create): Likewise. (_bfd_x86_elf_size_dynamic_sections): Likewise. (_bfd_x86_elf_finish_dynamic_sections): Likewise. (_bfd_x86_elf_adjust_dynamic_symbol): Likewise. (_bfd_x86_elf_link_setup_gnu_properties): Likewise. * elfxx-x86.h (elf_x86_target_os): Removed. (elf_x86_backend_data): Likewise. (get_elf_x86_backend_data): Likewise. (elf_x86_link_hash_table): Remove target_os.
This commit is contained in:
parent
1424c35d07
commit
90c14f0c3a
108
bfd/ChangeLog
108
bfd/ChangeLog
@ -1,3 +1,111 @@
|
||||
2020-06-06 H.J. Lu <hongjiu.lu@intel.com>
|
||||
|
||||
* elf-bfd.h (elf_target_os): New.
|
||||
(elf_link_hash_table): Add target_os.
|
||||
(elf_backend_data): Add target_os.
|
||||
* elf32-arm.c (elf32_arm_link_hash_table): Remove vxworks_p,
|
||||
symbian_p and nacl_p.
|
||||
(create_got_section): Updated.
|
||||
(elf32_arm_create_dynamic_sections): Likewise.
|
||||
(arm_type_of_stub): Likewise.
|
||||
(elf32_arm_create_or_find_stub_sec): Likewise.
|
||||
(elf32_arm_allocate_plt_entry): Likewise.
|
||||
(elf32_arm_populate_plt_entry): Likewise.
|
||||
(elf32_arm_final_link_relocate): Likewise.
|
||||
(elf32_arm_check_relocs): Likewise.
|
||||
(allocate_dynrelocs_for_symbol): Likewise.
|
||||
(elf32_arm_finish_dynamic_symbol): Likewise.
|
||||
(elf32_arm_finish_dynamic_sections): Likewise.
|
||||
(elf32_arm_output_plt_map_1): Likewise.
|
||||
(elf32_arm_output_arch_local_syms): Likewise.
|
||||
(elf32_arm_add_symbol_hook): Likewise.
|
||||
(elf32_arm_nacl_link_hash_table_create): Likewise.
|
||||
(elf32_arm_vxworks_link_hash_table_create): Likewise.
|
||||
(elf32_arm_symbian_link_hash_table_create): Likewise.
|
||||
(ELF_TARGET_OS): New.
|
||||
* elf32-i386.c (elf_i386_arch_bed): Removed.
|
||||
(elf_backend_arch_data): Likewise.
|
||||
(elf_i386_solaris_arch_bed): Likewise.
|
||||
(elf_i386_nacl_arch_bed): Likewise.
|
||||
(elf_i386_vxworks_arch_bed): Likewise.
|
||||
(elf_i386_relocate_section): Updated.
|
||||
(elf_i386_finish_dynamic_sections): Likewise.
|
||||
(elf_i386_get_synthetic_symtab): Likewise.
|
||||
(elf_i386_link_setup_gnu_properties): Likewise.
|
||||
(ELF_TARGET_OS): New.
|
||||
* elf32-mips.c (ELF_TARGET_OS): New.
|
||||
* elf32-ppc.c (ppc_elf_link_hash_table): Remove is_vxworks.
|
||||
(ppc_elf_create_got): Updated.
|
||||
(ppc_elf_create_dynamic_sections): Likewise.
|
||||
(ppc_elf_check_relocs): Likewise.
|
||||
(ppc_elf_adjust_dynamic_symbol): Likewise.
|
||||
(ppc_elf_size_dynamic_sections): Likewise.
|
||||
(ppc_elf_relocate_section): Likewise.
|
||||
(ppc_elf_finish_dynamic_sections): Likewise.
|
||||
(ppc_elf_vxworks_link_hash_table_create): Likewise.
|
||||
(ELF_TARGET_OS): New.
|
||||
* elf32-sh.c (elf_sh_link_hash_table): Remove vxworks_p.
|
||||
(sh_elf_link_hash_table_create): Updated.
|
||||
(sh_elf_create_dynamic_sections): Likewise.
|
||||
(allocate_dynrelocs): Likewise.
|
||||
(sh_elf_size_dynamic_sections): Likewise.
|
||||
(sh_elf_relocate_section): Likewise.
|
||||
(sh_elf_finish_dynamic_symbol): Likewise.
|
||||
(sh_elf_finish_dynamic_sections): Likewise.
|
||||
(ELF_TARGET_OS): New.
|
||||
* elf32-sparc.c (elf32_sparc_vxworks_link_hash_table_create):
|
||||
Removed.
|
||||
(bfd_elf32_bfd_link_hash_table_create): Likewise.
|
||||
(ELF_TARGET_OS): New.
|
||||
* elf64-x86-64.c (elf_x86_64_arch_bed): Removed.
|
||||
(elf_x86_64_solaris_arch_bed): Likewise.
|
||||
(elf_x86_64_nacl_arch_bed): Likewise.
|
||||
(elf_x86_64_finish_dynamic_sections): Updated.
|
||||
(elf_x86_64_get_synthetic_symtab): Likewise.
|
||||
(elf_x86_64_link_setup_gnu_properties): Likewise.
|
||||
(ELF_TARGET_OS): New.
|
||||
* elflink.c (_bfd_elf_link_hash_table_init): Initialize
|
||||
target_o.
|
||||
* elfxx-mips.c (mips_elf_link_hash_table): Remove is_vxworks.
|
||||
(MIPS_ELF_REL_DYN_NAME): Updated.
|
||||
(ELF_MIPS_GP_OFFSET): Likewise.
|
||||
(mips_elf_create_local_got_entry): Likewise.
|
||||
(mips_elf_allocate_dynamic_relocations): Likewise.
|
||||
(mips_elf_count_got_symbols): Likewise.
|
||||
(is_gott_symbol): Likewise.
|
||||
(mips_elf_calculate_relocation): Likewise.
|
||||
(mips_elf_create_dynamic_relocation): Likewise.
|
||||
(_bfd_mips_elf_check_relocs): Likewise.
|
||||
(allocate_dynrelocs): Likewise.
|
||||
(_bfd_mips_elf_adjust_dynamic_symbol): Likewise.
|
||||
(mips_elf_lay_out_got): Likewise.
|
||||
(mips_elf_set_plt_sym_value): Likewise.
|
||||
(_bfd_mips_elf_size_dynamic_sections): Likewise.
|
||||
(_bfd_mips_elf_finish_dynamic_symbol): Likewise.
|
||||
(_bfd_mips_elf_finish_dynamic_sections): Likewise.
|
||||
(_bfd_mips_elf_final_link): Likewise.
|
||||
(_bfd_mips_init_file_header): Likewise.
|
||||
* elfxx-sparc.c (_bfd_sparc_elf_create_dynamic_sections):
|
||||
Likewise.
|
||||
(allocate_dynrelocs): Likewise.
|
||||
(_bfd_sparc_elf_size_dynamic_sections): Likewise.
|
||||
(_bfd_sparc_elf_relocate_section): Likewise.
|
||||
(_bfd_sparc_elf_finish_dynamic_symbol): Likewise.
|
||||
(sparc_finish_dyn): Likewise.
|
||||
(_bfd_sparc_elf_finish_dynamic_sections): Likewise.
|
||||
* elfxx-target.h (ELF_TARGET_OS): New.
|
||||
(elfNN_bed): Add ELF_TARGET_OS.
|
||||
* elfxx-x86.c (elf_x86_allocate_dynrelocs): Updated.
|
||||
(_bfd_x86_elf_link_hash_table_create): Likewise.
|
||||
(_bfd_x86_elf_size_dynamic_sections): Likewise.
|
||||
(_bfd_x86_elf_finish_dynamic_sections): Likewise.
|
||||
(_bfd_x86_elf_adjust_dynamic_symbol): Likewise.
|
||||
(_bfd_x86_elf_link_setup_gnu_properties): Likewise.
|
||||
* elfxx-x86.h (elf_x86_target_os): Removed.
|
||||
(elf_x86_backend_data): Likewise.
|
||||
(get_elf_x86_backend_data): Likewise.
|
||||
(elf_x86_link_hash_table): Remove target_os.
|
||||
|
||||
2020-06-06 Alan Modra <amodra@gmail.com>
|
||||
|
||||
* reloc.c: Rename
|
||||
|
@ -540,6 +540,15 @@ struct bfd_link_needed_list
|
||||
const char *name;
|
||||
};
|
||||
|
||||
enum elf_target_os
|
||||
{
|
||||
is_normal,
|
||||
is_symbian, /* Symbian OS. */
|
||||
is_solaris, /* Solaris. */
|
||||
is_vxworks, /* VxWorks. */
|
||||
is_nacl /* Native Client. */
|
||||
};
|
||||
|
||||
/* ELF linker hash table. */
|
||||
|
||||
struct elf_link_hash_table
|
||||
@ -641,6 +650,9 @@ struct elf_link_hash_table
|
||||
asection *tls_sec;
|
||||
bfd_size_type tls_size; /* Bytes. */
|
||||
|
||||
/* Target OS for linker output. */
|
||||
enum elf_target_os target_os;
|
||||
|
||||
/* A linked list of dynamic BFD's loaded in the link. */
|
||||
struct elf_link_loaded_list *dyn_loaded;
|
||||
|
||||
@ -861,6 +873,9 @@ struct elf_backend_data
|
||||
extensions to elf_obj_tdata and elf_link_hash_table structures. */
|
||||
enum elf_target_id target_id;
|
||||
|
||||
/* Target OS. */
|
||||
enum elf_target_os target_os;
|
||||
|
||||
/* The ELF machine code (EM_xxxx) for this backend. */
|
||||
int elf_machine_code;
|
||||
|
||||
|
109
bfd/elf32-arm.c
109
bfd/elf32-arm.c
@ -3360,15 +3360,6 @@ struct elf32_arm_link_hash_table
|
||||
/* The number of bytes in the subsequent PLT etries. */
|
||||
bfd_size_type plt_entry_size;
|
||||
|
||||
/* True if the target system is VxWorks. */
|
||||
int vxworks_p;
|
||||
|
||||
/* True if the target system is Symbian OS. */
|
||||
int symbian_p;
|
||||
|
||||
/* True if the target system is Native Client. */
|
||||
int nacl_p;
|
||||
|
||||
/* True if the target uses REL relocations. */
|
||||
bfd_boolean use_rel;
|
||||
|
||||
@ -3803,7 +3794,7 @@ create_got_section (bfd *dynobj, struct bfd_link_info *info)
|
||||
return FALSE;
|
||||
|
||||
/* BPABI objects never have a GOT, or associated sections. */
|
||||
if (htab->symbian_p)
|
||||
if (htab->root.target_os == is_symbian)
|
||||
return TRUE;
|
||||
|
||||
if (! _bfd_elf_create_got_section (dynobj, info))
|
||||
@ -3960,7 +3951,7 @@ elf32_arm_create_dynamic_sections (bfd *dynobj, struct bfd_link_info *info)
|
||||
if (!_bfd_elf_create_dynamic_sections (dynobj, info))
|
||||
return FALSE;
|
||||
|
||||
if (htab->vxworks_p)
|
||||
if (htab->root.target_os == is_vxworks)
|
||||
{
|
||||
if (!elf_vxworks_create_dynamic_sections (dynobj, info, &htab->srelplt2))
|
||||
return FALSE;
|
||||
@ -4483,11 +4474,11 @@ arm_type_of_stub (struct bfd_link_info *info,
|
||||
? (r_type == R_ARM_TLS_CALL
|
||||
/* TLS PIC Stub. */
|
||||
? arm_stub_long_branch_any_tls_pic
|
||||
: (globals->nacl_p
|
||||
: (globals->root.target_os == is_nacl
|
||||
? arm_stub_long_branch_arm_nacl_pic
|
||||
: arm_stub_long_branch_any_arm_pic))
|
||||
/* non-PIC stubs. */
|
||||
: (globals->nacl_p
|
||||
: (globals->root.target_os == is_nacl
|
||||
? arm_stub_long_branch_arm_nacl
|
||||
: arm_stub_long_branch_any_any);
|
||||
}
|
||||
@ -4752,7 +4743,7 @@ elf32_arm_create_or_find_stub_sec (asection **link_sec_p, asection *section,
|
||||
stub_sec_p = &htab->stub_group[link_sec->id].stub_sec;
|
||||
stub_sec_prefix = link_sec->name;
|
||||
out_sec = link_sec->output_section;
|
||||
align = htab->nacl_p ? 4 : 3;
|
||||
align = htab->root.target_os == is_nacl ? 4 : 3;
|
||||
}
|
||||
|
||||
if (*stub_sec_p == NULL)
|
||||
@ -9524,7 +9515,7 @@ elf32_arm_allocate_plt_entry (struct bfd_link_info *info,
|
||||
sgotplt = htab->root.igotplt;
|
||||
|
||||
/* NaCl uses a special first entry in .iplt too. */
|
||||
if (htab->nacl_p && splt->size == 0)
|
||||
if (htab->root.target_os == is_nacl && splt->size == 0)
|
||||
splt->size += htab->plt_header_size;
|
||||
|
||||
/* Allocate room for an R_ARM_IRELATIVE relocation in .rel.iplt. */
|
||||
@ -9566,7 +9557,7 @@ elf32_arm_allocate_plt_entry (struct bfd_link_info *info,
|
||||
root_plt->offset = splt->size;
|
||||
splt->size += htab->plt_entry_size;
|
||||
|
||||
if (!htab->symbian_p)
|
||||
if (htab->root.target_os != is_symbian)
|
||||
{
|
||||
/* We also need to make an entry in the .got.plt section, which
|
||||
will be placed in the .got section by the linker script. */
|
||||
@ -9647,7 +9638,7 @@ elf32_arm_populate_plt_entry (bfd *output_bfd, struct bfd_link_info *info,
|
||||
BFD_ASSERT (splt != NULL && srel != NULL);
|
||||
|
||||
/* Fill in the entry in the procedure linkage table. */
|
||||
if (htab->symbian_p)
|
||||
if (htab->root.target_os == is_symbian)
|
||||
{
|
||||
BFD_ASSERT (dynindx >= 0);
|
||||
put_arm_insn (htab, output_bfd,
|
||||
@ -9704,7 +9695,7 @@ elf32_arm_populate_plt_entry (bfd *output_bfd, struct bfd_link_info *info,
|
||||
+ root_plt->offset);
|
||||
|
||||
ptr = splt->contents + root_plt->offset;
|
||||
if (htab->vxworks_p && bfd_link_pic (info))
|
||||
if (htab->root.target_os == is_vxworks && bfd_link_pic (info))
|
||||
{
|
||||
unsigned int i;
|
||||
bfd_vma val;
|
||||
@ -9722,7 +9713,7 @@ elf32_arm_populate_plt_entry (bfd *output_bfd, struct bfd_link_info *info,
|
||||
put_arm_insn (htab, output_bfd, val, ptr);
|
||||
}
|
||||
}
|
||||
else if (htab->vxworks_p)
|
||||
else if (htab->root.target_os == is_vxworks)
|
||||
{
|
||||
unsigned int i;
|
||||
bfd_vma val;
|
||||
@ -9760,7 +9751,7 @@ elf32_arm_populate_plt_entry (bfd *output_bfd, struct bfd_link_info *info,
|
||||
rel.r_addend = 0;
|
||||
SWAP_RELOC_OUT (htab) (output_bfd, &rel, loc);
|
||||
}
|
||||
else if (htab->nacl_p)
|
||||
else if (htab->root.target_os == is_nacl)
|
||||
{
|
||||
/* Calculate the displacement between the PLT slot and the
|
||||
common tail that's part of the special initial PLT slot. */
|
||||
@ -10465,7 +10456,7 @@ elf32_arm_final_link_relocate (reloc_howto_type * howto,
|
||||
return bfd_reloc_ok;
|
||||
|
||||
case R_ARM_ABS12:
|
||||
if (!globals->vxworks_p)
|
||||
if (globals->root.target_os != is_vxworks)
|
||||
return elf32_arm_abs12_reloc (input_bfd, hit_data, value + addend);
|
||||
/* Fall through. */
|
||||
|
||||
@ -10513,7 +10504,7 @@ elf32_arm_final_link_relocate (reloc_howto_type * howto,
|
||||
|| globals->root.is_relocatable_executable
|
||||
|| globals->fdpic_p)
|
||||
&& (input_section->flags & SEC_ALLOC)
|
||||
&& !(globals->vxworks_p
|
||||
&& !(globals->root.target_os == is_vxworks
|
||||
&& strcmp (input_section->output_section->name,
|
||||
".tls_vars") == 0)
|
||||
&& ((r_type != R_ARM_REL32 && r_type != R_ARM_REL32_NOI)
|
||||
@ -10590,7 +10581,7 @@ elf32_arm_final_link_relocate (reloc_howto_type * howto,
|
||||
/* This symbol is local, or marked to become local. */
|
||||
BFD_ASSERT (r_type == R_ARM_ABS32 || r_type == R_ARM_ABS32_NOI
|
||||
|| (globals->fdpic_p && !bfd_link_pic(info)));
|
||||
if (globals->symbian_p)
|
||||
if (globals->root.target_os == is_symbian)
|
||||
{
|
||||
asection *osec;
|
||||
|
||||
@ -15513,7 +15504,7 @@ elf32_arm_check_relocs (bfd *abfd, struct bfd_link_info *info,
|
||||
case R_ARM_ABS12:
|
||||
/* VxWorks uses dynamic R_ARM_ABS12 relocations for
|
||||
ldr __GOTT_INDEX__ offsets. */
|
||||
if (!htab->vxworks_p)
|
||||
if (htab->root.target_os != is_vxworks)
|
||||
{
|
||||
may_need_local_target_p = TRUE;
|
||||
break;
|
||||
@ -15666,7 +15657,7 @@ elf32_arm_check_relocs (bfd *abfd, struct bfd_link_info *info,
|
||||
return FALSE;
|
||||
|
||||
/* BPABI objects never have dynamic relocations mapped. */
|
||||
if (htab->symbian_p)
|
||||
if (htab->root.target_os == is_symbian)
|
||||
{
|
||||
flagword flags;
|
||||
|
||||
@ -16270,7 +16261,7 @@ allocate_dynrelocs_for_symbol (struct elf_link_hash_entry *h, void * inf)
|
||||
/* VxWorks executables have a second set of relocations for
|
||||
each PLT entry. They go in a separate relocation section,
|
||||
which is processed by the kernel loader. */
|
||||
if (htab->vxworks_p && !bfd_link_pic (info))
|
||||
if (htab->root.target_os == is_vxworks && !bfd_link_pic (info))
|
||||
{
|
||||
/* There is a relocation for the initial PLT entry:
|
||||
an R_ARM_32 relocation for _GLOBAL_OFFSET_TABLE_. */
|
||||
@ -16314,7 +16305,7 @@ allocate_dynrelocs_for_symbol (struct elf_link_hash_entry *h, void * inf)
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (!htab->symbian_p)
|
||||
if (htab->root.target_os != is_symbian)
|
||||
{
|
||||
s = htab->root.sgot;
|
||||
h->got.offset = s->size;
|
||||
@ -16575,7 +16566,7 @@ allocate_dynrelocs_for_symbol (struct elf_link_hash_entry *h, void * inf)
|
||||
}
|
||||
}
|
||||
|
||||
if (htab->vxworks_p)
|
||||
if (htab->root.target_os == is_vxworks)
|
||||
{
|
||||
struct elf_dyn_relocs **pp;
|
||||
|
||||
@ -16729,7 +16720,6 @@ elf32_arm_size_dynamic_sections (bfd * output_bfd ATTRIBUTE_UNUSED,
|
||||
bfd_size_type locsymcount;
|
||||
Elf_Internal_Shdr *symtab_hdr;
|
||||
asection *srel;
|
||||
bfd_boolean is_vxworks = htab->vxworks_p;
|
||||
unsigned int symndx;
|
||||
struct fdpic_local *local_fdpic_cnts;
|
||||
|
||||
@ -16751,7 +16741,7 @@ elf32_arm_size_dynamic_sections (bfd * output_bfd ATTRIBUTE_UNUSED,
|
||||
linker script /DISCARD/, so we'll be discarding
|
||||
the relocs too. */
|
||||
}
|
||||
else if (is_vxworks
|
||||
else if (htab->root.target_os == is_vxworks
|
||||
&& strcmp (p->sec->output_section->name,
|
||||
".tls_vars") == 0)
|
||||
{
|
||||
@ -17122,7 +17112,7 @@ elf32_arm_size_dynamic_sections (bfd * output_bfd ATTRIBUTE_UNUSED,
|
||||
if (!add_dynamic_entry (DT_TEXTREL, 0))
|
||||
return FALSE;
|
||||
}
|
||||
if (htab->vxworks_p
|
||||
if (htab->root.target_os == is_vxworks
|
||||
&& !elf_vxworks_add_dynamic_entries (output_bfd, info))
|
||||
return FALSE;
|
||||
}
|
||||
@ -17267,7 +17257,9 @@ elf32_arm_finish_dynamic_symbol (bfd * output_bfd,
|
||||
and for FDPIC, the _GLOBAL_OFFSET_TABLE_ symbol is not absolute:
|
||||
it is relative to the ".got" section. */
|
||||
if (h == htab->root.hdynamic
|
||||
|| (!htab->fdpic_p && !htab->vxworks_p && h == htab->root.hgot))
|
||||
|| (!htab->fdpic_p
|
||||
&& htab->root.target_os != is_vxworks
|
||||
&& h == htab->root.hgot))
|
||||
sym->st_shndx = SHN_ABS;
|
||||
|
||||
return TRUE;
|
||||
@ -17353,7 +17345,7 @@ elf32_arm_finish_dynamic_sections (bfd * output_bfd, struct bfd_link_info * info
|
||||
|
||||
splt = htab->root.splt;
|
||||
BFD_ASSERT (splt != NULL && sdyn != NULL);
|
||||
BFD_ASSERT (htab->symbian_p || sgot != NULL);
|
||||
BFD_ASSERT (htab->root.target_os == is_symbian || sgot != NULL);
|
||||
|
||||
dyncon = (Elf32_External_Dyn *) sdyn->contents;
|
||||
dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
|
||||
@ -17371,7 +17363,7 @@ elf32_arm_finish_dynamic_sections (bfd * output_bfd, struct bfd_link_info * info
|
||||
unsigned int type;
|
||||
|
||||
default:
|
||||
if (htab->vxworks_p
|
||||
if (htab->root.target_os == is_vxworks
|
||||
&& elf_vxworks_finish_dynamic_entry (output_bfd, &dyn))
|
||||
bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
|
||||
break;
|
||||
@ -17396,7 +17388,8 @@ elf32_arm_finish_dynamic_sections (bfd * output_bfd, struct bfd_link_info * info
|
||||
goto get_vma_if_bpabi;
|
||||
|
||||
case DT_PLTGOT:
|
||||
name = htab->symbian_p ? ".got" : ".got.plt";
|
||||
name = (htab->root.target_os == is_symbian
|
||||
? ".got" : ".got.plt");
|
||||
goto get_vma;
|
||||
case DT_JMPREL:
|
||||
name = RELOC_SECTION (htab, ".plt");
|
||||
@ -17409,7 +17402,7 @@ elf32_arm_finish_dynamic_sections (bfd * output_bfd, struct bfd_link_info * info
|
||||
bfd_set_error (bfd_error_invalid_operation);
|
||||
return FALSE;
|
||||
}
|
||||
if (!htab->symbian_p)
|
||||
if (htab->root.target_os != is_symbian)
|
||||
dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
|
||||
else
|
||||
/* In the BPABI, tags in the PT_DYNAMIC section point
|
||||
@ -17420,7 +17413,7 @@ elf32_arm_finish_dynamic_sections (bfd * output_bfd, struct bfd_link_info * info
|
||||
break;
|
||||
|
||||
get_vma_if_bpabi:
|
||||
if (htab->symbian_p)
|
||||
if (htab->root.target_os == is_symbian)
|
||||
goto get_vma;
|
||||
break;
|
||||
|
||||
@ -17442,7 +17435,7 @@ elf32_arm_finish_dynamic_sections (bfd * output_bfd, struct bfd_link_info * info
|
||||
relocation section, since relocation sections are
|
||||
never allocated under the BPABI. PLT relocs are also
|
||||
included. */
|
||||
if (htab->symbian_p)
|
||||
if (htab->root.target_os == is_symbian)
|
||||
{
|
||||
unsigned int i;
|
||||
type = ((dyn.d_tag == DT_REL || dyn.d_tag == DT_RELSZ)
|
||||
@ -17518,7 +17511,7 @@ elf32_arm_finish_dynamic_sections (bfd * output_bfd, struct bfd_link_info * info
|
||||
got_address = sgot->output_section->vma + sgot->output_offset;
|
||||
plt_address = splt->output_section->vma + splt->output_offset;
|
||||
|
||||
if (htab->vxworks_p)
|
||||
if (htab->root.target_os == is_vxworks)
|
||||
{
|
||||
/* The VxWorks GOT is relocated by the dynamic linker.
|
||||
Therefore, we must emit relocations rather than simply
|
||||
@ -17541,7 +17534,7 @@ elf32_arm_finish_dynamic_sections (bfd * output_bfd, struct bfd_link_info * info
|
||||
SWAP_RELOC_OUT (htab) (output_bfd, &rel,
|
||||
htab->srelplt2->contents);
|
||||
}
|
||||
else if (htab->nacl_p)
|
||||
else if (htab->root.target_os == is_nacl)
|
||||
arm_nacl_put_plt0 (htab, output_bfd, splt,
|
||||
got_address + 8 - (plt_address + 16));
|
||||
else if (using_thumb_only (htab))
|
||||
@ -17622,7 +17615,7 @@ elf32_arm_finish_dynamic_sections (bfd * output_bfd, struct bfd_link_info * info
|
||||
#endif
|
||||
}
|
||||
|
||||
if (htab->vxworks_p
|
||||
if (htab->root.target_os == is_vxworks
|
||||
&& !bfd_link_pic (info)
|
||||
&& htab->root.splt->size > 0)
|
||||
{
|
||||
@ -17652,7 +17645,9 @@ elf32_arm_finish_dynamic_sections (bfd * output_bfd, struct bfd_link_info * info
|
||||
}
|
||||
}
|
||||
|
||||
if (htab->nacl_p && htab->root.iplt != NULL && htab->root.iplt->size > 0)
|
||||
if (htab->root.target_os == is_nacl
|
||||
&& htab->root.iplt != NULL
|
||||
&& htab->root.iplt->size > 0)
|
||||
/* NaCl uses a special first entry in .iplt too. */
|
||||
arm_nacl_put_plt0 (htab, output_bfd, htab->root.iplt, 0);
|
||||
|
||||
@ -17929,14 +17924,14 @@ elf32_arm_output_plt_map_1 (output_arch_syminfo *osi,
|
||||
(osi->info->output_bfd, osi->sec->output_section));
|
||||
|
||||
addr = root_plt->offset & -2;
|
||||
if (htab->symbian_p)
|
||||
if (htab->root.target_os == is_symbian)
|
||||
{
|
||||
if (!elf32_arm_output_map_sym (osi, ARM_MAP_ARM, addr))
|
||||
return FALSE;
|
||||
if (!elf32_arm_output_map_sym (osi, ARM_MAP_DATA, addr + 4))
|
||||
return FALSE;
|
||||
}
|
||||
else if (htab->vxworks_p)
|
||||
else if (htab->root.target_os == is_vxworks)
|
||||
{
|
||||
if (!elf32_arm_output_map_sym (osi, ARM_MAP_ARM, addr))
|
||||
return FALSE;
|
||||
@ -17947,7 +17942,7 @@ elf32_arm_output_plt_map_1 (output_arch_syminfo *osi,
|
||||
if (!elf32_arm_output_map_sym (osi, ARM_MAP_DATA, addr + 20))
|
||||
return FALSE;
|
||||
}
|
||||
else if (htab->nacl_p)
|
||||
else if (htab->root.target_os == is_nacl)
|
||||
{
|
||||
if (!elf32_arm_output_map_sym (osi, ARM_MAP_ARM, addr))
|
||||
return FALSE;
|
||||
@ -18309,7 +18304,7 @@ elf32_arm_output_arch_local_syms (bfd *output_bfd,
|
||||
|
||||
/* Output mapping symbols for the plt header. SymbianOS does not have a
|
||||
plt header. */
|
||||
if (htab->vxworks_p)
|
||||
if (htab->root.target_os == is_vxworks)
|
||||
{
|
||||
/* VxWorks shared libraries have no PLT header. */
|
||||
if (!bfd_link_pic (info))
|
||||
@ -18320,7 +18315,7 @@ elf32_arm_output_arch_local_syms (bfd *output_bfd,
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
else if (htab->nacl_p)
|
||||
else if (htab->root.target_os == is_nacl)
|
||||
{
|
||||
if (!elf32_arm_output_map_sym (&osi, ARM_MAP_ARM, 0))
|
||||
return FALSE;
|
||||
@ -18334,7 +18329,7 @@ elf32_arm_output_arch_local_syms (bfd *output_bfd,
|
||||
if (!elf32_arm_output_map_sym (&osi, ARM_MAP_THUMB, 16))
|
||||
return FALSE;
|
||||
}
|
||||
else if (!htab->symbian_p && !htab->fdpic_p)
|
||||
else if (htab->root.target_os != is_symbian && !htab->fdpic_p)
|
||||
{
|
||||
if (!elf32_arm_output_map_sym (&osi, ARM_MAP_ARM, 0))
|
||||
return FALSE;
|
||||
@ -18344,7 +18339,9 @@ elf32_arm_output_arch_local_syms (bfd *output_bfd,
|
||||
#endif
|
||||
}
|
||||
}
|
||||
if (htab->nacl_p && htab->root.iplt && htab->root.iplt->size > 0)
|
||||
if (htab->root.target_os == is_nacl
|
||||
&& htab->root.iplt
|
||||
&& htab->root.iplt->size > 0)
|
||||
{
|
||||
/* NaCl uses a special first entry in .iplt too. */
|
||||
osi.sec = htab->root.iplt;
|
||||
@ -19916,7 +19913,7 @@ elf32_arm_add_symbol_hook (bfd *abfd, struct bfd_link_info *info,
|
||||
if (elf32_arm_hash_table (info) == NULL)
|
||||
return FALSE;
|
||||
|
||||
if (elf32_arm_hash_table (info)->vxworks_p
|
||||
if (elf32_arm_hash_table (info)->root.target_os == is_vxworks
|
||||
&& !elf_vxworks_add_symbol_hook (abfd, info, sym, namep,
|
||||
flagsp, secp, valp))
|
||||
return FALSE;
|
||||
@ -20428,8 +20425,6 @@ elf32_arm_nacl_link_hash_table_create (bfd *abfd)
|
||||
struct elf32_arm_link_hash_table *htab
|
||||
= (struct elf32_arm_link_hash_table *) ret;
|
||||
|
||||
htab->nacl_p = 1;
|
||||
|
||||
htab->plt_header_size = 4 * ARRAY_SIZE (elf32_arm_nacl_plt0_entry);
|
||||
htab->plt_entry_size = 4 * ARRAY_SIZE (elf32_arm_nacl_plt_entry);
|
||||
}
|
||||
@ -20484,6 +20479,8 @@ elf32_arm_nacl_plt_sym_val (bfd_vma i, const asection *plt,
|
||||
#undef ELF_MINPAGESIZE
|
||||
#undef ELF_COMMONPAGESIZE
|
||||
|
||||
#undef ELF_TARGET_OS
|
||||
#define ELF_TARGET_OS is_nacl
|
||||
|
||||
#include "elf32-target.h"
|
||||
|
||||
@ -20566,6 +20563,8 @@ elf32_arm_fdpic_omit_section_dynsym (bfd *output_bfd ATTRIBUTE_UNUSED,
|
||||
#undef elf_backend_omit_section_dynsym
|
||||
#define elf_backend_omit_section_dynsym elf32_arm_fdpic_omit_section_dynsym
|
||||
|
||||
#undef ELF_TARGET_OS
|
||||
|
||||
#include "elf32-target.h"
|
||||
|
||||
#undef elf_match_priority
|
||||
@ -20597,7 +20596,6 @@ elf32_arm_vxworks_link_hash_table_create (bfd *abfd)
|
||||
struct elf32_arm_link_hash_table *htab
|
||||
= (struct elf32_arm_link_hash_table *) ret;
|
||||
htab->use_rel = 0;
|
||||
htab->vxworks_p = 1;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
@ -20629,6 +20627,8 @@ elf32_arm_vxworks_final_write_processing (bfd *abfd)
|
||||
#define elf_backend_want_plt_sym 1
|
||||
#undef ELF_MAXPAGESIZE
|
||||
#define ELF_MAXPAGESIZE 0x1000
|
||||
#undef ELF_TARGET_OS
|
||||
#define ELF_TARGET_OS is_vxworks
|
||||
|
||||
#include "elf32-target.h"
|
||||
|
||||
@ -20885,7 +20885,6 @@ elf32_arm_symbian_link_hash_table_create (bfd *abfd)
|
||||
htab->plt_header_size = 0;
|
||||
/* The PLT entries are each one instruction and one word. */
|
||||
htab->plt_entry_size = 4 * ARRAY_SIZE (elf32_arm_symbian_plt_entry);
|
||||
htab->symbian_p = 1;
|
||||
/* Symbian uses armv5t or above, so use_blx is always true. */
|
||||
htab->use_blx = 1;
|
||||
htab->root.is_relocatable_executable = 1;
|
||||
@ -21016,5 +21015,7 @@ elf32_arm_symbian_plt_sym_val (bfd_vma i, const asection *plt,
|
||||
#define elf_backend_dtrel_excludes_plt 0
|
||||
#undef ELF_MAXPAGESIZE
|
||||
#define ELF_MAXPAGESIZE 0x8000
|
||||
#undef ELF_TARGET_OS
|
||||
#define ELF_TARGET_OS is_symbian
|
||||
|
||||
#include "elf32-target.h"
|
||||
|
@ -843,14 +843,6 @@ static const struct elf_x86_non_lazy_plt_layout elf_i386_non_lazy_ibt_plt =
|
||||
#define PLTRESOLVE_RELOCS 2
|
||||
#define PLT_NON_JUMP_SLOT_RELOCS 2
|
||||
|
||||
/* These are the standard parameters. */
|
||||
static const struct elf_x86_backend_data elf_i386_arch_bed =
|
||||
{
|
||||
is_normal /* os */
|
||||
};
|
||||
|
||||
#define elf_backend_arch_data &elf_i386_arch_bed
|
||||
|
||||
/* Return TRUE if the TLS access code sequence support transition
|
||||
from R_TYPE. */
|
||||
|
||||
@ -2043,7 +2035,7 @@ elf_i386_relocate_section (bfd *output_bfd,
|
||||
local_tlsdesc_gotents = elf_x86_local_tlsdesc_gotent (input_bfd);
|
||||
/* We have to handle relocations in vxworks .tls_vars sections
|
||||
specially, because the dynamic loader is 'weird'. */
|
||||
is_vxworks_tls = (htab->target_os == is_vxworks
|
||||
is_vxworks_tls = (htab->elf.target_os == is_vxworks
|
||||
&& bfd_link_pic (info)
|
||||
&& !strcmp (input_section->output_section->name,
|
||||
".tls_vars"));
|
||||
@ -3597,7 +3589,7 @@ elf_i386_finish_dynamic_symbol (bfd *output_bfd,
|
||||
resolved_plt->contents + plt_offset
|
||||
+ htab->plt.plt_got_offset);
|
||||
|
||||
if (htab->target_os == is_vxworks)
|
||||
if (htab->elf.target_os == is_vxworks)
|
||||
{
|
||||
int s, k, reloc_index;
|
||||
|
||||
@ -4015,7 +4007,7 @@ elf_i386_finish_dynamic_sections (bfd *output_bfd,
|
||||
htab->elf.splt->contents
|
||||
+ htab->lazy_plt->plt0_got2_offset);
|
||||
|
||||
if (htab->target_os == is_vxworks)
|
||||
if (htab->elf.target_os == is_vxworks)
|
||||
{
|
||||
Elf_Internal_Rela rel;
|
||||
int num_plts = (htab->elf.splt->size
|
||||
@ -4156,7 +4148,7 @@ elf_i386_get_synthetic_symtab (bfd *abfd,
|
||||
lazy_plt = NULL;
|
||||
non_lazy_ibt_plt = NULL;
|
||||
lazy_ibt_plt = NULL;
|
||||
switch (get_elf_x86_backend_data (abfd)->target_os)
|
||||
switch (get_elf_backend_data (abfd)->target_os)
|
||||
{
|
||||
case is_normal:
|
||||
case is_solaris:
|
||||
@ -4170,6 +4162,8 @@ elf_i386_get_synthetic_symtab (bfd *abfd,
|
||||
case is_nacl:
|
||||
lazy_plt = &elf_i386_nacl_plt;
|
||||
break;
|
||||
default:
|
||||
abort ();
|
||||
}
|
||||
|
||||
got_addr = 0;
|
||||
@ -4316,7 +4310,7 @@ elf_i386_link_setup_gnu_properties (struct bfd_link_info *info)
|
||||
{
|
||||
struct elf_x86_init_table init_table;
|
||||
|
||||
switch (get_elf_x86_backend_data (info->output_bfd)->target_os)
|
||||
switch (get_elf_backend_data (info->output_bfd)->target_os)
|
||||
{
|
||||
case is_normal:
|
||||
case is_solaris:
|
||||
@ -4340,6 +4334,8 @@ elf_i386_link_setup_gnu_properties (struct bfd_link_info *info)
|
||||
init_table.lazy_ibt_plt = NULL;
|
||||
init_table.non_lazy_ibt_plt = NULL;
|
||||
break;
|
||||
default:
|
||||
abort ();
|
||||
}
|
||||
|
||||
init_table.r_info = elf32_r_info;
|
||||
@ -4443,13 +4439,8 @@ elf_i386_fbsd_init_file_header (bfd *abfd, struct bfd_link_info *info)
|
||||
#undef TARGET_LITTLE_NAME
|
||||
#define TARGET_LITTLE_NAME "elf32-i386-sol2"
|
||||
|
||||
static const struct elf_x86_backend_data elf_i386_solaris_arch_bed =
|
||||
{
|
||||
is_solaris /* os */
|
||||
};
|
||||
|
||||
#undef elf_backend_arch_data
|
||||
#define elf_backend_arch_data &elf_i386_solaris_arch_bed
|
||||
#undef ELF_TARGET_OS
|
||||
#define ELF_TARGET_OS is_solaris
|
||||
|
||||
/* Restore default: we cannot use ELFOSABI_SOLARIS, otherwise ELFOSABI_NONE
|
||||
objects won't be recognized. */
|
||||
@ -4575,9 +4566,7 @@ elf32_iamcu_elf_object_p (bfd *abfd)
|
||||
#undef ELF_MACHINE_CODE
|
||||
#define ELF_MACHINE_CODE EM_IAMCU
|
||||
|
||||
#undef elf_backend_arch_data
|
||||
#define elf_backend_arch_data &elf_i386_arch_bed
|
||||
|
||||
#undef ELF_TARGET_OS
|
||||
#undef ELF_OSABI
|
||||
|
||||
#undef elf32_bed
|
||||
@ -4704,7 +4693,7 @@ static const bfd_byte elf_i386_nacl_eh_frame_plt[] =
|
||||
|| PLT_FDE_LENGTH != 36 \
|
||||
|| PLT_FDE_START_OFFSET != 4 + PLT_CIE_LENGTH + 8 \
|
||||
|| PLT_FDE_LEN_OFFSET != 4 + PLT_CIE_LENGTH + 12)
|
||||
# error "Need elf_x86_backend_data parameters for eh_frame_plt offsets!"
|
||||
# error "Need PLT_CIE_LENGTH parameters for eh_frame_plt offsets!"
|
||||
#endif
|
||||
PLT_CIE_LENGTH, 0, 0, 0, /* CIE length */
|
||||
0, 0, 0, 0, /* CIE ID */
|
||||
@ -4764,11 +4753,6 @@ static const struct elf_x86_lazy_plt_layout elf_i386_nacl_plt =
|
||||
sizeof (elf_i386_nacl_eh_frame_plt) /* eh_frame_plt_size */
|
||||
};
|
||||
|
||||
static const struct elf_x86_backend_data elf_i386_nacl_arch_bed =
|
||||
{
|
||||
is_nacl /* os */
|
||||
};
|
||||
|
||||
static bfd_boolean
|
||||
elf32_i386_nacl_elf_object_p (bfd *abfd)
|
||||
{
|
||||
@ -4777,8 +4761,8 @@ elf32_i386_nacl_elf_object_p (bfd *abfd)
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
#undef elf_backend_arch_data
|
||||
#define elf_backend_arch_data &elf_i386_nacl_arch_bed
|
||||
#undef ELF_TARGET_OS
|
||||
#define ELF_TARGET_OS is_nacl
|
||||
|
||||
#undef elf_backend_object_p
|
||||
#define elf_backend_object_p elf32_i386_nacl_elf_object_p
|
||||
@ -4809,13 +4793,8 @@ elf32_i386_nacl_elf_object_p (bfd *abfd)
|
||||
#undef elf_backend_plt_alignment
|
||||
#define elf_backend_plt_alignment 4
|
||||
|
||||
static const struct elf_x86_backend_data elf_i386_vxworks_arch_bed =
|
||||
{
|
||||
is_vxworks /* os */
|
||||
};
|
||||
|
||||
#undef elf_backend_arch_data
|
||||
#define elf_backend_arch_data &elf_i386_vxworks_arch_bed
|
||||
#undef ELF_TARGET_OS
|
||||
#define ELF_TARGET_OS is_vxworks
|
||||
|
||||
#undef elf_backend_relocs_compatible
|
||||
#undef elf_backend_add_symbol_hook
|
||||
|
@ -2670,6 +2670,9 @@ mips_vxworks_final_write_processing (bfd *abfd)
|
||||
#define ELF_MAXPAGESIZE 0x1000
|
||||
#define ELF_COMMONPAGESIZE 0x1000
|
||||
|
||||
#undef ELF_TARGET_OS
|
||||
#define ELF_TARGET_OS is_vxworks
|
||||
|
||||
#undef elf_backend_want_got_plt
|
||||
#define elf_backend_want_got_plt 1
|
||||
#undef elf_backend_want_plt_sym
|
||||
|
@ -2195,9 +2195,6 @@ struct ppc_elf_link_hash_table
|
||||
/* The type of PLT we have chosen to use. */
|
||||
enum ppc_elf_plt_type plt_type;
|
||||
|
||||
/* True if the target system is VxWorks. */
|
||||
unsigned int is_vxworks:1;
|
||||
|
||||
/* Whether there exist local gnu indirect function resolvers,
|
||||
referenced by dynamic relocations. */
|
||||
unsigned int local_ifunc_resolver:1;
|
||||
@ -2335,7 +2332,7 @@ ppc_elf_create_got (bfd *abfd, struct bfd_link_info *info)
|
||||
return FALSE;
|
||||
|
||||
htab = ppc_elf_hash_table (info);
|
||||
if (!htab->is_vxworks)
|
||||
if (htab->elf.target_os != is_vxworks)
|
||||
{
|
||||
/* The powerpc .got has a blrl instruction in it. Mark it
|
||||
executable. */
|
||||
@ -2495,7 +2492,7 @@ ppc_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (htab->is_vxworks
|
||||
if (htab->elf.target_os == is_vxworks
|
||||
&& !elf_vxworks_create_dynamic_sections (abfd, info, &htab->srelplt2))
|
||||
return FALSE;
|
||||
|
||||
@ -2953,7 +2950,7 @@ ppc_elf_check_relocs (bfd *abfd,
|
||||
tls_type = 0;
|
||||
r_type = ELF32_R_TYPE (rel->r_info);
|
||||
ifunc = NULL;
|
||||
if (h == NULL && !htab->is_vxworks)
|
||||
if (h == NULL && htab->elf.target_os != is_vxworks)
|
||||
{
|
||||
Elf_Internal_Sym *isym = bfd_sym_from_r_symndx (&htab->sym_cache,
|
||||
abfd, r_symndx);
|
||||
@ -2992,7 +2989,7 @@ ppc_elf_check_relocs (bfd *abfd,
|
||||
}
|
||||
}
|
||||
|
||||
if (!htab->is_vxworks
|
||||
if (htab->elf.target_os != is_vxworks
|
||||
&& is_branch_reloc (r_type)
|
||||
&& h != NULL
|
||||
&& h == tga)
|
||||
@ -4798,7 +4795,7 @@ ppc_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
|
||||
|| (h->non_got_ref
|
||||
&& !h->ref_regular_nonweak
|
||||
&& !UNDEFWEAK_NO_DYNAMIC_RELOC (info, h)))
|
||||
&& !htab->is_vxworks
|
||||
&& htab->elf.target_os != is_vxworks
|
||||
&& !ppc_elf_hash_entry (h)->has_sda_refs
|
||||
&& !_bfd_elf_readonly_dynrelocs (h))
|
||||
{
|
||||
@ -4884,7 +4881,7 @@ ppc_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
|
||||
executable. */
|
||||
if (ELIMINATE_COPY_RELOCS
|
||||
&& !ppc_elf_hash_entry (h)->has_sda_refs
|
||||
&& !htab->is_vxworks
|
||||
&& htab->elf.target_os != is_vxworks
|
||||
&& !h->def_regular
|
||||
&& !alias_readonly_dynrelocs (h))
|
||||
return TRUE;
|
||||
@ -5181,7 +5178,7 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
|
||||
}
|
||||
}
|
||||
|
||||
if (htab->is_vxworks)
|
||||
if (htab->elf.target_os == is_vxworks)
|
||||
{
|
||||
struct elf_dyn_relocs **pp;
|
||||
|
||||
@ -5495,7 +5492,7 @@ ppc_elf_size_dynamic_sections (bfd *output_bfd,
|
||||
linker script /DISCARD/, so we'll be discarding
|
||||
the relocs too. */
|
||||
}
|
||||
else if (htab->is_vxworks
|
||||
else if (htab->elf.target_os == is_vxworks
|
||||
&& strcmp (p->sec->output_section->name,
|
||||
".tls_vars") == 0)
|
||||
{
|
||||
@ -5560,7 +5557,7 @@ ppc_elf_size_dynamic_sections (bfd *output_bfd,
|
||||
else
|
||||
*local_got = (bfd_vma) -1;
|
||||
|
||||
if (htab->is_vxworks)
|
||||
if (htab->elf.target_os == is_vxworks)
|
||||
continue;
|
||||
|
||||
/* Allocate space for calls to local STT_GNU_IFUNC syms in .iplt. */
|
||||
@ -5873,7 +5870,7 @@ ppc_elf_size_dynamic_sections (bfd *output_bfd,
|
||||
if (!add_dynamic_entry (DT_TEXTREL, 0))
|
||||
return FALSE;
|
||||
}
|
||||
if (htab->is_vxworks
|
||||
if (htab->elf.target_os == is_vxworks
|
||||
&& !elf_vxworks_add_dynamic_entries (output_bfd, info))
|
||||
return FALSE;
|
||||
}
|
||||
@ -6980,7 +6977,7 @@ ppc_elf_relocate_section (bfd *output_bfd,
|
||||
sym_hashes = elf_sym_hashes (input_bfd);
|
||||
/* We have to handle relocations in vxworks .tls_vars sections
|
||||
specially, because the dynamic loader is 'weird'. */
|
||||
is_vxworks_tls = (htab->is_vxworks && bfd_link_pic (info)
|
||||
is_vxworks_tls = (htab->elf.target_os == is_vxworks && bfd_link_pic (info)
|
||||
&& !strcmp (input_section->output_section->name,
|
||||
".tls_vars"));
|
||||
if (input_section->sec_info_type == SEC_INFO_TYPE_TARGET)
|
||||
@ -7512,7 +7509,7 @@ ppc_elf_relocate_section (bfd *output_bfd,
|
||||
}
|
||||
|
||||
ifunc = NULL;
|
||||
if (!htab->is_vxworks)
|
||||
if (htab->elf.target_os != is_vxworks)
|
||||
{
|
||||
struct plt_entry *ent;
|
||||
|
||||
@ -9884,7 +9881,7 @@ ppc_elf_finish_dynamic_sections (bfd *output_bfd,
|
||||
switch (dyn.d_tag)
|
||||
{
|
||||
case DT_PLTGOT:
|
||||
if (htab->is_vxworks)
|
||||
if (htab->elf.target_os == is_vxworks)
|
||||
s = htab->elf.sgotplt;
|
||||
else
|
||||
s = htab->elf.splt;
|
||||
@ -9916,7 +9913,7 @@ ppc_elf_finish_dynamic_sections (bfd *output_bfd,
|
||||
continue;
|
||||
|
||||
default:
|
||||
if (htab->is_vxworks
|
||||
if (htab->elf.target_os == is_vxworks
|
||||
&& elf_vxworks_finish_dynamic_entry (output_bfd, &dyn))
|
||||
break;
|
||||
continue;
|
||||
@ -9968,7 +9965,7 @@ ppc_elf_finish_dynamic_sections (bfd *output_bfd,
|
||||
}
|
||||
|
||||
/* Fill in the first entry in the VxWorks procedure linkage table. */
|
||||
if (htab->is_vxworks
|
||||
if (htab->elf.target_os == is_vxworks
|
||||
&& htab->elf.splt != NULL
|
||||
&& htab->elf.splt->size != 0
|
||||
&& htab->elf.splt->output_section != bfd_abs_section_ptr)
|
||||
@ -10377,6 +10374,9 @@ ppc_elf_finish_dynamic_sections (bfd *output_bfd,
|
||||
|
||||
#undef ELF_OSABI
|
||||
|
||||
#undef ELF_TARGET_OS
|
||||
#define ELF_TARGET_OS is_vxworks
|
||||
|
||||
/* VxWorks uses the elf default section flags for .plt. */
|
||||
static const struct bfd_elf_special_section *
|
||||
ppc_elf_vxworks_get_sec_type_attr (bfd *abfd, asection *sec)
|
||||
@ -10402,7 +10402,6 @@ ppc_elf_vxworks_link_hash_table_create (bfd *abfd)
|
||||
{
|
||||
struct ppc_elf_link_hash_table *htab
|
||||
= (struct ppc_elf_link_hash_table *)ret;
|
||||
htab->is_vxworks = 1;
|
||||
htab->plt_type = PLT_VXWORKS;
|
||||
htab->plt_entry_size = VXWORKS_PLT_ENTRY_SIZE;
|
||||
htab->plt_slot_size = VXWORKS_PLT_ENTRY_SIZE;
|
||||
|
@ -2182,9 +2182,6 @@ struct elf_sh_link_hash_table
|
||||
/* The type of PLT to use. */
|
||||
const struct elf_sh_plt_info *plt_info;
|
||||
|
||||
/* True if the target system is VxWorks. */
|
||||
bfd_boolean vxworks_p;
|
||||
|
||||
/* True if the target system uses FDPIC. */
|
||||
bfd_boolean fdpic_p;
|
||||
};
|
||||
@ -2258,7 +2255,6 @@ sh_elf_link_hash_table_create (bfd *abfd)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ret->vxworks_p = vxworks_object_p (abfd);
|
||||
ret->fdpic_p = fdpic_object_p (abfd);
|
||||
|
||||
return &ret->root.root;
|
||||
@ -2467,7 +2463,7 @@ sh_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
|
||||
}
|
||||
}
|
||||
|
||||
if (htab->vxworks_p)
|
||||
if (htab->root.target_os == is_vxworks)
|
||||
{
|
||||
if (!elf_vxworks_create_dynamic_sections (abfd, info, &htab->srelplt2))
|
||||
return FALSE;
|
||||
@ -2688,7 +2684,7 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
|
||||
/* We also need to make an entry in the .rel.plt section. */
|
||||
htab->root.srelplt->size += sizeof (Elf32_External_Rela);
|
||||
|
||||
if (htab->vxworks_p && !bfd_link_pic (info))
|
||||
if (htab->root.target_os == is_vxworks && !bfd_link_pic (info))
|
||||
{
|
||||
/* VxWorks executables have a second set of relocations
|
||||
for each PLT entry. They go in a separate relocation
|
||||
@ -2847,7 +2843,7 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
|
||||
}
|
||||
}
|
||||
|
||||
if (htab->vxworks_p)
|
||||
if (htab->root.target_os == is_vxworks)
|
||||
{
|
||||
struct elf_dyn_relocs **pp;
|
||||
|
||||
@ -3006,7 +3002,7 @@ sh_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
|
||||
linker script /DISCARD/, so we'll be discarding
|
||||
the relocs too. */
|
||||
}
|
||||
else if (htab->vxworks_p
|
||||
else if (htab->root.target_os == is_vxworks
|
||||
&& strcmp (p->sec->output_section->name,
|
||||
".tls_vars") == 0)
|
||||
{
|
||||
@ -3250,7 +3246,7 @@ sh_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
if (htab->vxworks_p
|
||||
if (htab->root.target_os == is_vxworks
|
||||
&& !elf_vxworks_add_dynamic_entries (output_bfd, info))
|
||||
return FALSE;
|
||||
}
|
||||
@ -3490,7 +3486,7 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
|
||||
|
||||
/* We have to handle relocations in vxworks .tls_vars sections
|
||||
specially, because the dynamic loader is 'weird'. */
|
||||
is_vxworks_tls = (htab && htab->vxworks_p && bfd_link_pic (info)
|
||||
is_vxworks_tls = (htab && htab->root.target_os == is_vxworks && bfd_link_pic (info)
|
||||
&& !strcmp (input_section->output_section->name,
|
||||
".tls_vars"));
|
||||
|
||||
@ -6080,7 +6076,7 @@ sh_elf_finish_dynamic_symbol (bfd *output_bfd, struct bfd_link_info *info,
|
||||
(splt->contents
|
||||
+ h->plt.offset
|
||||
+ plt_info->symbol_fields.got_entry));
|
||||
if (htab->vxworks_p)
|
||||
if (htab->root.target_os == is_vxworks)
|
||||
{
|
||||
unsigned int reachable_plts, plts_per_4k;
|
||||
int distance;
|
||||
@ -6161,7 +6157,7 @@ sh_elf_finish_dynamic_symbol (bfd *output_bfd, struct bfd_link_info *info,
|
||||
loc = srelplt->contents + plt_index * sizeof (Elf32_External_Rela);
|
||||
bfd_elf32_swap_reloca_out (output_bfd, &rel, loc);
|
||||
|
||||
if (htab->vxworks_p && !bfd_link_pic (info))
|
||||
if (htab->root.target_os == is_vxworks && !bfd_link_pic (info))
|
||||
{
|
||||
/* Create the .rela.plt.unloaded relocations for this PLT entry.
|
||||
Begin by pointing LOC to the first such relocation. */
|
||||
@ -6284,7 +6280,7 @@ sh_elf_finish_dynamic_symbol (bfd *output_bfd, struct bfd_link_info *info,
|
||||
_GLOBAL_OFFSET_TABLE_ is not absolute: it is relative to the
|
||||
".got" section. */
|
||||
if (h == htab->root.hdynamic
|
||||
|| (!htab->vxworks_p && h == htab->root.hgot))
|
||||
|| (htab->root.target_os != is_vxworks && h == htab->root.hgot))
|
||||
sym->st_shndx = SHN_ABS;
|
||||
|
||||
return TRUE;
|
||||
@ -6325,7 +6321,7 @@ sh_elf_finish_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info)
|
||||
switch (dyn.d_tag)
|
||||
{
|
||||
default:
|
||||
if (htab->vxworks_p
|
||||
if (htab->root.target_os == is_vxworks
|
||||
&& elf_vxworks_finish_dynamic_entry (output_bfd, &dyn))
|
||||
bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
|
||||
break;
|
||||
@ -6372,7 +6368,7 @@ sh_elf_finish_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info)
|
||||
(splt->contents
|
||||
+ htab->plt_info->plt0_got_fields[i]));
|
||||
|
||||
if (htab->vxworks_p)
|
||||
if (htab->root.target_os == is_vxworks)
|
||||
{
|
||||
/* Finalize the .rela.plt.unloaded contents. */
|
||||
Elf_Internal_Rela rel;
|
||||
@ -6773,6 +6769,9 @@ sh_elf_encode_eh_address (bfd *abfd,
|
||||
#define ELF_MAXPAGESIZE 0x1000
|
||||
#undef ELF_COMMONPAGESIZE
|
||||
|
||||
#undef ELF_TARGET_OS
|
||||
#define ELF_TARGET_OS is_vxworks
|
||||
|
||||
#include "elf32-target.h"
|
||||
|
||||
#endif /* not SH_TARGET_ALREADY_DEFINED */
|
||||
|
@ -309,25 +309,6 @@ elf32_sparc_copy_solaris_special_section_fields (const bfd *ibfd ATTRIBUTE_UNUSE
|
||||
|
||||
#include "elf32-target.h"
|
||||
|
||||
/* A wrapper around _bfd_sparc_elf_link_hash_table_create that identifies
|
||||
the target system as VxWorks. */
|
||||
|
||||
static struct bfd_link_hash_table *
|
||||
elf32_sparc_vxworks_link_hash_table_create (bfd *abfd)
|
||||
{
|
||||
struct bfd_link_hash_table *ret;
|
||||
|
||||
ret = _bfd_sparc_elf_link_hash_table_create (abfd);
|
||||
if (ret)
|
||||
{
|
||||
struct _bfd_sparc_elf_link_hash_table *htab;
|
||||
|
||||
htab = (struct _bfd_sparc_elf_link_hash_table *) ret;
|
||||
htab->is_vxworks = 1;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* A final_write_processing hook that does both the SPARC- and VxWorks-
|
||||
specific handling. */
|
||||
|
||||
@ -346,9 +327,8 @@ elf32_sparc_vxworks_final_write_processing (bfd *abfd)
|
||||
#undef ELF_MINPAGESIZE
|
||||
#define ELF_MINPAGESIZE 0x1000
|
||||
|
||||
#undef bfd_elf32_bfd_link_hash_table_create
|
||||
#define bfd_elf32_bfd_link_hash_table_create \
|
||||
elf32_sparc_vxworks_link_hash_table_create
|
||||
#undef ELF_TARGET_OS
|
||||
#define ELF_TARGET_OS is_vxworks
|
||||
|
||||
#undef elf_backend_want_got_plt
|
||||
#define elf_backend_want_got_plt 1
|
||||
|
@ -985,12 +985,6 @@ static const struct elf_x86_non_lazy_plt_layout elf_x32_non_lazy_ibt_plt =
|
||||
sizeof (elf_x86_64_eh_frame_non_lazy_plt) /* eh_frame_plt_size */
|
||||
};
|
||||
|
||||
static const struct elf_x86_backend_data elf_x86_64_arch_bed =
|
||||
{
|
||||
is_normal /* os */
|
||||
};
|
||||
|
||||
#define elf_backend_arch_data &elf_x86_64_arch_bed
|
||||
|
||||
static bfd_boolean
|
||||
elf64_x86_64_elf_object_p (bfd *abfd)
|
||||
@ -4797,7 +4791,7 @@ elf_x86_64_get_synthetic_symtab (bfd *abfd,
|
||||
if (relsize <= 0)
|
||||
return -1;
|
||||
|
||||
if (get_elf_x86_backend_data (abfd)->target_os != is_nacl)
|
||||
if (get_elf_backend_data (abfd)->target_os != is_nacl)
|
||||
{
|
||||
lazy_plt = &elf_x86_64_lazy_plt;
|
||||
non_lazy_plt = &elf_x86_64_non_lazy_plt;
|
||||
@ -5148,7 +5142,7 @@ elf_x86_64_link_setup_gnu_properties (struct bfd_link_info *info)
|
||||
/* This is unused for x86-64. */
|
||||
init_table.plt0_pad_byte = 0x90;
|
||||
|
||||
if (get_elf_x86_backend_data (info->output_bfd)->target_os != is_nacl)
|
||||
if (get_elf_backend_data (info->output_bfd)->target_os != is_nacl)
|
||||
{
|
||||
const struct elf_backend_data *bed
|
||||
= get_elf_backend_data (info->output_bfd);
|
||||
@ -5329,13 +5323,8 @@ elf_x86_64_special_sections[]=
|
||||
#undef TARGET_LITTLE_NAME
|
||||
#define TARGET_LITTLE_NAME "elf64-x86-64-sol2"
|
||||
|
||||
static const struct elf_x86_backend_data elf_x86_64_solaris_arch_bed =
|
||||
{
|
||||
is_solaris /* os */
|
||||
};
|
||||
|
||||
#undef elf_backend_arch_data
|
||||
#define elf_backend_arch_data &elf_x86_64_solaris_arch_bed
|
||||
#undef ELF_TARGET_OS
|
||||
#define ELF_TARGET_OS is_solaris
|
||||
|
||||
/* Restore default: we cannot use ELFOSABI_SOLARIS, otherwise ELFOSABI_NONE
|
||||
objects won't be recognized. */
|
||||
@ -5465,7 +5454,7 @@ static const bfd_byte elf_x86_64_nacl_eh_frame_plt[] =
|
||||
|| PLT_FDE_LENGTH != 36 \
|
||||
|| PLT_FDE_START_OFFSET != 4 + PLT_CIE_LENGTH + 8 \
|
||||
|| PLT_FDE_LEN_OFFSET != 4 + PLT_CIE_LENGTH + 12)
|
||||
# error "Need elf_x86_backend_data parameters for eh_frame_plt offsets!"
|
||||
# error "Need PLT_CIE_LENGTH parameters for eh_frame_plt offsets!"
|
||||
#endif
|
||||
PLT_CIE_LENGTH, 0, 0, 0, /* CIE length */
|
||||
0, 0, 0, 0, /* CIE ID */
|
||||
@ -5525,13 +5514,8 @@ static const struct elf_x86_lazy_plt_layout elf_x86_64_nacl_plt =
|
||||
sizeof (elf_x86_64_nacl_eh_frame_plt) /* eh_frame_plt_size */
|
||||
};
|
||||
|
||||
static const struct elf_x86_backend_data elf_x86_64_nacl_arch_bed =
|
||||
{
|
||||
is_nacl /* os */
|
||||
};
|
||||
|
||||
#undef elf_backend_arch_data
|
||||
#define elf_backend_arch_data &elf_x86_64_nacl_arch_bed
|
||||
#undef ELF_TARGET_OS
|
||||
#define ELF_TARGET_OS is_nacl
|
||||
|
||||
#undef elf_backend_object_p
|
||||
#define elf_backend_object_p elf64_x86_64_nacl_elf_object_p
|
||||
@ -5635,8 +5619,7 @@ elf64_l1om_elf_object_p (bfd *abfd)
|
||||
#define ELF_COMMONPAGESIZE 0x1000
|
||||
#undef elf_backend_plt_alignment
|
||||
#define elf_backend_plt_alignment 4
|
||||
#undef elf_backend_arch_data
|
||||
#define elf_backend_arch_data &elf_x86_64_arch_bed
|
||||
#undef ELF_TARGET_OS
|
||||
|
||||
#include "elf64-target.h"
|
||||
|
||||
|
@ -7804,6 +7804,7 @@ _bfd_elf_link_hash_table_init
|
||||
|
||||
table->root.type = bfd_link_elf_hash_table;
|
||||
table->hash_table_id = target_id;
|
||||
table->target_os = get_elf_backend_data (abfd)->target_os;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
120
bfd/elfxx-mips.c
120
bfd/elfxx-mips.c
@ -462,9 +462,6 @@ struct mips_elf_link_hash_table
|
||||
/* True if we are targetting R6 compact branches. */
|
||||
bfd_boolean compact_branches;
|
||||
|
||||
/* True if we're generating code for VxWorks. */
|
||||
bfd_boolean is_vxworks;
|
||||
|
||||
/* True if we already reported the small-data section overflow. */
|
||||
bfd_boolean small_data_overflow_reported;
|
||||
|
||||
@ -904,7 +901,8 @@ static bfd *reldyn_sorting_bfd;
|
||||
|
||||
/* The name of the dynamic relocation section. */
|
||||
#define MIPS_ELF_REL_DYN_NAME(INFO) \
|
||||
(mips_elf_hash_table (INFO)->is_vxworks ? ".rela.dyn" : ".rel.dyn")
|
||||
(mips_elf_hash_table (INFO)->root.target_os == is_vxworks \
|
||||
? ".rela.dyn" : ".rel.dyn")
|
||||
|
||||
/* In case we're on a 32-bit machine, construct a 64-bit "-1" value
|
||||
from smaller values. Start with zero, widen, *then* decrement. */
|
||||
@ -919,7 +917,8 @@ static bfd *reldyn_sorting_bfd;
|
||||
|
||||
/* The offset of $gp from the beginning of the .got section. */
|
||||
#define ELF_MIPS_GP_OFFSET(INFO) \
|
||||
(mips_elf_hash_table (INFO)->is_vxworks ? 0x0 : 0x7ff0)
|
||||
(mips_elf_hash_table (INFO)->root.target_os == is_vxworks \
|
||||
? 0x0 : 0x7ff0)
|
||||
|
||||
/* The maximum size of the GOT for it to be addressable using 16-bit
|
||||
offsets from $gp. */
|
||||
@ -3821,7 +3820,7 @@ mips_elf_create_local_got_entry (bfd *abfd, struct bfd_link_info *info,
|
||||
MIPS_ELF_PUT_WORD (abfd, value, htab->root.sgot->contents + entry->gotidx);
|
||||
|
||||
/* These GOT entries need a dynamic relocation on VxWorks. */
|
||||
if (htab->is_vxworks)
|
||||
if (htab->root.target_os == is_vxworks)
|
||||
{
|
||||
Elf_Internal_Rela outrel;
|
||||
asection *s;
|
||||
@ -4166,7 +4165,7 @@ mips_elf_allocate_dynamic_relocations (bfd *abfd, struct bfd_link_info *info,
|
||||
s = mips_elf_rel_dyn_section (info, FALSE);
|
||||
BFD_ASSERT (s != NULL);
|
||||
|
||||
if (htab->is_vxworks)
|
||||
if (htab->root.target_os == is_vxworks)
|
||||
s->size += n * MIPS_ELF_RELA_SIZE (abfd);
|
||||
else
|
||||
{
|
||||
@ -4552,7 +4551,7 @@ mips_elf_count_got_symbols (struct mips_elf_link_hash_entry *h, void *data)
|
||||
entry if it was only used for relocations; those relocations
|
||||
will be against the null or section symbol instead of H. */
|
||||
h->global_got_area = GGA_NONE;
|
||||
else if (htab->is_vxworks
|
||||
else if (htab->root.target_os == is_vxworks
|
||||
&& h->got_only_for_calls
|
||||
&& h->root.plt.plist->mips_offset != MINUS_ONE)
|
||||
/* On VxWorks, calls can refer directly to the .got.plt entry;
|
||||
@ -5266,7 +5265,7 @@ mips_elf_create_got_section (bfd *abfd, struct bfd_link_info *info)
|
||||
static bfd_boolean
|
||||
is_gott_symbol (struct bfd_link_info *info, struct elf_link_hash_entry *h)
|
||||
{
|
||||
return (mips_elf_hash_table (info)->is_vxworks
|
||||
return (mips_elf_hash_table (info)->root.target_os == is_vxworks
|
||||
&& bfd_link_pic (info)
|
||||
&& (strcmp (h->root.root.string, "__GOTT_BASE__") == 0
|
||||
|| strcmp (h->root.root.string, "__GOTT_INDEX__") == 0));
|
||||
@ -5904,7 +5903,7 @@ mips_elf_calculate_relocation (bfd *abfd, bfd *input_bfd,
|
||||
{
|
||||
/* On VxWorks, CALL relocations should refer to the .got.plt
|
||||
entry, which is initialized to point at the PLT stub. */
|
||||
if (htab->is_vxworks
|
||||
if (htab->root.target_os == is_vxworks
|
||||
&& (call_hi16_reloc_p (r_type)
|
||||
|| call_lo16_reloc_p (r_type)
|
||||
|| call16_reloc_p (r_type)))
|
||||
@ -5924,7 +5923,7 @@ mips_elf_calculate_relocation (bfd *abfd, bfd *input_bfd,
|
||||
MIPS_ELF_PUT_WORD (dynobj, symbol, htab->root.sgot->contents + g);
|
||||
}
|
||||
}
|
||||
else if (!htab->is_vxworks
|
||||
else if (htab->root.target_os != is_vxworks
|
||||
&& (call16_reloc_p (r_type) || got16_reloc_p (r_type)))
|
||||
/* The calculation below does not involve "g". */
|
||||
break;
|
||||
@ -6206,7 +6205,7 @@ mips_elf_calculate_relocation (bfd *abfd, bfd *input_bfd,
|
||||
case R_MICROMIPS_CALL16:
|
||||
/* VxWorks does not have separate local and global semantics for
|
||||
R_MIPS*_GOT16; every relocation evaluates to "G". */
|
||||
if (!htab->is_vxworks && local_p)
|
||||
if (htab->root.target_os != is_vxworks && local_p)
|
||||
{
|
||||
value = mips_elf_got16_entry (abfd, input_bfd, info,
|
||||
symbol + addend, !was_local_p);
|
||||
@ -6745,7 +6744,8 @@ mips_elf_create_dynamic_relocation (bfd *output_bfd,
|
||||
in the relocation. */
|
||||
if (h != NULL && ! SYMBOL_REFERENCES_LOCAL (info, &h->root))
|
||||
{
|
||||
BFD_ASSERT (htab->is_vxworks || h->global_got_area != GGA_NONE);
|
||||
BFD_ASSERT (htab->root.target_os == is_vxworks
|
||||
|| h->global_got_area != GGA_NONE);
|
||||
indx = h->root.dynindx;
|
||||
if (SGI_COMPAT (output_bfd))
|
||||
defined_p = h->root.def_regular;
|
||||
@ -6804,7 +6804,7 @@ mips_elf_create_dynamic_relocation (bfd *output_bfd,
|
||||
if (defined_p && r_type != R_MIPS_REL32)
|
||||
*addendp += symbol;
|
||||
|
||||
if (htab->is_vxworks)
|
||||
if (htab->root.target_os == is_vxworks)
|
||||
/* VxWorks uses non-relative relocations for this. */
|
||||
outrel[0].r_info = ELF32_R_INFO (indx, R_MIPS_32);
|
||||
else
|
||||
@ -6850,7 +6850,7 @@ mips_elf_create_dynamic_relocation (bfd *output_bfd,
|
||||
(sreloc->contents
|
||||
+ sreloc->reloc_count * sizeof (Elf64_Mips_External_Rel)));
|
||||
}
|
||||
else if (htab->is_vxworks)
|
||||
else if (htab->root.target_os == is_vxworks)
|
||||
{
|
||||
/* VxWorks uses RELA rather than REL dynamic relocations. */
|
||||
outrel[0].r_addend = *addendp;
|
||||
@ -7973,7 +7973,7 @@ _bfd_mips_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
|
||||
|
||||
/* The psABI requires a read-only .dynamic section, but the VxWorks
|
||||
EABI doesn't. */
|
||||
if (!htab->is_vxworks)
|
||||
if (htab->root.target_os != is_vxworks)
|
||||
{
|
||||
s = bfd_get_linker_section (abfd, ".dynamic");
|
||||
if (s != NULL)
|
||||
@ -8121,7 +8121,7 @@ _bfd_mips_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
|
||||
return FALSE;
|
||||
|
||||
/* Do the usual VxWorks handling. */
|
||||
if (htab->is_vxworks
|
||||
if (htab->root.target_os == is_vxworks
|
||||
&& !elf_vxworks_create_dynamic_sections (abfd, info, &htab->srelplt2))
|
||||
return FALSE;
|
||||
|
||||
@ -8723,7 +8723,8 @@ _bfd_mips_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
|
||||
elf_hash_table (info)->dynobj = dynobj = abfd;
|
||||
if (!mips_elf_create_got_section (dynobj, info))
|
||||
return FALSE;
|
||||
if (htab->is_vxworks && !bfd_link_pic (info))
|
||||
if (htab->root.target_os == is_vxworks
|
||||
&& !bfd_link_pic (info))
|
||||
{
|
||||
_bfd_error_handler
|
||||
/* xgettext:c-format */
|
||||
@ -8769,7 +8770,7 @@ _bfd_mips_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
|
||||
against a read-only section. */
|
||||
if ((bfd_link_pic (info)
|
||||
|| (h != NULL
|
||||
&& !htab->is_vxworks
|
||||
&& htab->root.target_os != is_vxworks
|
||||
&& strcmp (h->root.root.string, "__gnu_local_gp") != 0
|
||||
&& !(!info->nocopyreloc
|
||||
&& !PIC_OBJECT_P (abfd)
|
||||
@ -8811,7 +8812,8 @@ _bfd_mips_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
|
||||
relocations related to taking the function's address.
|
||||
This doesn't apply to VxWorks, where CALL relocs refer
|
||||
to a .got.plt entry instead of a normal .got entry. */
|
||||
if (!htab->is_vxworks && (!can_make_dynamic_p || !call_reloc_p))
|
||||
if (htab->root.target_os != is_vxworks
|
||||
&& (!can_make_dynamic_p || !call_reloc_p))
|
||||
((struct mips_elf_link_hash_entry *) h)->no_fn_stub = TRUE;
|
||||
}
|
||||
|
||||
@ -8836,7 +8838,8 @@ _bfd_mips_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
|
||||
else if (call_lo16_reloc_p (r_type)
|
||||
|| got_lo16_reloc_p (r_type)
|
||||
|| got_disp_reloc_p (r_type)
|
||||
|| (got16_reloc_p (r_type) && htab->is_vxworks))
|
||||
|| (got16_reloc_p (r_type)
|
||||
&& htab->root.target_os == is_vxworks))
|
||||
{
|
||||
/* We may need a local GOT entry for this relocation. We
|
||||
don't count R_MIPS_GOT_PAGE because we can estimate the
|
||||
@ -9200,7 +9203,7 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
|
||||
|
||||
/* VxWorks executables are handled elsewhere; we only need to
|
||||
allocate relocations in shared objects. */
|
||||
if (htab->is_vxworks && !bfd_link_pic (info))
|
||||
if (htab->root.target_os == is_vxworks && !bfd_link_pic (info))
|
||||
return TRUE;
|
||||
|
||||
/* Ignore indirect symbols. All relocations against such symbols
|
||||
@ -9245,7 +9248,7 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
|
||||
VxWorks does not enforce the same mapping between the GOT
|
||||
and the symbol table, so the same requirement does not
|
||||
apply there. */
|
||||
if (!htab->is_vxworks)
|
||||
if (htab->root.target_os != is_vxworks)
|
||||
{
|
||||
if (hmips->global_got_area > GGA_RELOC_ONLY)
|
||||
hmips->global_got_area = GGA_RELOC_ONLY;
|
||||
@ -9312,7 +9315,9 @@ _bfd_mips_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
|
||||
|
||||
Traditional stubs are only available on SVR4 psABI-based systems;
|
||||
VxWorks always uses PLTs instead. */
|
||||
if (!htab->is_vxworks && h->needs_plt && !hmips->no_fn_stub)
|
||||
if (htab->root.target_os != is_vxworks
|
||||
&& h->needs_plt
|
||||
&& !hmips->no_fn_stub)
|
||||
{
|
||||
if (! elf_hash_table (info)->dynamic_sections_created)
|
||||
return TRUE;
|
||||
@ -9361,7 +9366,7 @@ _bfd_mips_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
|
||||
entry is 16 bytes and the PLT0 entry is 32 bytes.
|
||||
Encourage better cache usage by aligning. We do this
|
||||
lazily to avoid pessimizing traditional objects. */
|
||||
if (!htab->is_vxworks
|
||||
if (htab->root.target_os != is_vxworks
|
||||
&& !bfd_set_section_alignment (htab->root.splt, 5))
|
||||
return FALSE;
|
||||
|
||||
@ -9373,21 +9378,23 @@ _bfd_mips_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
|
||||
|
||||
/* On non-VxWorks targets, the first two entries in .got.plt
|
||||
are reserved. */
|
||||
if (!htab->is_vxworks)
|
||||
if (htab->root.target_os != is_vxworks)
|
||||
htab->plt_got_index
|
||||
+= (get_elf_backend_data (dynobj)->got_header_size
|
||||
/ MIPS_ELF_GOT_SIZE (dynobj));
|
||||
|
||||
/* On VxWorks, also allocate room for the header's
|
||||
.rela.plt.unloaded entries. */
|
||||
if (htab->is_vxworks && !bfd_link_pic (info))
|
||||
if (htab->root.target_os == is_vxworks
|
||||
&& !bfd_link_pic (info))
|
||||
htab->srelplt2->size += 2 * sizeof (Elf32_External_Rela);
|
||||
|
||||
/* Now work out the sizes of individual PLT entries. */
|
||||
if (htab->is_vxworks && bfd_link_pic (info))
|
||||
if (htab->root.target_os == is_vxworks
|
||||
&& bfd_link_pic (info))
|
||||
htab->plt_mips_entry_size
|
||||
= 4 * ARRAY_SIZE (mips_vxworks_shared_plt_entry);
|
||||
else if (htab->is_vxworks)
|
||||
else if (htab->root.target_os == is_vxworks)
|
||||
htab->plt_mips_entry_size
|
||||
= 4 * ARRAY_SIZE (mips_vxworks_exec_plt_entry);
|
||||
else if (newabi_p)
|
||||
@ -9430,7 +9437,7 @@ _bfd_mips_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
|
||||
standard entry actually has to be used as the stub ends with a J
|
||||
instruction. */
|
||||
if (newabi_p
|
||||
|| htab->is_vxworks
|
||||
|| htab->root.target_os == is_vxworks
|
||||
|| hmips->call_stub
|
||||
|| hmips->call_fp_stub)
|
||||
{
|
||||
@ -9472,12 +9479,12 @@ _bfd_mips_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
|
||||
hmips->use_plt_entry = TRUE;
|
||||
|
||||
/* Make room for the R_MIPS_JUMP_SLOT relocation. */
|
||||
htab->root.srelplt->size += (htab->is_vxworks
|
||||
htab->root.srelplt->size += (htab->root.target_os == is_vxworks
|
||||
? MIPS_ELF_RELA_SIZE (dynobj)
|
||||
: MIPS_ELF_REL_SIZE (dynobj));
|
||||
|
||||
/* Make room for the .rela.plt.unloaded relocations. */
|
||||
if (htab->is_vxworks && !bfd_link_pic (info))
|
||||
if (htab->root.target_os == is_vxworks && !bfd_link_pic (info))
|
||||
htab->srelplt2->size += 3 * sizeof (Elf32_External_Rela);
|
||||
|
||||
/* All relocations against this symbol that could have been made
|
||||
@ -9542,7 +9549,7 @@ _bfd_mips_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
|
||||
}
|
||||
if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
|
||||
{
|
||||
if (htab->is_vxworks)
|
||||
if (htab->root.target_os == is_vxworks)
|
||||
srel->size += sizeof (Elf32_External_Rela);
|
||||
else
|
||||
mips_elf_allocate_dynamic_relocations (dynobj, info, 1);
|
||||
@ -9625,7 +9632,7 @@ mips_elf_lay_out_got (bfd *output_bfd, struct bfd_link_info *info)
|
||||
/* Allocate room for the reserved entries. VxWorks always reserves
|
||||
3 entries; other objects only reserve 2 entries. */
|
||||
BFD_ASSERT (g->assigned_low_gotno == 0);
|
||||
if (htab->is_vxworks)
|
||||
if (htab->root.target_os == is_vxworks)
|
||||
htab->reserved_gotno = 3;
|
||||
else
|
||||
htab->reserved_gotno = 2;
|
||||
@ -9657,7 +9664,7 @@ mips_elf_lay_out_got (bfd *output_bfd, struct bfd_link_info *info)
|
||||
}
|
||||
}
|
||||
|
||||
if (htab->is_vxworks)
|
||||
if (htab->root.target_os == is_vxworks)
|
||||
/* There's no need to allocate page entries for VxWorks; R_MIPS*_GOT16
|
||||
relocations against local symbols evaluate to "G", and the EABI does
|
||||
not include R_MIPS_GOT_PAGE. */
|
||||
@ -9682,7 +9689,8 @@ mips_elf_lay_out_got (bfd *output_bfd, struct bfd_link_info *info)
|
||||
/* VxWorks does not support multiple GOTs. It initializes $gp to
|
||||
__GOTT_BASE__[__GOTT_INDEX__], the value of which is set by the
|
||||
dynamic loader. */
|
||||
if (!htab->is_vxworks && s->size > MIPS_ELF_GOT_MAX_SIZE (info))
|
||||
if (htab->root.target_os != is_vxworks
|
||||
&& s->size > MIPS_ELF_GOT_MAX_SIZE (info))
|
||||
{
|
||||
if (!mips_elf_multi_got (output_bfd, info, s, page_gotno))
|
||||
return FALSE;
|
||||
@ -9708,7 +9716,7 @@ mips_elf_lay_out_got (bfd *output_bfd, struct bfd_link_info *info)
|
||||
== g->global_gotno + g->local_gotno + g->tls_gotno);
|
||||
|
||||
/* Each VxWorks GOT entry needs an explicit relocation. */
|
||||
if (htab->is_vxworks && bfd_link_pic (info))
|
||||
if (htab->root.target_os == is_vxworks && bfd_link_pic (info))
|
||||
g->relocs += g->global_gotno + g->local_gotno - htab->reserved_gotno;
|
||||
|
||||
/* Allocate room for the TLS relocations. */
|
||||
@ -9890,7 +9898,7 @@ mips_elf_set_plt_sym_value (struct mips_elf_link_hash_entry *h, void *data)
|
||||
/* For VxWorks, point at the PLT load stub rather than the lazy
|
||||
resolution stub; this stub will become the canonical function
|
||||
address. */
|
||||
if (htab->is_vxworks)
|
||||
if (htab->root.target_os == is_vxworks)
|
||||
val += 8;
|
||||
|
||||
h->root.root.u.def.section = htab->root.splt;
|
||||
@ -9955,9 +9963,9 @@ _bfd_mips_elf_size_dynamic_sections (bfd *output_bfd,
|
||||
BFD_ASSERT (htab->root.sgotplt->size == 0);
|
||||
BFD_ASSERT (htab->root.splt->size == 0);
|
||||
|
||||
if (htab->is_vxworks && bfd_link_pic (info))
|
||||
if (htab->root.target_os == is_vxworks && bfd_link_pic (info))
|
||||
size = 4 * ARRAY_SIZE (mips_vxworks_shared_plt0_entry);
|
||||
else if (htab->is_vxworks)
|
||||
else if (htab->root.target_os == is_vxworks)
|
||||
size = 4 * ARRAY_SIZE (mips_vxworks_exec_plt0_entry);
|
||||
else if (ABI_64_P (output_bfd))
|
||||
size = 4 * ARRAY_SIZE (mips_n64_exec_plt0_entry);
|
||||
@ -10073,7 +10081,8 @@ _bfd_mips_elf_size_dynamic_sections (bfd *output_bfd,
|
||||
room for an extra nop to fill the delay slot. This is
|
||||
for CPUs without load interlocking. */
|
||||
if (! LOAD_INTERLOCKS_P (output_bfd)
|
||||
&& ! htab->is_vxworks && s->size > 0)
|
||||
&& htab->root.target_os != is_vxworks
|
||||
&& s->size > 0)
|
||||
s->size += 4;
|
||||
}
|
||||
else if (! CONST_STRNEQ (name, ".init")
|
||||
@ -10131,7 +10140,9 @@ _bfd_mips_elf_size_dynamic_sections (bfd *output_bfd,
|
||||
&& !MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_DEBUG, 0))
|
||||
return FALSE;
|
||||
|
||||
if (reltext && (SGI_COMPAT (output_bfd) || htab->is_vxworks))
|
||||
if (reltext
|
||||
&& (SGI_COMPAT (output_bfd)
|
||||
|| htab->root.target_os == is_vxworks))
|
||||
info->flags |= DF_TEXTREL;
|
||||
|
||||
if ((info->flags & DF_TEXTREL) != 0)
|
||||
@ -10150,7 +10161,7 @@ _bfd_mips_elf_size_dynamic_sections (bfd *output_bfd,
|
||||
return FALSE;
|
||||
|
||||
sreldyn = mips_elf_rel_dyn_section (info, FALSE);
|
||||
if (htab->is_vxworks)
|
||||
if (htab->root.target_os == is_vxworks)
|
||||
{
|
||||
/* VxWorks uses .rela.dyn instead of .rel.dyn. It does not
|
||||
use any of the DT_MIPS_* tags. */
|
||||
@ -10230,7 +10241,7 @@ _bfd_mips_elf_size_dynamic_sections (bfd *output_bfd,
|
||||
if (! MIPS_ELF_ADD_DYNAMIC_ENTRY (info, DT_MIPS_PLTGOT, 0))
|
||||
return FALSE;
|
||||
}
|
||||
if (htab->is_vxworks
|
||||
if (htab->root.target_os == is_vxworks
|
||||
&& !elf_vxworks_add_dynamic_entries (output_bfd, info))
|
||||
return FALSE;
|
||||
}
|
||||
@ -10872,7 +10883,7 @@ _bfd_mips_elf_finish_dynamic_symbol (bfd *output_bfd,
|
||||
dynobj = elf_hash_table (info)->dynobj;
|
||||
hmips = (struct mips_elf_link_hash_entry *) h;
|
||||
|
||||
BFD_ASSERT (!htab->is_vxworks);
|
||||
BFD_ASSERT (htab->root.target_os != is_vxworks);
|
||||
|
||||
if (h->plt.plist != NULL
|
||||
&& (h->plt.plist->mips_offset != MINUS_ONE
|
||||
@ -11808,7 +11819,7 @@ _bfd_mips_elf_finish_dynamic_sections (bfd *output_bfd,
|
||||
break;
|
||||
|
||||
case DT_RELAENT:
|
||||
BFD_ASSERT (htab->is_vxworks);
|
||||
BFD_ASSERT (htab->root.target_os == is_vxworks);
|
||||
dyn.d_un.d_val = MIPS_ELF_RELA_SIZE (dynobj);
|
||||
break;
|
||||
|
||||
@ -11947,7 +11958,7 @@ _bfd_mips_elf_finish_dynamic_sections (bfd *output_bfd,
|
||||
|
||||
case DT_PLTREL:
|
||||
BFD_ASSERT (htab->use_plts_and_copy_relocs);
|
||||
if (htab->is_vxworks)
|
||||
if (htab->root.target_os == is_vxworks)
|
||||
dyn.d_un.d_val = DT_RELA;
|
||||
else
|
||||
dyn.d_un.d_val = DT_REL;
|
||||
@ -11991,7 +12002,7 @@ _bfd_mips_elf_finish_dynamic_sections (bfd *output_bfd,
|
||||
|
||||
default:
|
||||
swap_out_p = FALSE;
|
||||
if (htab->is_vxworks
|
||||
if (htab->root.target_os == is_vxworks
|
||||
&& elf_vxworks_finish_dynamic_entry (output_bfd, &dyn))
|
||||
swap_out_p = TRUE;
|
||||
break;
|
||||
@ -12016,7 +12027,7 @@ _bfd_mips_elf_finish_dynamic_sections (bfd *output_bfd,
|
||||
if (sgot != NULL && sgot->size > 0
|
||||
&& !bfd_is_abs_section (sgot->output_section))
|
||||
{
|
||||
if (htab->is_vxworks)
|
||||
if (htab->root.target_os == is_vxworks)
|
||||
{
|
||||
/* The first entry of the global offset table points to the
|
||||
".dynamic" section. The second is initialized by the
|
||||
@ -12179,7 +12190,7 @@ _bfd_mips_elf_finish_dynamic_sections (bfd *output_bfd,
|
||||
increasing order of r_symndx. The VxWorks EABI doesn't require
|
||||
this, and because the code below handles REL rather than RELA
|
||||
relocations, using it for VxWorks would be outright harmful. */
|
||||
if (!htab->is_vxworks)
|
||||
if (htab->root.target_os != is_vxworks)
|
||||
{
|
||||
s = mips_elf_rel_dyn_section (info, FALSE);
|
||||
if (s != NULL
|
||||
@ -12201,7 +12212,7 @@ _bfd_mips_elf_finish_dynamic_sections (bfd *output_bfd,
|
||||
|
||||
if (htab->root.splt && htab->root.splt->size > 0)
|
||||
{
|
||||
if (htab->is_vxworks)
|
||||
if (htab->root.target_os == is_vxworks)
|
||||
{
|
||||
if (bfd_link_pic (info))
|
||||
mips_vxworks_finish_shared_plt (output_bfd, info);
|
||||
@ -14303,7 +14314,6 @@ _bfd_mips_vxworks_link_hash_table_create (bfd *abfd)
|
||||
|
||||
htab = (struct mips_elf_link_hash_table *) ret;
|
||||
htab->use_plts_and_copy_relocs = TRUE;
|
||||
htab->is_vxworks = TRUE;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
@ -14682,7 +14692,7 @@ _bfd_mips_elf_final_link (bfd *abfd, struct bfd_link_info *info)
|
||||
elf_gp (abfd) = (h->u.def.value
|
||||
+ h->u.def.section->output_section->vma
|
||||
+ h->u.def.section->output_offset);
|
||||
else if (htab->is_vxworks
|
||||
else if (htab->root.target_os == is_vxworks
|
||||
&& (h = bfd_link_hash_lookup (info->hash,
|
||||
"_GLOBAL_OFFSET_TABLE_",
|
||||
FALSE, FALSE, TRUE))
|
||||
@ -16637,7 +16647,9 @@ _bfd_mips_init_file_header (bfd *abfd, struct bfd_link_info *link_info)
|
||||
BFD_ASSERT (htab != NULL);
|
||||
}
|
||||
|
||||
if (htab != NULL && htab->use_plts_and_copy_relocs && !htab->is_vxworks)
|
||||
if (htab != NULL
|
||||
&& htab->use_plts_and_copy_relocs
|
||||
&& htab->root.target_os != is_vxworks)
|
||||
i_ehdrp->e_ident[EI_ABIVERSION] = MIPS_LIBC_ABI_MIPS_PLT;
|
||||
|
||||
if (mips_elf_tdata (abfd)->abiflags.fp_abi == Val_GNU_MIPS_ABI_FP_64
|
||||
|
@ -1216,7 +1216,7 @@ _bfd_sparc_elf_create_dynamic_sections (bfd *dynobj,
|
||||
if (!_bfd_elf_create_dynamic_sections (dynobj, info))
|
||||
return FALSE;
|
||||
|
||||
if (htab->is_vxworks)
|
||||
if (htab->elf.target_os == is_vxworks)
|
||||
{
|
||||
if (!elf_vxworks_create_dynamic_sections (dynobj, info, &htab->srelplt2))
|
||||
return FALSE;
|
||||
@ -2076,7 +2076,8 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void * inf)
|
||||
s->size = htab->plt_header_size;
|
||||
|
||||
/* Allocate space for the .rela.plt.unloaded relocations. */
|
||||
if (htab->is_vxworks && !bfd_link_pic (info))
|
||||
if (htab->elf.target_os == is_vxworks
|
||||
&& !bfd_link_pic (info))
|
||||
htab->srelplt2->size = sizeof (Elf32_External_Rela) * 2;
|
||||
}
|
||||
|
||||
@ -2128,7 +2129,7 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void * inf)
|
||||
htab->elf.irelplt->size += SPARC_ELF_RELA_BYTES (htab);
|
||||
}
|
||||
|
||||
if (htab->is_vxworks)
|
||||
if (htab->elf.target_os == is_vxworks)
|
||||
{
|
||||
/* Allocate space for the .got.plt entry. */
|
||||
htab->elf.sgotplt->size += 4;
|
||||
@ -2231,7 +2232,7 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void * inf)
|
||||
}
|
||||
}
|
||||
|
||||
if (htab->is_vxworks)
|
||||
if (htab->elf.target_os == is_vxworks)
|
||||
{
|
||||
struct elf_dyn_relocs **pp;
|
||||
|
||||
@ -2433,7 +2434,7 @@ _bfd_sparc_elf_size_dynamic_sections (bfd *output_bfd,
|
||||
linker script /DISCARD/, so we'll be discarding
|
||||
the relocs too. */
|
||||
}
|
||||
else if (htab->is_vxworks
|
||||
else if (htab->elf.target_os == is_vxworks
|
||||
&& strcmp (p->sec->output_section->name,
|
||||
".tls_vars") == 0)
|
||||
{
|
||||
@ -2503,7 +2504,7 @@ _bfd_sparc_elf_size_dynamic_sections (bfd *output_bfd,
|
||||
htab_traverse (htab->loc_hash_table, allocate_local_dynrelocs, info);
|
||||
|
||||
if (! ABI_64_P (output_bfd)
|
||||
&& !htab->is_vxworks
|
||||
&& htab->elf.target_os != is_vxworks
|
||||
&& elf_hash_table (info)->dynamic_sections_created)
|
||||
{
|
||||
/* Make space for the trailing nop in .plt. */
|
||||
@ -2829,7 +2830,8 @@ _bfd_sparc_elf_relocate_section (bfd *output_bfd,
|
||||
sreloc = elf_section_data (input_section)->sreloc;
|
||||
/* We have to handle relocations in vxworks .tls_vars sections
|
||||
specially, because the dynamic loader is 'weird'. */
|
||||
is_vxworks_tls = (htab->is_vxworks && bfd_link_pic (info)
|
||||
is_vxworks_tls = (htab->elf.target_os == is_vxworks
|
||||
&& bfd_link_pic (info)
|
||||
&& !strcmp (input_section->output_section->name,
|
||||
".tls_vars"));
|
||||
|
||||
@ -4272,7 +4274,7 @@ _bfd_sparc_elf_finish_dynamic_symbol (bfd *output_bfd,
|
||||
abort ();
|
||||
|
||||
/* Fill in the entry in the .rela.plt section. */
|
||||
if (htab->is_vxworks)
|
||||
if (htab->elf.target_os == is_vxworks)
|
||||
{
|
||||
/* Work out the index of this PLT entry. */
|
||||
rela_index = ((h->plt.offset - htab->plt_header_size)
|
||||
@ -4474,7 +4476,7 @@ _bfd_sparc_elf_finish_dynamic_symbol (bfd *output_bfd,
|
||||
".got" section. Likewise _PROCEDURE_LINKAGE_TABLE_ and ".plt". */
|
||||
if (sym != NULL
|
||||
&& (h == htab->elf.hdynamic
|
||||
|| (!htab->is_vxworks
|
||||
|| (htab->elf.target_os != is_vxworks
|
||||
&& (h == htab->elf.hgot || h == htab->elf.hplt))))
|
||||
sym->st_shndx = SHN_ABS;
|
||||
|
||||
@ -4508,7 +4510,7 @@ sparc_finish_dyn (bfd *output_bfd, struct bfd_link_info *info,
|
||||
|
||||
bed->s->swap_dyn_in (dynobj, dyncon, &dyn);
|
||||
|
||||
if (htab->is_vxworks && dyn.d_tag == DT_PLTGOT)
|
||||
if (htab->elf.target_os == is_vxworks && dyn.d_tag == DT_PLTGOT)
|
||||
{
|
||||
/* On VxWorks, DT_PLTGOT should point to the start of the GOT,
|
||||
not to the start of the PLT. */
|
||||
@ -4519,7 +4521,7 @@ sparc_finish_dyn (bfd *output_bfd, struct bfd_link_info *info,
|
||||
bed->s->swap_dyn_out (output_bfd, &dyn, dyncon);
|
||||
}
|
||||
}
|
||||
else if (htab->is_vxworks
|
||||
else if (htab->elf.target_os == is_vxworks
|
||||
&& elf_vxworks_finish_dynamic_entry (output_bfd, &dyn))
|
||||
bed->s->swap_dyn_out (output_bfd, &dyn, dyncon);
|
||||
else if (abi_64_p && dyn.d_tag == DT_SPARC_REGISTER)
|
||||
@ -4744,7 +4746,7 @@ _bfd_sparc_elf_finish_dynamic_sections (bfd *output_bfd, struct bfd_link_info *i
|
||||
/* Initialize the contents of the .plt section. */
|
||||
if (splt->size > 0)
|
||||
{
|
||||
if (htab->is_vxworks)
|
||||
if (htab->elf.target_os == is_vxworks)
|
||||
{
|
||||
if (bfd_link_pic (info))
|
||||
sparc_vxworks_finish_shared_plt (output_bfd, info);
|
||||
@ -4762,7 +4764,8 @@ _bfd_sparc_elf_finish_dynamic_sections (bfd *output_bfd, struct bfd_link_info *i
|
||||
|
||||
if (elf_section_data (splt->output_section) != NULL)
|
||||
elf_section_data (splt->output_section)->this_hdr.sh_entsize
|
||||
= ((htab->is_vxworks || !ABI_64_P (output_bfd))
|
||||
= ((htab->elf.target_os == is_vxworks
|
||||
|| !ABI_64_P (output_bfd))
|
||||
? 0 : htab->plt_entry_size);
|
||||
}
|
||||
|
||||
|
@ -362,6 +362,10 @@
|
||||
#define ELF_TARGET_ID GENERIC_ELF_DATA
|
||||
#endif
|
||||
|
||||
#ifndef ELF_TARGET_OS
|
||||
#define ELF_TARGET_OS is_normal
|
||||
#endif
|
||||
|
||||
#ifndef ELF_OSABI
|
||||
#define ELF_OSABI ELFOSABI_NONE
|
||||
#endif
|
||||
@ -799,6 +803,7 @@ static struct elf_backend_data elfNN_bed =
|
||||
{
|
||||
ELF_ARCH, /* arch */
|
||||
ELF_TARGET_ID, /* target_id */
|
||||
ELF_TARGET_OS, /* target_os */
|
||||
ELF_MACHINE_CODE, /* elf_machine_code */
|
||||
ELF_OSABI, /* elf_osabi */
|
||||
ELF_MAXPAGESIZE, /* maxpagesize */
|
||||
|
@ -260,7 +260,7 @@ elf_x86_allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
|
||||
}
|
||||
}
|
||||
|
||||
if (htab->target_os == is_vxworks && !bfd_link_pic (info))
|
||||
if (htab->elf.target_os == is_vxworks && !bfd_link_pic (info))
|
||||
{
|
||||
/* VxWorks has a second set of relocations for each PLT entry
|
||||
in executables. They go in a separate relocation section,
|
||||
@ -407,7 +407,7 @@ elf_x86_allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
|
||||
}
|
||||
}
|
||||
|
||||
if (htab->target_os == is_vxworks)
|
||||
if (htab->elf.target_os == is_vxworks)
|
||||
{
|
||||
struct elf_dyn_relocs **pp;
|
||||
for (pp = &h->dyn_relocs; (p = *pp) != NULL; )
|
||||
@ -762,7 +762,6 @@ _bfd_x86_elf_link_hash_table_create (bfd *abfd)
|
||||
ret->tls_get_addr = "___tls_get_addr";
|
||||
}
|
||||
}
|
||||
ret->target_os = get_elf_x86_backend_data (abfd)->target_os;
|
||||
|
||||
ret->loc_hash_table = htab_try_create (1024,
|
||||
_bfd_x86_elf_local_htab_hash,
|
||||
@ -1045,7 +1044,7 @@ _bfd_x86_elf_size_dynamic_sections (bfd *output_bfd,
|
||||
linker script /DISCARD/, so we'll be discarding
|
||||
the relocs too. */
|
||||
}
|
||||
else if (htab->target_os == is_vxworks
|
||||
else if (htab->elf.target_os == is_vxworks
|
||||
&& strcmp (p->sec->output_section->name,
|
||||
".tls_vars") == 0)
|
||||
{
|
||||
@ -1203,7 +1202,8 @@ _bfd_x86_elf_size_dynamic_sections (bfd *output_bfd,
|
||||
htab->elf.sgotplt->size = 0;
|
||||
/* Solaris requires to keep _GLOBAL_OFFSET_TABLE_ even if it
|
||||
isn't used. */
|
||||
if (htab->elf.hgot != NULL && htab->target_os != is_solaris)
|
||||
if (htab->elf.hgot != NULL
|
||||
&& htab->elf.target_os != is_solaris)
|
||||
{
|
||||
/* Remove the unused _GLOBAL_OFFSET_TABLE_ from symbol
|
||||
table. */
|
||||
@ -1430,7 +1430,7 @@ _bfd_x86_elf_size_dynamic_sections (bfd *output_bfd,
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
if (htab->target_os == is_vxworks
|
||||
if (htab->elf.target_os == is_vxworks
|
||||
&& !elf_vxworks_add_dynamic_entries (output_bfd, info))
|
||||
return FALSE;
|
||||
}
|
||||
@ -1522,7 +1522,7 @@ _bfd_x86_elf_finish_dynamic_sections (bfd *output_bfd,
|
||||
switch (dyn.d_tag)
|
||||
{
|
||||
default:
|
||||
if (htab->target_os == is_vxworks
|
||||
if (htab->elf.target_os == is_vxworks
|
||||
&& elf_vxworks_finish_dynamic_entry (output_bfd, &dyn))
|
||||
break;
|
||||
continue;
|
||||
@ -1987,7 +1987,7 @@ _bfd_x86_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
|
||||
if (ELIMINATE_COPY_RELOCS
|
||||
&& (bed->target_id == X86_64_ELF_DATA
|
||||
|| (!eh->gotoff_ref
|
||||
&& htab->target_os != is_vxworks)))
|
||||
&& htab->elf.target_os != is_vxworks)))
|
||||
{
|
||||
/* If we don't find any dynamic relocs in read-only sections,
|
||||
then we'll be keeping the dynamic relocs and avoiding the copy
|
||||
@ -2762,7 +2762,7 @@ _bfd_x86_elf_link_setup_gnu_properties
|
||||
still be used with LD_AUDIT or LD_PROFILE if PLT entry is used for
|
||||
canonical function address. */
|
||||
htab->plt.has_plt0 = 1;
|
||||
normal_target = htab->target_os == is_normal;
|
||||
normal_target = htab->elf.target_os == is_normal;
|
||||
|
||||
if (normal_target)
|
||||
{
|
||||
@ -2825,7 +2825,7 @@ _bfd_x86_elf_link_setup_gnu_properties
|
||||
htab->plt.eh_frame_plt = htab->lazy_plt->eh_frame_plt;
|
||||
}
|
||||
|
||||
if (htab->target_os == is_vxworks
|
||||
if (htab->elf.target_os == is_vxworks
|
||||
&& !elf_vxworks_create_dynamic_sections (dynobj, info,
|
||||
&htab->srelplt2))
|
||||
{
|
||||
|
@ -436,14 +436,6 @@ struct elf_x86_plt_layout
|
||||
#define elf_x86_hash_entry(ent) \
|
||||
((struct elf_x86_link_hash_entry *)(ent))
|
||||
|
||||
enum elf_x86_target_os
|
||||
{
|
||||
is_normal,
|
||||
is_solaris,
|
||||
is_vxworks,
|
||||
is_nacl
|
||||
};
|
||||
|
||||
/* x86 ELF linker hash table. */
|
||||
|
||||
struct elf_x86_link_hash_table
|
||||
@ -531,7 +523,6 @@ struct elf_x86_link_hash_table
|
||||
bfd_vma (*r_info) (bfd_vma, bfd_vma);
|
||||
bfd_vma (*r_sym) (bfd_vma);
|
||||
bfd_boolean (*is_reloc_section) (const char *);
|
||||
enum elf_x86_target_os target_os;
|
||||
unsigned int sizeof_reloc;
|
||||
unsigned int dt_reloc;
|
||||
unsigned int dt_reloc_sz;
|
||||
@ -546,18 +537,6 @@ struct elf_x86_link_hash_table
|
||||
struct elf_linker_x86_params *params;
|
||||
};
|
||||
|
||||
/* Architecture-specific backend data for x86. */
|
||||
|
||||
struct elf_x86_backend_data
|
||||
{
|
||||
/* Target system. */
|
||||
enum elf_x86_target_os target_os;
|
||||
};
|
||||
|
||||
#define get_elf_x86_backend_data(abfd) \
|
||||
((const struct elf_x86_backend_data *) \
|
||||
get_elf_backend_data (abfd)->arch_data)
|
||||
|
||||
struct elf_x86_init_table
|
||||
{
|
||||
/* The lazy PLT layout. */
|
||||
|
Loading…
x
Reference in New Issue
Block a user